#!/bin/ksh #DEBUG #set -x # RESPECT IDENTATION OF 2 CHARS FOR TABS. VERSION="2.8.4" # Last modification 12-15-2008 ECHO="/usr/bin/echo" AWK="/usr/bin/awk" NAWK="/usr/bin/nawk" DATE="/usr/bin/date" trap "$ECHO; $ECHO Guds is exiting; /usr/bin/kill -9 0" 1 2 3 4 5 10 12 15 # Force locale to 'C' LC_ALL=C export LC_ALL PROGRESS=22 PROGRESSLOOP=38 # Set File Variable Names ADB="adb.out" IOSTAT="iostat.out" IOSTATXPNC="iostat-xpnC.out" IOSTATXPNCMMZ="iostat-xpnCMmz.out" IOSTATE="iostat-e.out" MPSTAT="mpstat.out" VMSTAT="vmstat.out" PRSTAT="prstat-cpu.out" PRSTATRSS="prstat-rss.out" PRSTATSIZ="prstat-siz.out" PRSTATZ="prstat-Z.out" PRSTATM="prstat-m.out" PRSTATML="prstat-mL.out" VMSTATI="vmstat-i.out" VMSTATP="vmstat-p.out" PS="ps_berkeley.out" PSA="ps.out" KMASTAT="kmastat.out" KMAUSERS="kmausers.out" MEMSTAT="memstat.out" THREADLIST="threadlist.out" NETSTAT="netstat" NETSTATAN="netstat-an.out" KSTAT="kstat-p.out" NETSTATK="netstat-k.out" NETSTATM="netstat-m.out" NETSTATS="netstat-s.out" NETSTATRN="netstat-rn.out" TCPSTATES="tcp-states.out" LOCKSTATC="lockstat-C.out" LOCKSTATH="lockstat-H.out" LOCKSTATPROF1="lockstat-kIW.out" LOCKSTATPROF2="lockstat-kgIW.out" LOCKSTATERR="lockstaterrors.out" IPCSAA="ipcs-A.out" IPCSA="ipcs-a.out" UPTIME="uptime.out" RPCINFO="rpcinfo.out" RPCINFOP="rpcinfo-p.out" RPCINFOM="rpcinfo-m.out" RPCINFOS="rpcinfo-s.out" NDD="ndd.out" NFSSTAT="nfsstat.out" TRAPSTAT="trapstat.out" TRAPSTATT="trapstat-T.out" PSRSET="psrset.out" PSRSETQ="psrset-q.out" PBIND="pbind.out" PRTCL_ZONE="prtcl-i_zone.out" TNF="tnf" PREX_WAIT=5 ERRORLOG="errors.log" INFOLOG="info.log" TIMEZONE="timezone" IPQOSCONF="ipqosconf-L.out" INTERRUPTS="interrupts.out" DLADMSL="dladm-show-link.out" DLADMSD="dladm-show-dev.out" DLADMSA="dladm-show-aggr.out" RCAPSTATP="rcapstat-p.out" RCAPSTATZ="rcapstat-z.out" ZPOOLIOSTAT="zpool-iostat.out" USER=`/usr/bin/id | /usr/bin/cut -d' ' -f1 | /usr/bin/cut -d'(' -f2 | /usr/bin/cut -d')' -f1` SARQ="sar-q.out" OS=`/usr/bin/uname -r` MAJOR=`$ECHO $OS | $AWK -F. '{print $1}'` MINOR=`$ECHO $OS | $AWK -F. '{print $2}'` KRNLPATCH=`/usr/bin/uname -v \ | $AWK -F_ '{print $2}' | $AWK -F- '{print $1}'` KRNLPATCHV=`/usr/bin/uname -v \ | $AWK -F_ '{print $2}' | $AWK -F- '{print $2}'` FILENO=1 PLATFORM=`uname -i` ARCH=`uname -m` PRTDIAG=/usr/platform/${PLATFORM}/sbin/prtdiag if [ ! $MINOR -ge 7 ] then BIT=32 else BIT=`/usr/bin/isainfo -b` fi if [ $MINOR -ge 10 ] then ZONE="-Z" else ZONE="" fi adb_header () { /usr/bin/printf "\n*\n" >> $ADB /usr/bin/printf "ani_max : total reservable slots on phys (disk) swap\n" >> $ADB /usr/bin/printf "ani_free : # of unallocated phys and mem slots\n" >> $ADB /usr/bin/printf "ani_phys_resv : # of reserved phys (disk) slots\n">> $ADB /usr/bin/printf "ani_mem_resv : # of reserved mem slots\n" >> $ADB /usr/bin/printf "ani_locked_swap : # of swap slots locked in reserved mem swap\n\n" >> $ADB } adb_calls () { $ECHO >> $ADB if [ $MINOR -ge 8 ] then DBG="/usr/bin/mdb" else DBG="/usr/bin/adb" fi if [ $BIT -eq 32 ] then CMD="D" else CMD="E" fi if [ -x $DBG ] then ADB_CMD="lotsfree/${CMD}\nminfree/${CMD}\navefree/${CMD}\n" ADB_CMD=${ADB_CMD}"freemem/${CMD}\navefree30/${CMD}\n" ADB_CMD=${ADB_CMD}"k_anoninfo/\"ani_max\"16t\"ani_free\"8t" ADB_CMD=${ADB_CMD}"\"ani_phys_resb\"8t\"ani_mem_resv\"n4${CMD}" ADB_CMD=${ADB_CMD}"\"ani_locked_swap\"n${CMD}\n" ADB_CMD=${ADB_CMD}"nproc/D\nnthread/D\nnswapped/D\n" ADB_CMD=${ADB_CMD}"ufs_throttles/D\nufs_HW/D\nufs_LW/D\nufs_WRITES/D" $ECHO $ADB_CMD | $DBG -k >> $ADB fi } Count () { $ECHO "" $ECHO "\tPlease enter the count option for commands that require it." $ECHO "\tThese are commands like vmstat and iostat which use an" $ECHO "\tinterval and a count to repeat the output." $ECHO "\t" $ECHO "\tFor example, using a count of 10 and interval of 30" $ECHO "\twill cause iostat, vmstat, mpstat, etc to output" $ECHO "\t10 sets of data, with 30 seconds between data sets." $ECHO "\t" $ECHO "\tIf you have not been given a value for this number," $ECHO "\tthe default value will be 10" $ECHO "\n\tCount[10]: \c" read COUNT } Interval () { $ECHO "" $ECHO "\tPlease enter the interval option for commands that require it." $ECHO "\tThese are commands like vmstat and iostat which use an" $ECHO "\tinterval and count to repeat the output." $ECHO "\t" $ECHO "\tIf you have not been given a value for this number," $ECHO "\tthe default value will be 30" $ECHO "\n\tInterval[30]: \c" read INTERVAL } Iterations () { $ECHO "" $ECHO "\tPlease enter the number of total data sets for the script" $ECHO "\tto capture. Each data set contains the output of one SET" $ECHO "\tof a commands output." $ECHO "\tFor example, a single data set would contain an entire" $ECHO "\t\"ps -elf\" output, and an entire vmstat output, where" $ECHO "\tthe vmstat output is made up of a variable number of data" $ECHO "\tlines, as defined by \"count\" and \"interval\"" $ECHO "\t" $ECHO "\tIf you have not been given instructions for this number," $ECHO "\tthe default value will be 5" $ECHO "\n\tIterations[5]: \c" read ITERATIONS } Wait () { $ECHO "\t" $ECHO "\tPlease enter the number of seconds to wait between" $ECHO "\tcollecting data sets. " $ECHO "\tTo ensure correct data collection, any value entered" $ECHO "\twill be added to the minimum wait time." $ECHO "\t" $ECHO "\tIf you have not been given instructions for this number," $ECHO "\tthe default value will be 0" $ECHO "\n\tWait[0]: \c" read WAIT } Case_Number () { $ECHO "" $ECHO "\tPlease enter your case number." $ECHO "\tThe case number should only consist of digits." $ECHO "\n\tCase: \c" read CASE } Extended () { $ECHO "" $ECHO "\tDo you want to run extended set of commands?" $ECHO "\tlevel 0 : nothing (default)" $ECHO "\tlevel 1 : lockstat for contention and hold events" $ECHO "\tlevel 2 : L1 + trapstat, lockstat profiling, threadlist, TNF tracing" $ECHO "\tlevel 3 : L2 + kmastat, kmausers, memstat" $ECHO "\tEnter the level : '0', '1', '2' or '3'." $ECHO "\n\tExtended[0]: \c" read EXTENDED } Dir () { $ECHO "" $ECHO "\tEnter the location of the output directory [/var/tmp]: \c" read PDIR } Progress () { if [ "$QFLAG" -ne 1 ] then tput sc; /usr/bin/printf "$1/$2"; tput rc fi } # # Header(string_$1, file_$2) # Header () { if [ "$ITERATION_COUNT" -eq 1 ] then $ECHO $1 >> $2 fi } Create_Directories () { if [ -z ${PDIR} ] || [ ! -n ${PDIR} ] then PDIR=/var/tmp fi DIR=${PDIR}/${DIR} export DIR /usr/bin/mkdir -p ${DIR} 2> /dev/null if [ $? -ne 0 ] then $ECHO "Please change permissions so that" $ECHO "the directory ${DIR} can be created." exit 1 fi } Count_TCP_states () { TEMPOUT=TCP`date '+%m%d%y%H%M%S'` /usr/bin/touch /tmp/$TEMPOUT; for i in `/usr/sbin/ndd /dev/tcp \\? | $AWK '{print $1}'` do /usr/sbin/ndd /dev/tcp $i >> /tmp/$TEMPOUT done $ECHO "\n\n" >> $TCPSTATES $ECHO "\n\n`date` - started" >> $TCPSTATES $ECHO " " >> $TCPSTATES $ECHO "The number of TCP_LISTEN connections = " `$NAWK 'BEGIN{OFS=" "}; \ {print $19}' /tmp/$TEMPOUT | /usr/bin/grep TCP_LISTEN | /usr/bin/wc -l` >> $TCPSTATES sleep 1; $ECHO "The number of TCP_ESTABLISHED connections = " `$NAWK 'BEGIN{OFS=" "}; \ {print $19}' /tmp/$TEMPOUT | /usr/bin/grep TCP_ESTABLISHED | /usr/bin/wc -l` >> $TCPSTATES sleep 1; $ECHO "The number of TCP_CLOSE_WAIT connections = " `$NAWK 'BEGIN{OFS=" "}; \ {print $19}' /tmp/$TEMPOUT | /usr/bin/grep TCP_CLOSE_WAIT | /usr/bin/wc -l` >> $TCPSTATES sleep 1; $ECHO "The number of TCP_TIME_WAIT connections = " `$NAWK 'BEGIN{OFS=" "}; \ {print $19}' /tmp/$TEMPOUT | /usr/bin/grep TCP_TIME_WAIT | /usr/bin/wc -l` >> $TCPSTATES sleep 1; $ECHO "`date` - ended" >> $TCPSTATES /usr/bin/rm /tmp/$TEMPOUT } # Count_TCP_states # # tnf(outputfile_$1, iteration_$2) # tnf () { # Make sure there is enough physical memory for tnf tracing otherwise return # we need : freemem - lotsfree - 8 - 1 > 0 # tnf buffer__| \__1MB for security if [ $BIT -eq 32 ] then CMD="D" else CMD="E" fi freemem=`$ECHO "\`($ECHO "freemem/${CMD}" | /usr/bin/adb -k \ | grep -v "^$" | /usr/bin/tail -1l \ | $AWK '{print $2}')\`*8192/1024/1024" | /usr/bin/bc` lotsfree=`$ECHO "\`($ECHO "lotsfree/${CMD}"| /usr/bin/adb -k \ | grep -v "^$" | /usr/bin/tail -1l \ | $AWK '{print $2}')\`*8192/1024/1024" | /usr/bin/bc` free=`expr $freemem \- $lotsfree` if [ $free -le 9 ] then $ECHO "\nNot enough memory for TNF tracing\n" >> $ERRORLOG return fi /usr/bin/prex -k -s8192 << EOF >> /dev/null buffer alloc enable \$all trace \$all ktrace on continue EOF start_date=`date` sleep $PREX_WAIT /usr/bin/prex -k << EOF >> /dev/null ktrace off continue EOF stop_date=`date` /usr/bin/tnfxtract $1.$2 $ECHO "$start_date - $1.$2 started" >> $DIR/$INFOLOG $ECHO "$stop_date - $1.$2 ended" >> $DIR/$INFOLOG # compress is less cpu intensive than gzip /usr/bin/compress $1.$2 /usr/bin/prex -k << EOF >> /dev/null buffer dealloc continue EOF } ##################################################################### ##################################################################### ##################################################################### while getopts qhvTf:X:b:e:L:l:x:H:c:i:n:w:s:D: name do case $name in T) TIMESTAMP=1;; X) EXTENDED=$OPTARG;; H) HOURS=$OPTARG;; q) EXTENDED=0 QFLAG=1;; b) CPU=$OPTARG;; c) COUNT=$OPTARG;; i) INTERVAL=$OPTARG;; n) ITERATIONS=$OPTARG;; w) WAIT=$OPTARG;; L) LOCKSTAT_WAIT=$OPTARG;; s) CASE=$OPTARG;; f) FTP=$OPTARG;; e) EMAIL=$OPTARG;; l) SPLIT=$OPTARG;; D) PDIR=$OPTARG;; x) XTRA=$OPTARG;; v) VER=1;; h) /usr/bin/printf "Usage: guds [-q] [-X level] [-T] [-H hours] [-c count] [-i interval] [-n iterations]\n" /usr/bin/printf " [-w wait] [-b cpuid] [-L lockstat_interval] [-s case] [-x \"extra command\"]\n" /usr/bin/printf " [-f ftp_address/ftp_dir] [-e email [-l split]] [-D dir] [-v] [-h]\n" /usr/bin/printf " -q : Run in non interactive mode\n" /usr/bin/printf " -X : Run extended set of commands depending on specified level\n" /usr/bin/printf " level 0 : nothing (default)\n" /usr/bin/printf " level 1 : lockstat for contention and hold events\n" /usr/bin/printf " level 2 : trapstat, lockstat profiling, threadlist, TNF tracing\n" /usr/bin/printf " level 3 : kmastat, kmausers, memstat (they can take a long time to complete\n" /usr/bin/printf " on systems with a lot of memory)\n" /usr/bin/printf " Increasing extended level can affect system performance.\n" /usr/bin/printf " -T : Emit timestamps for commands that loops\n" /usr/bin/printf " (vmstat, mpstat, prstat, iostat)\n" /usr/bin/printf " -H : Gather data during the specified hours\n" /usr/bin/printf " i = 30 ; c = 30 ; n = hours * 4 ; w = starts when previous finishes\n" /usr/bin/printf " -c : Count value for commands that require it\n" /usr/bin/printf " (vmstat, prstat, iostat, mpstat, sar, ...)\n" /usr/bin/printf " -i : Interval value for commands that require it\n" /usr/bin/printf " (vmstat, prstat, iostat, mpstat, sar, ...)\n" /usr/bin/printf " -n : Number of iterations the script will do to collect data\n" /usr/bin/printf " -w : Wait time (seconds) between each iterations\n" /usr/bin/printf " If set to 0 then the next iteration will start the previous finishes\n" /usr/bin/printf " -b : Bind guds to the processor cpuid\n" /usr/bin/printf " -L : Specify the interval during which lockstat is gathering data\n" /usr/bin/printf " (default: 5 secondes)\n" /usr/bin/printf " -s : Case id used to create the directory where the data are going to be stored in\n" /usr/bin/printf " -x : Run extra command during each iteration\n" /usr/bin/printf " Output saved in xtra.out - Errors saved in xtra.err\n" /usr/bin/printf " -f : Ftp the output file automaticaly\n" /usr/bin/printf " Make sure to have the ftp_address referenced in your .netrc\n" /usr/bin/printf " -e : Email the output file automaticaly\n" /usr/bin/printf " By default, split output file at 10000 lines\n" /usr/bin/printf " -l : Change split size (default: 10000 lines)\n" /usr/bin/printf " -D : Change default directory from /var/tmp to \n" /usr/bin/printf " -v : Version\n" /usr/bin/printf " -h : This help...\n\n" /usr/bin/printf "Example:\n" /usr/bin/printf "# guds -q -c10 -i5 -n5 -w0 -s12345678 -x \"sar -g 5 5\" -f sunsolve.sun.com/cores -e foo@sun.com\n" /usr/bin/printf "\n# guds -q -X1 -H2 -s12345678\n" exit 2;; ?) /usr/bin/printf "Usage: guds [-q] [-X level] [-T] [-H hours] [-c count] [-i interval] [-n iterations]\n" /usr/bin/printf " [-w wait] [-b cpuid] [-L lockstat_interval] [-s case] [-x \"extra command\"]\n" /usr/bin/printf " [-f ftp_address/ftp_dir] [-e email [-l split]] [-D dir] [-v] [-h]\n" exit 2;; esac done if [ "$VER" -eq 1 ] then $ECHO $VERSION exit 1 fi # We'll do this later if we don't have the data yet... if [ ! -z $CASE ] then GDATE=`date -u '+%Y.%m.%d.%H.%M'` GUDS=guds.`hostid`.`uname -n`-$GDATE DIR=$CASE/$GUDS FILE=$GUDS.tar fi if [ "$HOURS" -gt 0 ] then # Start iteration every 15mn QFLAG=1 INTERVAL=30 ITERATIONS=`expr $HOURS \* 60 \/ 15` COUNT=30 WAIT=0 fi # Get Required Input from User if [ "$QFLAG" -ne 1 ] then clear $ECHO "Performance Script" $ECHO "------------------" $ECHO "" $ECHO "This script will run on your system for an amount of time" $ECHO "determined by the number of iterations the script is asked" $ECHO "to do, and the count and interval supplied for various" $ECHO "commands. If you have not been given specific values, please" $ECHO "accept the defaults when asked. This will cause the script" $ECHO "to run for about 30 minutes." $ECHO $ECHO "For the best analysis, you should run this script twice." $ECHO "1) Run the script when the system is experiencing the" $ECHO " performance problem." $ECHO "2) Run it again when the machine is doing well." $ECHO $ECHO "This will allow the kernel engineer working on the call" $ECHO "to compare bad data to baseline data. Some numbers are" $ECHO "meaningless without baseline data." $ECHO $ECHO "This script will gather data from your system and put it" $ECHO "in a directory called /var/tmp/[case#]." $ECHO "\n" fi ROOT=`/usr/xpg4/bin/id -u` if [ $ROOT -ne 0 ] && [ "$QFLAG" -ne 1 ] then $ECHO "**NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE**" $ECHO "You are not root. This will still work, but for best" $ECHO "results, please ^C now, and run this script as root." fi # Check if patch 109033-02 is installed for Solaris 8, so we can warn before if [ $MINOR -eq 8 ] && [ "$QFLAG" -ne 1 ] then PATCH=`/usr/bin/showrev -p | nawk '/Patch: 109033/{print $2}' | sort -run | cut -d- -f2` if [ ${PATCH:-0} -lt 02 ] then $ECHO "It is strongly recommended that you install patch 109033-02 before running guds" $ECHO "109033-02 fixes a bug in the 'prstat' utility which will prevent guds from" $ECHO "gathering accurate cpu usage data using the prstat utility." $ECHO "Patch 109033 does not require a reboot, as it only patches the prstat binaries," $ECHO "and can be obtained here:" $ECHO "http://sunsolve.sun.com/search/document.do?assetkey=1-21-109033" $ECHO "If you wish to install the patch, enter ^C to exit guds" fi fi # Get the input the hard way... while : do # Get the case number if [ -z $CASE ] then while : do Case_Number if [ "$CASE" -le 0 ] then $ECHO "bad: Invalid Number" continue fi 2> /dev/null GDATE=`$DATE -u '+%Y.%m.%d.%H.%M'` GUDS=guds.`hostid`.`uname -n`-$GDATE DIR=$CASE/$GUDS FILE=$GUDS.tar break done fi # Get the count if [ -z $COUNT ] then while : do Count if [ -z $COUNT ] then COUNT=10 fi 2> /dev/null if [ "$COUNT" -le 0 ] then $ECHO "bad: Invalid Number" continue fi 2> /dev/null break done fi # Get the interval if [ -z $INTERVAL ] then while : do Interval if [ -z $INTERVAL ] then INTERVAL=30 fi 2> /dev/null if [ "$INTERVAL" -le 0 ] then $ECHO "bad: Invalid Number" continue fi 2> /dev/null break done fi # Get the iterations if [ -z $ITERATIONS ] then while : do Iterations if [ -z $ITERATIONS ] then ITERATIONS=5 fi 2> /dev/null if [ "$ITERATIONS" -le 0 ] then $ECHO "bad: Iterations." continue fi 2> /dev/null break done fi # Get the wait time between each iteration if [ -z $WAIT ] then while : do Wait if [ -z $WAIT ] then WAIT=0 fi 2> /dev/null if [ "$WAIT" -lt 0 ] then $ECHO "bad: Invalid Number." continue fi 2> /dev/null break done fi # Get extended flag if [ -z $EXTENDED ] then while : do Extended if [ -z $EXTENDED ] then EXTENDED=0 fi 2> /dev/null if [ "$EXTENDED" -lt 0 ] || [ "$EXTENDED" -gt 3 ] then $ECHO "bad: Invalid Number." continue fi 2> /dev/null break done fi if [ -z ${PDIR} ] then while : do Dir if [ -z ${PDIR} ] then PDIR=/var/tmp fi 2> /dev/null break done fi # Bail from the loop if we get this far. break done Create_Directories #################### # DON'T REMOVE THIS LINE #################### cd ${DIR} ##################################################################### # Main # ##################################################################### # Write the user's output to a file, so we know what user typed in. $ECHO "COUNT = $COUNT" >> user.answers $ECHO "INTERVAL = $INTERVAL second(s)" >> user.answers $ECHO "ITERATIONS = $ITERATIONS" >> user.answers $ECHO "WAIT = $WAIT second(s)" >> user.answers $ECHO "TIMESTAMP = $TIMESTAMP" >> user.answers $ECHO "EXTENDED = $EXTENDED" >> user.answers $ECHO "VERSION = $VERSION" >> user.answers if [ "$QFLAG" -ne 1 ] then $ECHO $ECHO "Starting Data Gathering" $ECHO "Collecting System Information" fi # if -b then bind guds to $CPU if [ ! -z $CPU ] then pbind -b $CPU $$ > /dev/null 2>> $ERRORLOG if [ $? -eq 0 ] then $ECHO "CPU_BIND = $CPU" >> user.answers fi fi Progress 0 $PROGRESS # Write the adb headers: adb_header Progress 1 $PROGRESS # Make copies of some important system files /usr/bin/cp -p /etc/system ${DIR} 2>> $ERRORLOG /usr/bin/cp -p /etc/vfstab ${DIR} 2>> $ERRORLOG /usr/bin/cp -p /etc/release ${DIR} 2>> $ERRORLOG /usr/bin/cp -p /kernel/drv/st.conf ${DIR} 2>> $ERRORLOG /usr/bin/cp -p /kernel/drv/sd.conf ${DIR} 2>> $ERRORLOG /usr/bin/cp -p /etc/path_to_inst ${DIR} 2>> $ERRORLOG /usr/bin/cp -p /etc/syslog.conf ${DIR} 2>> $ERRORLOG /usr/bin/cp -p /etc/inetd.conf ${DIR} 2>> $ERRORLOG /usr/bin/cp -p /etc/name_to_major ${DIR} 2>> $ERRORLOG /usr/bin/cp -p /etc/name_to_sysnum ${DIR} 2>> $ERRORLOG /usr/bin/cp -p /dev/ksyms ${DIR} 2>> $ERRORLOG /usr/bin/compress ksyms 2>> $ERRORLOG Progress 2 $PROGRESS # Run some commands so see the output, single instance if [ "$MINOR" -ge 7 ] then /usr/bin/isainfo -v > ${DIR}/isainfo-v.out 2>> $ERRORLOG /usr/bin/isainfo -b > ${DIR}/isainfo-b.out 2>> $ERRORLOG fi Progress 3 $PROGRESS /usr/bin/dmesg > ${DIR}/dmesg.out 2>> $ERRORLOG Progress 4 $PROGRESS /usr/sbin/modinfo > ${DIR}/modinfo.out 2>> $ERRORLOG Progress 5 $PROGRESS /usr/sbin/sysdef -i > ${DIR}/sysdef-i.out 2>> $ERRORLOG Progress 6 $PROGRESS /usr/bin/showrev -p > ${DIR}/showrev-p.out 2>> $ERRORLOG Progress 7 $PROGRESS /usr/sbin/prtconf -vp > ${DIR}/prtconf-vp.out 2>> $ERRORLOG Progress 8 $PROGRESS if [ ! -x "$PRTDIAG" ] then $ECHO "No prtdiag on ${PLATFORM} platform" >> $ERRORLOG else $PRTDIAG -v > ${DIR}/prtdiag-v.out 2>> $ERRORLOG fi Progress 9 $PROGRESS /usr/bin/uname -a > ${DIR}/uname-a.out 2>> $ERRORLOG Progress 10 $PROGRESS /usr/bin/pkginfo -l > ${DIR}/pkginfo-l.out 2>> $ERRORLOG Progress 11 $PROGRESS /usr/bin/uptime > ${DIR}/uptime.out 2>> $ERRORLOG Progress 12 $PROGRESS /usr/sbin/ifconfig -a > ${DIR}/ifconfig-a.out 2>> $ERRORLOG Progress 13 $PROGRESS if [ -n "$TZ" ] then $ECHO $TZ > ${DIR}/$TIMEZONE fi Progress 14 $PROGRESS # Check if VxVM is installed if [ -x /usr/sbin/vxprint ] then VX_PATH=/usr/sbin/ else VX_PATH=`grep vxprint /var/sadm/install/contents | grep -v man | $AWK '{print $1}' \ | /usr/bin/sed 's/vxprint//' | head -1` fi if [ "$VX_PATH" ] then $VX_PATH/vxprint -Ath > ${DIR}/vxprint-Ath.out 2>> $ERRORLOG $VX_PATH/vxdisk list > ${DIR}/vxdisk-list.out 2>> $ERRORLOG fi Progress 15 $PROGRESS # Check if SDS is installed SDS_PATH=`grep metastat /var/sadm/install/contents | grep -v man | $AWK '{print $1}' \ | /usr/bin/sed 's/metastat//' | head -1` if [ "$SDS_PATH" ] then $SDS_PATH/metastat -p > ${DIR}/metastat-p.out 2>> $ERRORLOG fi Progress 16 $PROGRESS /usr/bin/ls -lisa /dev/rdsk >> ${DIR}/ls-lisa_dev_rdsk.out 2>> $ERRORLOG Progress 17 $PROGRESS /usr/sbin/mount > ${DIR}/mount.out 2>> $ERRORLOG Progress 18 $PROGRESS /usr/sbin/mount -v > ${DIR}/mount-v.out 2>> $ERRORLOG Progress 19 $PROGRESS if [ "$MINOR" -ge 6 ] then /usr/bin/iostat -E > ${DIR}/iostat-e.out 2>> $ERRORLOG fi Progress 20 $PROGRESS if [ ${KRNLPATCH:-0} -ne 108528 ] || [ ${KRNLPATCHV:-0} -ge 13 ] then # Getting ndd parameters for below interface layers # $ECHO "\n\n`$DATE` - started" >> $NDD 2>> $ERRORLOG #LIST="ip tcp udp icmp arp le hme ba qe qfe ge vge ce nf idn eri" LIST="ip tcp udp icmp arp hme ba qe qfe ge vge nf idn eri" for i in $LIST do if [ `/usr/sbin/modinfo | /usr/bin/grep " $i " | /usr/bin/head -1 | /usr/bin/wc -l` -eq 1 ] then $ECHO "-------------------------------------------" >> $NDD $ECHO "-------------------------------------------" >> $NDD $ECHO "---------------- ndd /dev/${i} -------------" >> $NDD for j in `(/usr/sbin/ndd /dev/${i} \\? 2>> $ERRORLOG) | $AWK '{print $1}' \ | $AWK -F\( '{print $1}'` do if [ $j != '?' ] then if [ "$MINOR" -ge 10 ] then res=`$ECHO $j | /usr/bin/grep ip_forwarding` if [ $? -eq 1 ] then $ECHO "-------------------------------------------" >> $NDD /usr/ucb/echo -n $j " = " >> $NDD 2>> $ERRORLOG /usr/sbin/ndd -get /dev/${i} $j >> $NDD 2>> $ERRORLOG fi else if [ "$MINOR" -lt 10 ] then $ECHO "-------------------------------------------" >> $NDD /usr/ucb/echo -n $j " = " >> $NDD 2>> $ERRORLOG /usr/sbin/ndd -get /dev/${i} $j >> $NDD 2>> $ERRORLOG fi fi fi done $ECHO >> $NDD fi done $ECHO "`$DATE` - ended" >> $NDD 2>> $ERRORLOG fi Progress 21 $PROGRESS # # Solaris 10+ specifics # if [ "$MINOR" -ge 10 ] then for zone in `/usr/sbin/zoneadm list` do /usr/bin/prctl -i zone $zone >> prctl-i_zone.out 2>> $ERRORLOG done /usr/sbin/ipqosconf -L > $IPQOSCONF 2>> $ERRORLOG $ECHO "::interrupts" | /usr/bin/mdb -k > $INTERRUPTS 2>> $ERRORLOG # dladm data if [ -x /usr/sbin/dladm ] then /usr/sbin/dladm show-dev > $DLADMSD 2>> $ERRORLOG /usr/sbin/dladm show-link > $DLADMSL 2>> $ERRORLOG /usr/sbin/dladm show-aggr > $DLADMSA 2>> $ERRORLOG fi fi Progress 22 $PROGRESS if [ "$QFLAG" -ne 1 ] then $ECHO "" $ECHO "Collecting performance data..." fi ITERATION_COUNT=1 while [ $ITERATIONS -ne 0 ] do if [ "$QFLAG" -ne 1 ] then $ECHO "Begin Iteration #$ITERATION_COUNT" fi Progress 0 $PROGRESSLOOP Header "/usr/bin/du -ks" dutmp.out $ECHO "\n\n`$DATE` - started" >> dutmp.out /usr/bin/du -ks /tmp >> dutmp.out 2>> $ERRORLOG $ECHO "`$DATE` - ended" >> dutmp.out Progress 1 $PROGRESSLOOP Header "/usr/bin/df -kl $ZONE" df-kl.out $ECHO "\n\n`$DATE` - started" >> df-kl.out /usr/bin/df -kl $ZONE >> df-kl.out 2>> $ERRORLOG $ECHO "`$DATE` - ended" >> df-kl.out Progress 2 $PROGRESSLOOP Header "/usr/bin/df -gl $ZONE" df-gl.out $ECHO "\n\n`$DATE` - started" >> df-gl.out /usr/bin/df -gl $ZONE >> df-gl.out 2>> $ERRORLOG $ECHO "`$DATE` - ended" >> df-gl.out Progress 3 $PROGRESSLOOP Header "/usr/sbin/swap -l" swapl.out $ECHO "\n\n`$DATE` - started" >> swapl.out /usr/sbin/swap -l >> swapl.out 2>> $ERRORLOG $ECHO "`$DATE` - ended" >> swapl.out Progress 4 $PROGRESSLOOP Header "/usr/sbin/swap -s" swaps.out $ECHO "\n\n`$DATE` - started" >> swaps.out /usr/sbin/swap -s >> swaps.out 2>> $ERRORLOG $ECHO "`$DATE` - ended" >> swaps.out Header "/usr/bin/vmstat -s" vmstat-s.out $ECHO "\n\n`$DATE` - started" >> vmstat-s.out /usr/bin/vmstat -s >> vmstat-s.out 2>> $ERRORLOG $ECHO "`$DATE` - ended" >> vmstat-s.out Progress 5 $PROGRESSLOOP # lockstat (only one can run at a time...) if [ "$MINOR" -ge 8 ] then # Give each lockstat a 3rd of the iteration time if less than 60sec, and run them serially in the background if [ -z $LOCKSTAT_WAIT ] then LOCKSTAT_WAIT=2 fi if [ "$EXTENDED" -ge 1 ] then Header "/usr/sbin/lockstat -CcwP -n 50000 -D 20 -s 40 sleep $LOCKSTAT_WAIT" $LOCKSTATC $ECHO "\n\n`$DATE` - started" >> $LOCKSTATC /usr/sbin/lockstat -CcwP -n 50000 -D 20 -s 40 sleep $LOCKSTAT_WAIT 1>> $LOCKSTATC 2>> $ERRORLOG $ECHO "`date` - ended" >> $LOCKSTATC Header "/usr/sbin/lockstat -HcwP -n 50000 -D 20 -s 40 sleep $LOCKSTAT_WAIT" $LOCKSTATH $ECHO "\n\n`$DATE` - started" >> $LOCKSTATH /usr/sbin/lockstat -HcwP -n 50000 -D 20 -s 40 sleep $LOCKSTAT_WAIT 1>> $LOCKSTATH 2>> $ERRORLOG $ECHO "`date` - ended" >> $LOCKSTATH fi if [ "$EXTENDED" -ge 2 ] then Header "/usr/sbin/lockstat -kIW -i 977 -D 20 -s 40 sleep $LOCKSTAT_WAIT" $LOCKSTATPROF1 $ECHO "\n\n`$DATE` - started" >> $LOCKSTATPROF1 /usr/sbin/lockstat -kIW -i 977 -D 20 -s 40 sleep $LOCKSTAT_WAIT 1>> $LOCKSTATPROF1 2>> $ERRORLOG $ECHO "`$DATE` - ended" >> $LOCKSTATPROF1 Header "/usr/sbin/lockstat -kgIW -i 977 -D 20 sleep $LOCKSTAT_WAIT" $LOCKSTATPROF2 $ECHO "\n\n`$DATE` - started" >> $LOCKSTATPROF2 (/usr/sbin/lockstat -kgIW -i 977 -D 20 -s 40 sleep $LOCKSTAT_WAIT 1>> $LOCKSTATPROF2 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $LOCKSTATPROF2) fi else if [ "$EXTENDED" -ge 1 ] then Header "/usr/sbin/lockstat -CcwP -n 50000 -D 20 sleep $LOCKSTAT_WAIT" $LOCKSTATC $ECHO "\n\n`$DATE` - started" >> $LOCKSTATC (/usr/sbin/lockstat -CcwP -n 50000 -D 20 sleep $LOCKSTAT_WAIT 1>> $LOCKSTATC 2>> $ERRORLOG; $ECHO "`$DATE` - ended" >> $LOCKSTATC) Header "/usr/sbin/lockstat -HcwP -n 50000 -D 20 sleep $LOCKSTAT_WAIT" $LOCKSTATH $ECHO "\n\n`$DATE` - started" >> $LOCKSTATH (/usr/sbin/lockstat -HcwP -n 50000 -D 20 sleep $LOCKSTAT_WAIT 1>> $LOCKSTATH 2>> $ERRORLOG; $ECHO "`$DATE` - ended" >> $LOCKSTATH) fi fi Progress 6 $PROGRESSLOOP if [ $USER = "root" ] then #kmastat if [ "$EXTENDED" -ge 3 ] then if [ "$MINOR" -ge 8 ] then Header "$ECHO "::kmastat" | /usr/bin/mdb -k" $KMASTAT $ECHO "\n\n`$DATE` - started" >> $KMASTAT ($ECHO "::kmastat" | /usr/bin/mdb -k >> $KMASTAT; \ $ECHO "`$DATE` - ended" >> $KMASTAT) if [ "$MINOR" -ge 9 ] then Header "$ECHO "::memstat" | /usr/bin/mdb -k" $MEMSTAT ($ECHO "::memstat" | /usr/bin/mdb -k >> $MEMSTAT; \ $ECHO "`$DATE` - ended" >> $MEMSTAT) fi else Header "$ECHO "kmastat" | /usr/sbin/crash" $KMASTAT $ECHO "\n\n`$DATE` - started" >> $KMASTAT ($ECHO "kmastat" | /usr/sbin/crash >> $KMASTAT; \ $ECHO "`$DATE` - ended" >> $KMASTAT) fi fi #kmausers KMEMFLAGS=`$ECHO "kmem_flags/D" | /usr/bin/adb -k | grep kmem_flags \ | tail -1 | awk '{ print $2 }'` if [[ $KMEMFLAGS -ne 0 && "$EXTENDED" -ge 3 ]] then if [ "$MINOR" -ge 8 ] then Header "$ECHO "::kmausers" | /usr/bin/mdb -k" $KMAUSERS $ECHO "\n\n`$DATE` - started" >> $KMAUSERS ($ECHO "::kmausers" | /usr/bin/mdb -k >> $KMAUSERS; \ $ECHO "`$DATE` - ended" >> $KMAUSERS) else Header "$ECHO "kmausers" | /usr/sbin/crash" $KMAUSERS $ECHO "\n\n`$DATE` - started" >> $KMAUSERS ($ECHO "kmausers" | /usr/sbin/crash >> $KMAUSERS; \ $ECHO "`$DATE` - ended" >> $KMAUSERS) fi fi #adb $ECHO "\n\n`$DATE` - started" >> $ADB adb_calls $ECHO "\n\n`$DATE` - ended" >> $ADB #threadlist if [[ -r /dev/allkmem && "$EXTENDED" -ge 2 ]] then if [ "$MINOR" -ge 8 ] then Header "$ECHO \"::threadlist -v\" | /usr/bin/mdb -k /dev/ksyms /dev/kmem" $THREADLIST.$FILENO $ECHO "\n\n`$DATE` - started" >> $THREADLIST.$FILENO ($ECHO "::threadlist -v" | /usr/bin/mdb -k /dev/ksyms /dev/kmem \ >> $THREADLIST.$FILENO 2>> $ERRORLOG; $ECHO "`$DATE` - ended" \ >> $THREADLIST.$FILENO ) numline=`/usr/bin/cat $THREADLIST.$FILENO | /usr/bin/wc -l ` if [ "$numline" -lt 10 ] then Header "$ECHO \"$> $THREADLIST.$FILENO ($ECHO "$> $THREADLIST.$FILENO 2>> $ERRORLOG; $ECHO "`$DATE` - ended" \ >> $THREADLIST.$FILENO ) fi else Header "$ECHO \"$> $THREADLIST.$FILENO ($ECHO "$> $THREADLIST.$FILENO 2>> $ERRORLOG; $ECHO "`$DATE` - ended" \ >> $THREADLIST.$FILENO ) fi else if [[ ! -r /dev/allkmem && "$EXTENDED" -ge 2 ]] then $ECHO "/dev/allkmem does not exist" >> $ERRORLOG fi fi fi Progress 7 $PROGRESSLOOP # vmstat Header "/usr/bin/vmstat $INTERVAL $COUNT" $VMSTAT $ECHO "\n\n`$DATE` - started" >> $VMSTAT if [ -z $TIMESTAMP ] then (/usr/bin/vmstat $INTERVAL $COUNT >> $VMSTAT 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $VMSTAT)& else (/usr/bin/vmstat $INTERVAL $COUNT | \ $NAWK '{system("$ECHO `date +%H:%M:%S` \" \\c\""); print}'\ >> $VMSTAT 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $VMSTAT)& fi Progress 8 $PROGRESSLOOP # vmstat -i Header "/usr/bin/vmstat -i" $VMSTATI $ECHO "\n\n`$DATE` - started" >> $VMSTATI (/usr/bin/vmstat -i >> $VMSTATI 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $VMSTATI)& Progress 9 $PROGRESSLOOP # vmstat -p if [ "$MINOR" -ge 8 ] then Header "/usr/bin/vmstat -p $INTERVAL $COUNT" $VMSTATP $ECHO "\n\n`$DATE` - started" >> $VMSTATP if [ -z $TIMESTAMP ] then (/usr/bin/vmstat -p $INTERVAL $COUNT >> $VMSTATP 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $VMSTATP)& else (/usr/bin/vmstat -p $INTERVAL $COUNT | \ $NAWK '{system("$ECHO `date +%H:%M:%S` \" \\c\""); print}'\ >> $VMSTATP 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $VMSTATP)& fi fi Progress 10 $PROGRESSLOOP # prstat if [ "$MINOR" -ge 8 ] then # Check if patch 109033-02 is installed for Solaris 8 # PATCH=`showrev -p | nawk '/Patch: 109033/{print $2}' | sort -run | cut -d- -f2` PATCH=`/usr/bin/cat showrev-p.out | $NAWK '/Patch: 109033/{print $2}' \ | /usr/bin/sort -run | /usr/bin/cut -d- -f2` if [ "$MINOR" -ge 9 ] || [ ${PATCH:-0} -ge 02 ] then Header "/usr/bin/prstat -s cpu -can 10 $INTERVAL $COUNT" $PRSTAT $ECHO "\n\n`$DATE` - started" >> $PRSTAT if [ -z $TIMESTAMP ] then (/usr/bin/prstat -s cpu -can 10 $INTERVAL $COUNT >> $PRSTAT 2>> \ $ERRORLOG; $ECHO "`$DATE` - ended" >> $PRSTAT)& else (/usr/bin/prstat -s cpu -can 10 $INTERVAL $COUNT | \ $NAWK '/^[ ]*PID/ {print NL; system("date"); print; next} {print}'\ >> $PRSTAT 2>> $ERRORLOG; $ECHO "`$DATE` - ended" \ >> $PRSTAT)& fi Header "/usr/bin/prstat -s rss -can 10 $INTERVAL $COUNT" $PRSTATRSS $ECHO "\n\n`$DATE` - started" >> $PRSTATRSS if [ -z $TIMESTAMP ] then (/usr/bin/prstat -s rss -can 10 $INTERVAL $COUNT >> $PRSTATRSS 2>> \ $ERRORLOG; $ECHO "`$DATE` - ended" >> $PRSTATRSS)& else (/usr/bin/prstat -s rss -can 10 $INTERVAL $COUNT | \ $NAWK '/^[ ]*PID/ {print NL; system("date"); print; next} {print}'\ >> $PRSTATRSS 2>> $ERRORLOG; $ECHO "`$DATE` - ended" \ >> $PRSTATRSS)& fi Header "/usr/bin/prstat -s size -can 10 $INTERVAL $COUNT" $PRSTATSIZ $ECHO "\n\n`$DATE` - started" >> $PRSTATSIZ if [ -z $TIMESTAMP ] then (/usr/bin/prstat -s size -can 10 $INTERVAL $COUNT >>$PRSTATSIZ 2>> \ $ERRORLOG; $ECHO "`$DATE` - ended" >> $PRSTATSIZ)& else (/usr/bin/prstat -s size -can 10 $INTERVAL $COUNT | \ $NAWK '/^[ ]*PID/ {print NL; system("date"); print $0; next} {print $0}'\ >>$PRSTATSIZ 2>> $ERRORLOG; $ECHO "`$DATE` - ended" \ >> $PRSTATSIZ)& fi Header "/usr/bin/prstat -m $INTERVAL $COUNT" $PRSTATM $ECHO "\n\n`$DATE` - started" >> $PRSTATM if [ -z $TIMESTAMP ] then (/usr/bin/prstat -m $INTERVAL $COUNT >>$PRSTATM 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $PRSTATM)& else (/usr/bin/prstat -m $INTERVAL $COUNT | \ $NAWK '/^[ ]*PID/ {print NL; system("date"); print; next} {print}'\ >>$PRSTATM 2>> $ERRORLOG; $ECHO "`$DATE` - ended" \ >> $PRSTATM)& fi Header "/usr/bin/prstat -mL $INTERVAL $COUNT" $PRSTATML $ECHO "\n\n`$DATE` - started" >> $PRSTATML if [ -z $TIMESTAMP ] then (/usr/bin/prstat -mL $INTERVAL $COUNT >>$PRSTATML 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $PRSTATML)& else (/usr/bin/prstat -mL $INTERVAL $COUNT | \ $NAWK '/^[ ]*PID/ {print NL; system("date"); print; next} {print}'\ >>$PRSTATML 2>> $ERRORLOG; $ECHO "`$DATE` - ended" \ >> $PRSTATML)& fi if [ "$MINOR" -ge 10 ] then Header "/usr/bin/prstat -Z -n 1 $INTERVAL $COUNT" $PRSTATZ $ECHO "\n\n`$DATE` - started" >> $PRSTATZ if [ -z $TIMESTAMP ] then (/usr/bin/prstat -Z -n 1 $INTERVAL $COUNT >>$PRSTATZ 2>> \ $ERRORLOG; $ECHO "`$DATE` - ended" >> $PRSTATZ)& else (/usr/bin/prstat -Z -n 1 $INTERVAL $COUNT | \ $NAWK '/^[ ]*PID/ {print NL; system("date"); print; next} {print}'\ >>$PRSTATZ 2>> $ERRORLOG; $ECHO "`$DATE` - ended" \ >> $PRSTATZ)& fi fi elif [ ${PATCH:-0} -lt 02 ] then $ECHO "\n\nCan't run prstat cmds - Please, install 109033-02 min." \ >> $ERRORLOG fi fi Progress 11 $PROGRESSLOOP # trapstat (can't run in parallel) if [[ "$MINOR" -ge 9 && "$EXTENDED" -ge 2 ]] then PATCH=`/usr/bin/cat showrev-p.out | $NAWK '/Patch: 120011/{print $2}' \ | /usr/bin/sort -run | /usr/bin/cut -d- -f2` if [[ "$ARCH" = "sun4v" && ${PATCH:-0} -lt 14 ]] then $ECHO "\n\nCan't run trapstat cmds - Please, install 120011-14 min." \ >> $ERRORLOG else TRAPSTAT_TIME=`expr $INTERVAL \* $COUNT` if [ "$TRAPSTAT_TIME" -gt 60 ] then Header "/usr/sbin/trapstat 10 6" $TRAPSTAT $ECHO "\n\n`$DATE` - started" >> $TRAPSTAT (/usr/sbin/trapstat 10 6 >> $TRAPSTAT 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $TRAPSTAT) Header "/usr/sbin/trapstat -T 10 6" $TRAPSTATT $ECHO "\n\n`$DATE` - started" >> $TRAPSTATT (/usr/sbin/trapstat -T 10 6 >> $TRAPSTATT 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $TRAPSTATT)& else Header "/usr/sbin/trapstat $INTERVAL $COUNT" $TRAPSTAT $ECHO "\n\n`$DATE` - started" >> $TRAPSTAT (/usr/sbin/trapstat $INTERVAL $COUNT >> $TRAPSTAT 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $TRAPSTAT) Header "/usr/sbin/trapstat -T $INTERVAL $COUNT" $TRAPSTATT $ECHO "\n\n`$DATE` - started" >> $TRAPSTATT (/usr/sbin/trapstat -T $INTERVAL $COUNT >> $TRAPSTATT 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $TRAPSTATT)& fi fi fi Progress 12 $PROGRESSLOOP # iostat Header "/usr/bin/iostat -x $INTERVAL $COUNT" $IOSTAT $ECHO "\n\n`$DATE` - started" >> $IOSTAT if [ -z $TIMESTAMP ] then (/usr/bin/iostat -x $INTERVAL $COUNT >> $IOSTAT 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $IOSTAT)& else if [ "$MINOR" -ge 8 ] then (/usr/bin/iostat -T d -x $INTERVAL $COUNT >> $IOSTAT 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $IOSTAT)& else (/usr/bin/iostat -x $INTERVAL $COUNT | \ $NAWK '/^[ ]*extended/ {print NL; system("date"); print; next} {print}'\ >> $IOSTAT 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $IOSTAT)& fi fi Progress 13 $PROGRESSLOOP if [ "$MINOR" -ge 8 ] then Header "/usr/bin/iostat -xpnC $INTERVAL $COUNT" $IOSTATXPNC $ECHO "\n\n`$DATE` - started" >> $IOSTATXPNC if [ -z $TIMESTAMP ] then (/usr/bin/iostat -xpnC $INTERVAL $COUNT >> $IOSTATXPNC 2>> $ERRORLOG;\ $ECHO "`$DATE` - ended" >> $IOSTATXPNC)& else if [ "$MINOR" -ge 8 ] then (/usr/bin/iostat -T d -xpnC $INTERVAL $COUNT >> $IOSTATXPNC 2>> $ERRORLOG;\ $ECHO "`$DATE` - ended" >> $IOSTATXPNC)& else (/usr/bin/iostat -xpnC $INTERVAL $COUNT | \ $NAWK '/^[ ]*extended/ {print NL; system("date"); print; next} {print}'\ >> $IOSTATXPNC 2>> $ERRORLOG;\ $ECHO "`$DATE` - ended" >> $IOSTATXPNC)& fi fi if [ "$MINOR" -ge 9 ] then Header "/usr/bin/iostat -xpnCXMmz $INTERVAL $COUNT" $IOSTATXPNCMMZ else Header "/usr/bin/iostat -xpnCMmz $INTERVAL $COUNT" $IOSTATXPNCMMZ fi $ECHO "\n\n`$DATE` - started" >> $IOSTATXPNCMMZ if [ -z $TIMESTAMP ] then if [ "$MINOR" -ge 9 ] then (/usr/bin/iostat -xpnCXMmz $INTERVAL $COUNT \ >> $IOSTATXPNCMMZ 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $IOSTATXPNCMMZ)& else (/usr/bin/iostat -xpnCMmz $INTERVAL $COUNT \ >> $IOSTATXPNCMMZ 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $IOSTATXPNCMMZ)& fi else if [ "$MINOR" -eq 8 ] then (/usr/bin/iostat -T d -xpnCMmz $INTERVAL $COUNT >> $IOSTATXPNCMMZ 2>> $ERRORLOG;\ $ECHO "`$DATE` - ended" >> $IOSTATXPNCMMZ)& elif [ "$MINOR" -ge 9 ] then (/usr/bin/iostat -T d -xpnCXMmz $INTERVAL $COUNT >> $IOSTATXPNCMMZ 2>> $ ERRORLOG;\ $ECHO "`$DATE` - ended" >> $IOSTATXPNCMMZ)& else (/usr/bin/iostat -xpnCMmz $INTERVAL $COUNT | \ $NAWK '/^[ ]*extended/ {print NL; system("date"); print; next} {print}'\ >> $IOSTATXPNCMMZ 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $IOSTATXPNCMMZ)& fi fi fi Progress 14 $PROGRESSLOOP # mpstat Header "/usr/bin/mpstat $INTERVAL $COUNT" $MPSTAT $ECHO "\n\n`$DATE` - started" >> $MPSTAT if [ -z $TIMESTAMP ] then (/usr/bin/mpstat $INTERVAL $COUNT >> $MPSTAT 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $MPSTAT)& else (/usr/bin/mpstat $INTERVAL $COUNT | \ $NAWK '{system("$ECHO `date +%H:%M:%S` \" \\c\""); print}'\ >> $MPSTAT 2>> $ERRORLOG; \ $ECHO "`$DATE` - ended" >> $MPSTAT)& fi Progress 15 $PROGRESSLOOP # The old Berkely style ps only for OS < 5.8 if [ "$MINOR" -lt 8 ] then Header "/usr/ucb/ps -auxww" $PS $ECHO "\n\n`$DATE` - started" >> $PS (/usr/ucb/ps -auxww >> $PS; $ECHO "`$DATE` - ended" >> $PS)& fi Progress 16 $PROGRESSLOOP # The AT&T ps if [ "$MINOR" -ge 10 ] then Header "/usr/bin/ps -eo 'zone user s pri pid ppid pcpu pmem vsz rss stime time nlwp psr args' | sort -r -k 6,6" $PSA.$FILENO $ECHO "\n\n`$DATE` - started" >> $PSA.$FILENO (/usr/bin/ps -eo 'zone user s pri pid ppid pcpu pmem vsz rss stime time nlwp psr args' | sort -r -k 6,6 \ >> $PSA.$FILENO ; $ECHO "`$DATE` - ended" \ >> $PSA.$FILENO )& else Header "/usr/bin/ps -eo 'user s pri pid ppid pcpu pmem vsz rss stime time nlwp psr args' | sort -r -k 6,6" $PSA.$FILENO $ECHO "\n\n`$DATE` - started" >> $PSA.$FILENO (/usr/bin/ps -eo 'user s pri pid ppid pcpu pmem vsz rss stime time nlwp psr args' | sort -r -k 6,6 \ >> $PSA.$FILENO ; $ECHO "`$DATE` - ended" \ >> $PSA.$FILENO )& fi Progress 17 $PROGRESSLOOP # sar -q if [ "$MINOR" -eq 8 ] then $ECHO "\n Patch 110941-03 should be installed to get consistent result" >> $SARQ fi if [ "$MINOR" -eq 7 ] then $ECHO "\n Patch 106946-07 should be installed to get consistent result" >> $SARQ fi if [ "$MINOR" -eq 6 ] then $ECHO "\n Patch 106818-05 should be installed to get consistent result" >> $SARQ fi Header "/usr/bin/sar -q $INTERVAL $COUNT" $SARQ $ECHO "\n\n`$DATE` - started" >> $SARQ (/usr/bin/sar -q $INTERVAL $COUNT >> $SARQ 2>> $ERRORLOG; $ECHO "`$DATE` - ended" >> $SARQ)& Progress 18 $PROGRESSLOOP # ipcs if [ "$MINOR" -ge 7 ] then Header "/usr/bin/ipcs -A $ZONE" $IPCSAA $ECHO "\n\n`$DATE` - started" >> $IPCSAA (/usr/bin/ipcs -A $ZONE 1>> ${DIR}/$IPCSAA 2>> $ERRORLOG; $ECHO "`$DATE` - ended" >> $IPCSAA)& else Header "/usr/bin/ipcs -a" $IPCSA $ECHO "\n\n`$DATE` - started" >> $IPCSA (/usr/bin/ipcs -a 1>> ${DIR}/$IPCSA 2>> $ERRORLOG; $ECHO "`$DATE` - ended" >> $IPCSA)& fi Progress 19 $PROGRESSLOOP # netstat Header "/usr/bin/netstat -an" $NETSTATAN $ECHO "\n\n`$DATE` - started" >> $NETSTATAN (/usr/bin/netstat -an >> $NETSTATAN; $ECHO "`$DATE` - ended" >> $NETSTATAN)& Progress 20 $PROGRESSLOOP if [ $MINOR -ge 8 ] then for IF in `/usr/sbin/ifconfig -a | $AWK -e '/^[^ \t]*:/ {print $1}' \ | /usr/bin/sed "s/:.*//" | /usr/bin/sort -u` do NETSTATIN="netstat-in.${IF}" Header "/usr/bin/netstat -in -I $IF $INTERVAL $COUNT" $NETSTATIN $ECHO "\n\n`$DATE` - started" >> $NETSTATIN (/usr/bin/netstat -in -I $IF $INTERVAL $COUNT >> $NETSTATIN; \ $ECHO "`$DATE` - ended" >> $NETSTATIN)& done else NETSTATIN="netstat-in.out" Header "/usr/bin/netstat -in" $NETSTATIN $ECHO "\n\n`$DATE` - started" >> $NETSTATIN (/usr/bin/netstat -in >> $NETSTATIN; $ECHO "`$DATE` - ended" >> $NETSTATIN)& fi Progress 21 $PROGRESSLOOP Header "/usr/bin/netstat -m" $NETSTATM $ECHO "\n\n`date` - started" >> $NETSTATM (/usr/bin/netstat -m >> $NETSTATM; $ECHO "`$DATE` - ended" >> $NETSTATM)& Progress 22 $PROGRESSLOOP Header "/usr/bin/netstat -s" $NETSTATS $ECHO "\n\n`date` - started" >> $NETSTATS (/usr/bin/netstat -s >> $NETSTATS; $ECHO "`$DATE` - ended" >> $NETSTATS)& Progress 23 $PROGRESSLOOP Header "/usr/bin/netstat -rvn" $NETSTATRN $ECHO "\n\n`date` - started" >> $NETSTATRN (/usr/bin/netstat -rvn >> $NETSTATRN; $ECHO "`$DATE` - ended" >> $NETSTATRN)& Progress 24 $PROGRESSLOOP if [ ${KRNLPATCH:-0} -ne 108528 ] || [ ${KRNLPATCHV:-0} -ge 13 ] then Count_TCP_states fi Progress 25 $PROGRESSLOOP # rpcinfo Header "/usr/bin/rpcinfo" $RPCINFO $ECHO "\n\n`$DATE` - started" >> $RPCINFO 2>&1 /usr/bin/rpcinfo >> $RPCINFO 2>&1 $ECHO "`$DATE` - ended" >> $RPCINFO 2>&1 Progress 26 $PROGRESSLOOP Header "/usr/bin/rpcinfo -p" $RPCINFOP $ECHO "\n\n`$DATE` - started" >> $RPCINFOP 2>&1 /usr/bin/rpcinfo -p >> $RPCINFOP 2>&1 $ECHO "`$DATE` - ended" >> $RPCINFOP 2>&1 Progress 27 $PROGRESSLOOP Header "/usr/bin/rpcinfo -m" $RPCINFOM $ECHO "\n\n`$DATE` - started" >> $RPCINFOM 2>&1 /usr/bin/rpcinfo -m >> $RPCINFOM 2>&1 $ECHO "`$DATE` - ended" >> $RPCINFOM 2>&1 Progress 28 $PROGRESSLOOP Header "/usr/bin/rpcinfo -s" $RPCINFOS $ECHO "\n\n`$DATE` - started" >> $RPCINFOS 2>&1 /usr/bin/rpcinfo -s >> $RPCINFOS 2>&1 $ECHO "`$DATE` - ended" >> $RPCINFOS 2>&1 Progress 29 $PROGRESSLOOP # kstat / netstat -k if [ "$MINOR" -ge 8 ] then modinfo | grep qlc 1> /dev/null if [ $? -eq 1 ] # qlc driver not in use then modinfo | grep llc1 1> /dev/null if [ $? -eq 1 ] # llc1 driver not in use then Header "/usr/bin/kstat -p" $KSTAT $ECHO "\n\n`$DATE` - started" >> $KSTAT (/usr/bin/kstat -p >> $KSTAT; $ECHO "`$DATE` - ended" >> $KSTAT)& elif [ "$MINOR" -eq 9 ] # llc1 driver in use then # Check if patch 117071-01 is installed PATCH=`/usr/bin/cat showrev-p.out | $NAWK '/Patch: 117071/{print $2}' \ | /usr/bin/sort -run | /usr/bin/cut -d- -f2` if [ ${PATCH:-0} -ge 01 ] then Header "/usr/bin/kstat -p" $KSTAT $ECHO "\n\n`$DATE` - started" >> $KSTAT (/usr/bin/kstat -p >> $KSTAT; $ECHO "`$DATE` - ended" >> $KSTAT)& else $ECHO "kstat: patchid 117071-01 is missing" >> $ERRORLOG fi elif [ "$MINOR" -gt 9 ] # Solaris 10 and above then Header "/usr/bin/kstat -p" $KSTAT $ECHO "\n\n`$DATE` - started" >> $KSTAT (/usr/bin/kstat -p >> $KSTAT; $ECHO "`$DATE` - ended" >> $KSTAT)& fi # llc1 else [ $? -eq 0 ] # qlc driver in use if [ "$MINOR" -eq 8 ] then # Check if patch 111097-13 is installed PATCH=`/usr/bin/cat showrev-p.out | $NAWK '/Patch: 111097/{print $2}' \ | /usr/bin/sort -run | /usr/bin/cut -d- -f2` if [ ${PATCH:-0} -ge 13 ] then Header "/usr/bin/kstat -p" $KSTAT $ECHO "\n\n`$DATE` - started" >> $KSTAT (/usr/bin/kstat -p >> $KSTAT; $ECHO "`$DATE` - ended" >> $KSTAT)& else $ECHO "kstat: patchid 111097-13 is missing" >> $ERRORLOG fi elif [ "$MINOR" -eq 9 ] then # Check if patch 113042-05 is installed PATCH=`/usr/bin/cat showrev-p.out | $NAWK '/Patch: 113042/{print $2}' \ | /usr/bin/sort -run | /usr/bin/cut -d- -f2` if [ ${PATCH:-0} -ge 05 ] then modinfo | grep llc1 1> /dev/null if [ $? -eq 0 ] # llc1 module is loaded then # Check if patch 117071-01 is installed # PATCH=`showrev -p | nawk '/Patch: 117071/{print $2}' | sort -run | cut -d- -f2` PATCH=`/usr/bin/cat showrev-p.out | $NAWK '/Patch: 117071/{print $2}' \ | /usr/bin/sort -run | /usr/bin/cut -d- -f2` if [ ${PATCH:-0} -ge 01 ] then Header "/usr/bin/kstat -p" $KSTAT $ECHO "\n\n`$DATE` - started" >> $KSTAT (/usr/bin/kstat -p >> $KSTAT; $ECHO "`$DATE` - ended" >> $KSTAT)& else $ECHO "kstat: patchid 117071-01 is missing" >> $ERRORLOG fi else # llc1 not loaded Header "/usr/bin/kstat -p" $KSTAT $ECHO "\n\n`$DATE` - started" >> $KSTAT (/usr/bin/kstat -p >> $KSTAT; $ECHO "`$DATE` - ended" >> $KSTAT)& fi #llc1 else $ECHO "kstat: patchid 113042-05 is missing" >> $ERRORLOG fi else # Solaris 10 and above Header "/usr/bin/kstat -p" $KSTAT $ECHO "\n\n`$DATE` - started" >> $KSTAT (/usr/bin/kstat -p >> $KSTAT; $ECHO "`$DATE` - ended" >> $KSTAT)& fi fi # qlc elif [ "$MINOR" -gt 5 ] then if [[ ${KRNLPATCH:-0} -eq 105181 && ${KRNLPATCHV:-0} -ge 33 ]] \ || [[ ${KRNLPATCH:-0} -eq 106541 && ${KRNLPATCHV:-0} -ge 20 ]] \ || [ "$MINOR" -gt 7 ] then Header "/usr/bin/netstat -k" $NETSTATK $ECHO "\n\n`$DATE` - started" >> $NETSTATK (/usr/bin/netstat -k >> $NETSTATK; $ECHO "`$DATE` - ended" >> $NETSTATK)& fi fi Progress 30 $PROGRESSLOOP # nfsstat Header "/usr/bin/nfsstat" $NFSSTAT $ECHO "\n\n`$DATE` - started" >> $NFSSTAT (/usr/bin/nfsstat >> $NFSSTAT; $ECHO "`$DATE` - ended" >> $NFSSTAT)& Progress 31 $PROGRESSLOOP # vxstat if [ -x /usr/sbin/vxstat -a -x /usr/sbin/vxdg ] then for DG in `/usr/sbin/vxdg list | grep enabled | $AWK '{print $1}'` do VXSTAT_DG="vxstat.${DG}" Header "/usr/sbin/vxstat -g $DG -i ${INTERVAL} -c ${COUNT} -psvd" $VXSTAT_DG $ECHO "\n\n`$DATE` - started" >> $VXSTAT_DG (/usr/sbin/vxstat -g $DG -i ${INTERVAL} -c ${COUNT} -psvd >> $VXSTAT_DG; \ $ECHO "`$DATE` - ended" 2>&1 >> $VXSTAT_DG )& done fi Progress 32 $PROGRESSLOOP # processor sets and bindings. Header "/usr/sbin/psrset" $PSRSET $ECHO "\n\n`$DATE` - started" >> $PSRSET (/usr/sbin/psrset >> $PSRSET 2>/dev/null; $ECHO "`$DATE` - ended" >> $PSRSET)& Progress 33 $PROGRESSLOOP Header "/usr/sbin/psrset -q" $PSRSETQ $ECHO "\n\n`$DATE` - started" >> $PSRSETQ (/usr/sbin/psrset -q >> $PSRSETQ 2>/dev/null; $ECHO "`$DATE` - ended" >> $PSRSETQ)& Progress 34 $PROGRESSLOOP Header "/usr/sbin/pbind" $PBIND $ECHO "\n\n`$DATE` - started" >> $PBIND (/usr/sbin/pbind >> $PBIND 2>/dev/null; $ECHO "`$DATE` - ended" >> $PBIND)& Progress 35 $PROGRESSLOOP # rcapstat data if [ $MINOR -ge 10 ] && [ -x /usr/bin/rcapstat ] then Header "/usr/bin/rcapstat -p $INTERVAL $COUNT" $RCAPSTATP $ECHO "\n\n`$DATE` - started" >> $RCAPSTATP (/usr/bin/rcapstat -p $INTERVAL $COUNT >> $RCAPSTATP 2>>$ERRORLOG; $ECHO "`$DATE` - ended" >> $RCAPSTATP)& Header "/usr/bin/rcapstat -z $INTERVAL $COUNT" $RCAPSTATZ $ECHO "\n\n`$DATE` - started" >> $RCAPSTATZ (/usr/bin/rcapstat -z $INTERVAL $COUNT >> $RCAPSTATZ 2>>$ERRORLOG; $ECHO "`$DATE` - ended" >> $RCAPSTATZ)& fi Progress 36 $PROGRESSLOOP # zpool data if [ $MINOR -ge 10 ] && [ -x /usr/sbin/zpool ] then ZLIST=`/usr/sbin/zpool list | /usr/bin/wc -l` if [ $ZLIST -gt 1 ] then Header "/usr/sbin/zpool iostat $INTERVAL $COUNT" $ZPOOLIOSTAT $ECHO "\n\n`$DATE` - started" >> $ZPOOLIOSTAT (/usr/sbin/zpool iostat $INTERVAL $COUNT >> $ZPOOLIOSTAT 2>>$ERRORLOG; $ECHO "`$DATE` - ended" >> $ZPOOLIOSTAT)& fi fi Progress 37 $PROGRESSLOOP # extra command if [ ! -z "$XTRA" ] then Header "${XTRA}" xtra.out $ECHO "\n\n`$DATE` - started" >> xtra.out ${XTRA} >> xtra.out 2>> xtra.err $ECHO "`$DATE` - ended" >> xtra.out fi Progress 38 $PROGRESSLOOP if [ "$QFLAG" -ne 1 ] then $ECHO "" $ECHO "End Iteration #$ITERATION_COUNT" $ECHO "Waiting for processes to terminate then sleeping $WAIT seconds before next iteration." $ECHO "" fi # wait until all child processes have completed to continue wait # Start TNF tracing if [ "$EXTENDED" -ge 2 ] then tnf $TNF $ITERATION_COUNT fi FILENO=`expr $FILENO + 1` ITERATIONS=`expr $ITERATIONS - 1` ITERATION_COUNT=`expr $ITERATION_COUNT + 1` if [ $ITERATIONS -ne 0 ] then sleep $WAIT fi done /usr/bin/cp -p /var/adm/mess* ${DIR} 2>> $ERRORLOG if [ "$QFLAG" -ne 1 ] then $ECHO "--- All processes finished. ---" fi ##################################################################### ##################################################################### ##################################################################### if [ "$QFLAG" -ne 1 ] then $ECHO "" $ECHO "Creating tarball...." fi cd ${DIR}/.. /usr/bin/chmod a+r * /usr/bin/tar -cf - $GUDS | /usr/bin/compress | /usr/bin/uuencode $FILE.Z > $FILE.Z.uu /usr/bin/chmod 666 $FILE.Z.uu /usr/bin/rm -f $FILE.Z ##################################################################### ##################################################################### ##################################################################### if [ -n "$FTP" ] then GUDS_FTP=`$ECHO ${FTP} | $NAWK -F/ '{ print $1 }'` GUDS_FTPDEST=`$ECHO ${FTP} | /usr/bin/sed -e "s~${GUDS_FTP}~~"` # Require host to be in /.netrc if [ $ROOT -ne 0 ] then eval '/usr/bin/egrep -s -e "${GUDS_FTP}" ~/.netrc' 2> /dev/null else eval '/usr/bin/egrep -s -e "${GUDS_FTP}" /.netrc' 2> /dev/null fi if [ "$?" -ne 0 ] then if [ $ROOT -ne 0 ] then $ECHO "Unable to find ${GUDS_FTP} in ~/.netrc, please update" else $ECHO "Unable to find ${GUDS_FTP} in /.netrc, please update" fi else # Found in /.netrc, make attempt to ftp GUDS_TMPFILE="/var/tmp/ftp.$$" /usr/bin/ftp ${GUDS_FTP} >${GUDS_TMPFILE}< cd /cores" $ECHO "\tftp> ascii" $ECHO "\tftp> put $FILE.Z.uu" $ECHO "\tftp> bye" $ECHO "\n\n\n" $ECHO "Instructions for emailing the data" $ECHO "\tPut \"Case $CASE\", in the subject line of the email." $ECHO "\tAttach the file $FILE.Z.uu to the email." $ECHO "" $ECHO "\tThen please call your support engineer or send him an email" $ECHO "\tto notify him that the output file is on supportfiles.sun.com." $ECHO "\tFor the USA, you can reach your support engineer by phone by" $ECHO "\tcalling 1-800USA4SUN, pressing 1, pressing 1, then dialing $CASE" $ECHO "" fi