#! /bin/ksh # Be sure to ftp in binary mode. # Script for collecting performance data for IBM XPS system. # Multiplatform and platform-independent get_xps_data() { #Same command for all platforms onstat -g osi > PERFORMANCE/OSCONFIG/osi.txt # Collect an initial set of onstats data. env > PERFORMANCE/IDSCONFIG/env.txt #sqlhosts env | grep INFORMIXSQLHOSTS > /dev/null if [ $? = 0 ] then cat $INFORMIXSQLHOSTS > PERFORMANCE/IDSCONFIG/sqlhosts.txt else cat $INFORMIXDIR/etc/sqlhosts > PERFORMANCE/IDSCONFIG/sqlhosts.txt fi onstat -g env > PERFORMANCE/IDSCONFIG/env.txt onstat -c > PERFORMANCE/IDSCONFIG/onconfig.txt onstat -d > PERFORMANCE/IDSCONFIG/dbspaces.txt # Dump the last 5000 lines of the online.log #oncheck -pr | grep MSGPATH > msg.txt onstat -c | grep "^MSGPATH" > msg.txt tail -5000 `awk '{print $2}' msg.txt` > PERFORMANCE/INSTANCE/online.log1 rm msg.txt echo " " echo "Consider collecting stacks with an OS command as super user." echo "While this data can be extremely valuable, especially for hangs," echo "the command can sometimes crash the instance." echo "You may want to check with tech support first." echo "To enable the stack collection, enter y or Y:" echo " " read STACKS if [ ${STACKS} = Y ] || [ ${STACKS} = y ] then STACKS=n echo " " echo "Are you sure you want to collect the stacks?" echo "To confirm you want stack collection, enter y or Y:" echo " " read STACKS fi echo " " echo "Enter the seconds to sleep between the sets of onstat" echo "and the total number of iterations (data collections)." echo "The recommended sleep time is 300 and minimum recommended" echo "iterations is 5." echo " " echo "Enter the sleep time." echo " " read SLEEP echo " " while [ "$SLEEP" = "" ] do echo "You did not enter the sleep time . Please enter it now." echo "Otherwise use control-c to interupt." echo " " read SLEEP done echo "Enter the number of iterations." echo " " read ITERATIONS echo " " while [ "$ITERATIONS" = "" ] do echo "You did not enter a number of iterations . Please enter it now." echo "Otherwise use control-c to interupt." echo " " read ITERATIONS done echo "Sleep time between onstats: $SLEEP seconds." >> \ PERFORMANCE/INSTANCE/onstats.txt echo "onstat -P" > PERFORMANCE/INSTANCE/P-.txt for i in C D p F R l u x G b k t ckp glo sch sql ses ses0 stm \ ioq iof seg rea act ath tpf cpu mgm mem vpcache \ sts scn nta lmx wmx cac dic con opn ppf ioa \ spi his stk \ dfm lap rgm rwm xmf xmp do touch PERFORMANCE/INSTANCE/${i}_.txt done # Now enter outer LOOP for controlling collection iterations LOOPCOUNT=0 while [ $LOOPCOUNT -lt $ITERATIONS ] do echo "Collecting set `expr ${LOOPCOUNT} + 1` of onstat data ....." echo "===================================================" >> \ PERFORMANCE/INSTANCE/P-.txt echo "onstat -P" >> PERFORMANCE/INSTANCE/P-.txt onstat -P >> PERFORMANCE/INSTANCE/P-.txt for i in C D p F R l u x G b k t do echo "===================================================" >> \ PERFORMANCE/INSTANCE/${i}_.txt echo "onstat -$i" >> PERFORMANCE/INSTANCE/${i}_.txt #don't background the first collection because we zero afterwords if [ ${LOOPCOUNT} -eq 0 ] then onstat -$i >> PERFORMANCE/INSTANCE/${i}_.txt else onstat -$i >> PERFORMANCE/INSTANCE/${i}_.txt & fi done for j in ckp glo sch sql ses stm ioq iof seg rea act ath \ tpf cpu mgm mem vpcache \ sts scn nta lmx wmx cac dic con opn ppf ioa spi his \ dfm lap rgm rwm xmf xmp do echo "===================================================" >> \ PERFORMANCE/INSTANCE/${j}_.txt echo "onstat -g $j" >> PERFORMANCE/INSTANCE/${j}_.txt #don't background the first collection because we zero afterwords if [ ${LOOPCOUNT} -eq 0 ] then onstat -g $j >> PERFORMANCE/INSTANCE/${j}_.txt else onstat -g $j >> PERFORMANCE/INSTANCE/${j}_.txt & fi done echo "===================================================" >> \ PERFORMANCE/INSTANCE/ses0_.txt echo "onstat -g ses 0" >> PERFORMANCE/INSTANCE/ses0_.txt onstat -g ses 0 >> PERFORMANCE/INSTANCE/ses0_.txt echo "===================================================" >> \ PERFORMANCE/INSTANCE/stk_.txt echo "onstat -g stk all" >> PERFORMANCE/INSTANCE/stk_.txt onstat -g stk all >> PERFORMANCE/INSTANCE/stk_.txt echo " " if [ ${STACKS} = Y ] || [ ${STACKS} = y ] then DMP=`onstat -g ras | grep DUMPDIR | awk '{print $2}'` touch $DMP/t.txt mkdir PERFORMANCE/INSTANCE/PSTACK_${LOOPCOUNT} for i in `onstat -g glo | grep "^ *[1-9]" | grep cpu | awk '{print $2}'` do ${GETSTACK} ${i} > PERFORMANCE/INSTANCE/PSTACK_${LOOPCOUNT}/${i}_stk.txt done chmod 666 PERFORMANCE/INSTANCE/PSTACK_${LOOPCOUNT}/* fi echo "done" echo " " if [ ${LOOPCOUNT} -eq 0 ] then echo "Onstats are zeroed after this first data collection." echo " " echo "Executed onstat -z after first data collection" > \ PERFORMANCE/INSTANCE/README.txt onstat -z > /dev/null fi LOOPCOUNT=`expr ${LOOPCOUNT} + 1` if [ ${LOOPCOUNT} -ne ${ITERATIONS} ] then echo "Sleeping $SLEEP seconds before collecting next set of onstats" echo " " sleep $SLEEP echo "done sleeping" echo " " fi done #end of outer loop #Now dump the last 5000 lines of the online.log #oncheck -pr | grep MSGPATH > msg.txt onstat -c | grep MSGPATH > msg.txt tail -5000 `awk '{print $2}' msg.txt` > PERFORMANCE/INSTANCE/online.log2 rm msg.txt } get_os_data() { set_num=$1 osname=`uname -s` if [ $osname = "AIX" ]; then GETSTACK=/bin/procstack get_aix_data set_num elif [ $osname = "HP-UX" ]; then GETSTACK=/usr/ccs/bin/pstack get_hp_data set_num elif [ $osname = "SunOS" ]; then GETSTACK=/usr/bin/pstack get_sun_data set_num else echo "Platform not supported. \n" exit 1 fi } get_aix_data() { set_num=$1 echo "Collecting AIX OS data .... this may take a few seconds" #OS CONFIG info /usr/bin/oslevel > PERFORMANCE/OSCONFIG/machine.txt 2>&1 /usr/sbin/lsattr -E -l sys0 >> PERFORMANCE/OSCONFIG/machine.txt 2>&1 /usr/sbin/lsdev -C >> PERFORMANCE/OSCONFIG/machine.txt 2>&1 no -a >> PERFORMANCE/OSCONFIG/machine.txt 2>&1 /usr/bin/lslpp -ah > PERFORMANCE/OSCONFIG/lslpp.txt 2>&1 errpt -a > PERFORMANCE/OSCONFIG/errpt.txt 2>&1 #OS data uptime > PERFORMANCE/OSDATA/uptime.$set_num 2>&1 netstat -v > PERFORMANCE/OSDATA/netstat.$set_num 2>&1 netstat -s -f inet >> PERFORMANCE/OSDATA/netstat.$set_num 2>&1 netstat -m >> PERFORMANCE/OSDATA/netstat.$set_num 2>&1 nfsstat > PERFORMANCE/OSDATA/nfsstat.$set_num 2>&1 vmstat > PERFORMANCE/OSDATA/vmstat.$set_num 2>&1 iostat > PERFORMANCE/OSDATA/iostat.$set_num 2>&1 ps -kelf > PERFORMANCE/OSDATA/pskelf.$set_num 2>&1 ps aux > PERFORMANCE/OSDATA/psaux.$set_num 2>&1 ipcs -a > PERFORMANCE/OSDATA/ipcs.$set_num 2>&1 lsps -a > PERFORMANCE/OSDATA/lsps.$set_num 2>&1 echo " " echo "done" echo " " } get_hp_data() { echo "Collecting HP-UX OS data .... this may take a few seconds" #OS CONFIG info /usr/bin/uname -a > PERFORMANCE/OSCONFIG/uname.txt 2>&1 /usr/bin/model > PERFORMANCE/OSCONFIG/model.txt 2>&1 /etc/sysdef > PERFORMANCE/OSCONFIG/sysdef.txt 2>&1 /usr/sbin/swlist -v > PERFORMANCE/OSCONFIG/swlist.txt 2>&1 #OS data uptime > PERFORMANCE/OSDATA/uptime.$set_num 2>&1 netstat -v > PERFORMANCE/OSDATA/netstat.$set_num 2>&1 netstat -s -f inet >> PERFORMANCE/OSDATA/netstat.$set_num 2>&1 nfsstat > PERFORMANCE/OSDATA/nfsstat.$set_num 2>&1 vmstat > PERFORMANCE/OSDATA/vmstat.$set_num 2>&1 iostat -t > PERFORMANCE/OSDATA/iostat.$set_num 2>&1 /usr/bin/ps -elf > PERFORMANCE/OSDATA/pself.$set_num 2>&1 ipcs -a > PERFORMANCE/OSDATA/ipcs.$set_num 2>&1 echo " " echo "done" echo " " } get_sun_data() { echo "Collecting Sun OS data .... this may take a few seconds" #OS CONFIG info /usr/bin/uname -a > PERFORMANCE/OSCONFIG/uname.txt 2>&1 /etc/sysdef > PERFORMANCE/OSCONFIG/sysdef.txt 2>&1 /etc/prtconf > PERFORMANCE/OSCONFIG/prtconf.txt 2>&1 /usr/sbin/psrinfo -v > PERFORMANCE/OSCONFIG/psrinfo.txt 2>&1 /usr/bin/showrev -p > PERFORMANCE/OSCONFIG/showrev.txt 2>&1 /usr/bin/pkginfo -l > PERFORMANCE/OSCONFIG/pkginfo.txt 2>&1 #OS data uptime > PERFORMANCE/OSDATA/uptime.$set_num 2>&1 netstat -v > PERFORMANCE/OSDATA/netstat.$set_num 2>&1 netstat -s -f inet >> PERFORMANCE/OSDATA/netstat.$set_num 2>&1 netstat -m >> PERFORMANCE/OSDATA/netstat.$set_num 2>&1 nfsstat > PERFORMANCE/OSDATA/nfsstat.$set_num 2>&1 vmstat > PERFORMANCE/OSDATA/vmstat.$set_num 2>&1 vmstat -s >> PERFORMANCE/OSDATA/vmstat.$set_num 2>&1 mpstat > PERFORMANCE/OSDATA/mpstat.$set_num 2>&1 iostat -xc > PERFORMANCE/OSDATA/iostat.$set_num 2>&1 /usr/bin/ps -elf > PERFORMANCE/OSDATA/pself.$set_num 2>&1 /usr/ucb/ps avwx > PERFORMANCE/OSDATA/psavwx.$set_num 2>&1 ipcs -a > PERFORMANCE/OSDATA/ipcs.$set_num 2>&1 echo " " echo "done" echo " " } cleanup() { # Clean up and prepare data for submitting to # Technical support # Package up the files. If a zip file cannot # be created, then create and gzip a tar file. zip ${CASENUMBER}.${COSERVER}.perf.zip -r PERFORMANCE if [ ! -f ${CASENUMBER}.${COSERVER}.perf.zip ] then tar -cvf ${CASENUMBER}.${COSERVER}.perf.tar PERFORMANCE gzip ${CASENUMBER}.${COSERVER}.perf.tar fi echo " " echo " " echo " " echo "=========================================================" if [ -f ${CASENUMBER}.${COSERVER}.perf.zip ] then echo "Please submit file \"${CASENUMBER}.${COSERVER}.perf.zip\" to" echo "IBM Informix technical support." else if [ -f ${CASENUMBER}.${COSERVER}.perf.tar.gz ] then echo "Please submit file \"${CASENUMBER}.${COSERVER}.perf.tar.gz\" to" echo "IBM Informix technical support." else echo "Program did not create file to submit." echo "Please contact IBM Informix technical support." fi fi echo "=========================================================" echo " " echo " " echo "Program over" echo " " } ### Main Program ### COSERVER=$INFORMIXSERVER # Check the user if [ `id | awk '{print $1;}' | cut -d\( -f 2 | cut -d\) -f 1` != "informix" ] then echo " " echo " Your USER id is not informix. This script should be" echo " run as informix for full data collection. Exit with" echo " interrupt (control-c) if you do not wish to continue." echo " Otherwise, hit to continue." echo " " read ANSWER fi # Get the PMR number from user echo " " echo "This script first collects operating system information" echo "and then onstats data. The user determines whether stacks" echo "are collected using an OS command, the number of iterations" echo "for collecting onstats, and the wait between loops. " echo " " echo "Please enter the PMR number, using periods for separators. For" echo "example, if the PMR is \"11111,111,111\", you would type this:" echo " " echo "11111.111.111" echo " " echo "Type yours and and hit enter:" echo " " read CASENUMBER while [ "$CASENUMBER" = "" ] do echo "You did not enter a PMR. Please enter it now." echo "Otherwise use control-c to interupt." echo " " read CASENUMBER done if [ -f ${CASENUMBER}.${COSERVER}.perf.zip ] || [ -f ${CASENUMBER}.${COSERVER}.perf.tar.gz ] then echo "Output file already exists" exit 1 fi if [ -d PERFORMANCE ] then echo " " echo "Directory PERFORMANCE already exists" echo " " exit 1 else mkdir PERFORMANCE if [ $? != 0 ] then exit 0 fi fi mkdir PERFORMANCE/OSCONFIG mkdir PERFORMANCE/OSDATA mkdir PERFORMANCE/INSTANCE mkdir PERFORMANCE/IDSCONFIG # Copying the MustGather script if [ -f $0 ] then cp $0 PERFORMANCE/ fi echo " " echo "PMR: $CASENUMBER" > PERFORMANCE/INSTANCE/onstats.txt echo "Date: `date`" >> PERFORMANCE/INSTANCE/onstats.txt # Collecting of OS data get_os_data 1 # Collecting XPS data get_xps_data # Collecting second set of OS data get_os_data 2 # Package all caltured data and cleanup cleanup