#!/bin/sh # Copyright (c) International Business Machines Corp., 2003 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See # the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # FILE : ltpstress.sh # DESCRIPTION : A script that will stress your system using the LTP testsuite. # REQUIREMENTS: # 1) The 'rsh' daemon must be running and NFS (versions 2 &3) must be # configured into the kernel and installed for networking tests. # 2) The 'sar' application must be installed to use the "-S" option # HISTORY : # 02/11/2003 Robbie Williamson (robbiew@austin.ibm.com) # written # 11/20/2008 Aime Le Rouzic (aime.lerouzic@bull.net) # adapt script to work with portmap and rpcbind ############################################################## export LTPROOT=${PWD} echo $LTPROOT | grep testscripts > /dev/null 2>&1 if [ $? -eq 0 ]; then cd .. export LTPROOT=${PWD} fi export TMPBASE="/tmp" export PATH=$LTPROOT/testcases/bin:$PATH memsize=0 hours=24 PROC_NUM=0 leftover_memsize=0 duration=86400 datafile="/tmp/ltpstress.data" iofile="/tmp/ltpstress.iodata" logfile="/tmp/ltpstress.log" interval=10 Sar=0 Top=0 Iostat=0 LOGGING=0 PRETTY_PRT="" QUIET_MODE="" NO_NETWORK=0 usage() { cat <<-END >&2 usage: ${0##*/} [ -d datafile ] [ -i # (in seconds) ] [ -I iofile ] [ -l logfile ] [ -m # (in Mb) ] [ -n ] [ -p ] [ -q ] [ -t duration ] [ -x TMPDIR ] [-b DEVICE] [-B LTP_DEV_FS_TYPE] [ [-S]|[-T] ] -d datafile Data file for 'sar' or 'top' to log to. Default is "/tmp/ltpstress.data". -i # (in sec) Interval that 'sar' or 'top' should take snapshots. Default is 10 seconds. -I iofile Log results of 'iostat' to a file every interval. Default is "/tmp/ltpstress.iodata". -l logfile Log results of test in a logfile. Default is "/tmp/ltpstress.log" -m # (in Mb) Specify the _minimum_ memory load of # megabytes in background. Default is all the RAM + 1/2 swap. -n Disable networking stress. -p Human readable format logfiles. -q Print less verbose output to the output files. -S Use 'sar' to measure data. -T Use LTP's modified 'top' tool to measure data. -t duration Execute the testsuite for given duration in hours. Default is 24. -x TMPDIR Directory where temporary files will be created. -b DEVICE Some tests require an unmounted block device to run correctly. If DEVICE is not set, a loop device is created and used automatically. -B LTP_DEV_FS_TYPE The file system of DEVICE. example: ${0##*/} -d /tmp/sardata -l /tmp/ltplog.$$ -m 128 -t 24 -S END exit } check_memsize() { while [ $memsize -gt 1048576 ] #if greater than 1GB do PROC_NUM=$(( PROC_NUM + 1 )) memsize=$(( $memsize - 1048576 )) done leftover_memsize=$memsize } while getopts d:hi:I:l:STt:m:npqx:b:B:\? arg do case $arg in d) datafile="$OPTARG";; h) echo "Help info:" usage;; i) interval=$OPTARG;; I) Iostat=1 iofile=$OPTARG;; l) logfile=$OPTARG LOGGING=1;; m) memsize=$(($OPTARG * 1024)) check_memsize;; n) NO_NETWORK=1;; p) PRETTY_PRT=" -p ";; q) QUIET_MODE=" -q ";; S) if [ $Top -eq 0 ]; then Sar=1 else echo "Cannot specify -S and -T...exiting" exit fi;; T) if [ $Sar -eq 0 ]; then $LTPROOT/testcases/bin/top -h 2>&1 | grep "\-f filename" >/dev/null if [ $? -eq 0 ]; then Top=1 else echo "ERROR: Please build and install the version of top in the /tools dir" exit fi else echo "Cannot specify -S and -T...exiting" exit fi;; t) hours=$OPTARG duration=$(($hours * 60 * 60));; x) export TMPBASE=$(readlink -f ${OPTARG});; b) export LTP_DEV=${OPTARG};; B) export LTP_DEV_FS_TYPE=${OPTARG};; \?) echo "Help info:" usage;; esac done export TMP="${TMPBASE}/ltpstress-$$" export TMPDIR=${TMP} mkdir -p ${TMP} # to write as user nobody into tst_tmpdir() chmod 777 $TMP || \ { echo "unable to chmod 777 $TMP ... aborting" exit 1 } cd $TMP || \ { echo "could not cd ${TMP} ... exiting" exit 1 } if [ $NO_NETWORK -eq 0 ];then # Networking setup echo `hostname` >> /root/.rhosts chmod 644 /root/.rhosts netstat -an | grep 514 if [ $? -eq 1 ];then echo "Error: 'rsh' daemon not active on this machine." exit 1 fi ps -ef | grep portmap | grep -v grep if [ $? -eq 1 ];then ps -ef | grep rpcbind | grep -v grep if [ $? -eq 1 ];then echo "Portmap and rpcbind not running" echo "Let's start portmap" /sbin/portmap & sleep 1 ps -ef | grep portmap | grep -v grep if [ $? -eq 1 ];then echo "Could not start portmap, Let's start rpcbind" /sbin/rpcbind & sleep 1 ps -ef | grep rpcbind | grep -v grep if [ $? -eq 1 ];then Echo "Error: Could not start rpcbind daemon." exit 1 else echo "The RPC test suite is using rpcbind" fi else echo "The RPC test suite is using portmap" fi else echo "The RPC test suite is using rpcbind" fi else echo "The RPC test suite is using portmap" fi ps -e | grep nfsd if [ $? -eq 1 ];then /usr/sbin/rpc.nfsd fi sleep 1 ps -e | grep nfsd if [ $? -eq 1 ];then echo "Error: Could not start nfs server daemon." exit 1 fi ps -e | grep rpc.statd if [ $? -eq 1 ];then /sbin/rpc.statd fi sleep 1 ps -e | grep rpc.statd if [ $? -eq 1 ];then echo "Error: Could not start statd daemon." exit 1 fi ps -e | grep rpc.mountd if [ $? -eq 1 ];then /usr/sbin/rpc.mountd fi sleep 1 ps -e | grep rpc.mountd if [ $? -eq 1 ];then echo "Error: Could not start mountd daemon." exit 1 fi # End of network setup fi #If -m not set, use all the RAM + 1/2 swapspace if [ $memsize -eq 0 ]; then TOTALRAM=$(free -m | grep Mem: | awk {'print $2'}) TOTALSWAP=$(free -m | grep Swap: | awk {'print $2'}) TESTSWAP=$(($TOTALSWAP / 2)) if [ $TESTSWAP -eq 0 ]; then #if there is no swap in the system, use only the free RAM TESTMEM=$(free -m | grep Mem: | awk {'print $4'}) else TESTMEM=$(($TESTSWAP + $TOTALRAM)) fi #Convert to kilobytes memsize=$(($TESTMEM * 1024)) check_memsize fi # Set max processes to unlimited. ulimit -u unlimited if [ $PROC_NUM -gt 0 ];then genload --vm $PROC_NUM --vm-bytes 1073741824 >/dev/null 2>&1 & fi if [ $leftover_memsize -gt 0 ];then genload --vm 1 --vm-bytes $(($leftover_memsize * 1024)) >/dev/null 2>&1 & fi if [ $NO_NETWORK -eq 0 ];then netpipe.sh >/dev/null 2>/dev/null & fi sort -R ${LTPROOT}/runtest/stress.part1 -o ${TMP}/stress.part1 sort -R ${LTPROOT}/runtest/stress.part2 -o ${TMP}/stress.part2 sort -R ${LTPROOT}/runtest/stress.part3 -o ${TMP}/stress.part3 sleep 2 if [ $Sar -eq 1 ]; then sar -o $datafile $interval > /dev/null & fi if [ $Top -eq 1 ]; then screen -d -m $LTPROOT/testcases/bin/top -o $datafile -d $interval & SCREEN_PID=$(ps -e | grep screen | awk {'print $1'}) fi sleep 2 if [ $Iostat -eq 1 ]; then while [ 0 = 0 ];do iostat -dt >> $iofile; sleep $interval;done & Iostat_PID=$? fi sleep 2 output1=${TMPBASE}/ltpstress.$$.output1 output2=${TMPBASE}/ltpstress.$$.output2 output3=${TMPBASE}/ltpstress.$$.output3 ${LTPROOT}/bin/ltp-pan -e ${PRETTY_PRT} ${QUIET_MODE} -S -t ${hours}h -a stress1 -n stress1 -l $logfile -f ${TMP}/stress.part1 -o $output1 & ${LTPROOT}/bin/ltp-pan -e ${PRETTY_PRT} ${QUIET_MODE} -S -t ${hours}h -a stress2 -n stress2 -l $logfile -f ${TMP}/stress.part2 -o $output2 & ${LTPROOT}/bin/ltp-pan -e ${PRETTY_PRT} ${QUIET_MODE} -S -t ${hours}h -a stress3 -n stress3 -l $logfile -f ${TMP}/stress.part3 -o $output3 & echo "Running LTP Stress for $hours hour(s) using $(($memsize/1024)) Mb" echo "" echo "Test output recorded in:" echo " $output1" echo " $output2" echo " $output3" # Sleep a little longer than duration to let ltp-pan "try" to gracefully end itself. sleep $(($duration + 10)) if [ $Sar -eq 1 ]; then killall -9 sadc >/dev/null 2>&1 fi if [ $Top -eq 1 ]; then kill $SCREEN_PID >/dev/null 2>&1 fi killall -9 ltp-pan >/dev/null 2>&1 killall -9 genload >/dev/null 2>&1 if [ $NO_NETWORK -eq 0 ];then killall -9 netpipe.sh >/dev/null 2>&1 killall -9 NPtcp >/dev/null 2>&1 fi if [ $Iostat -eq 1 ];then kill -9 $Iostat_PID >/dev/null 2>&1 fi rm -rf ${TMP} echo "Testing done" if [ $LOGGING -eq 1 ];then if [ ! -z $PRETTY_PRT ]; then grep FAIL $logfile > /dev/null 2>&1 else grep 'stat=' $logfile | grep -v 'stat=0' > /dev/null 2>&1 fi if [ $? -eq 1 ]; then echo "All Tests PASSED!" else echo "Testing yielded failures. See logfile: $logfile" if [ $NO_NETWORK -eq 1 ];then echo "The NFS related tests should fail because network stress was disabled" fi fi fi