123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- #!/bin/bash
- # usage ./runcpuctl_latency_test.sh
- ###############################################################################
- # Copyright (c) International Business Machines Corp., 2008 #
- # #
- # 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 #
- # #
- ###############################################################################
- # Name Of File: run_cpuctl_test.sh #
- # #
- # Description: This file runs the setup for testing latency under heavy load #
- # when group scheduling is enabled #
- # After setup it runs diff test cases in diff setup. #
- # #
- # Test 01: Tests latency when no cgroup is mounted #
- # Test 02: Tests latency when cgroup is mounted #
- # #
- # #
- # Author: Sudhir Kumar <skumar@linux.vnet.ibm.com> #
- # #
- # History: #
- # #
- # DATE NAME EMAIL DESC #
- # #
- # 26/11/08 Sudhir Kumar <skumar@linux.vnet.ibm.com> Created this test #
- # #
- ###############################################################################
- NUM_TASKS=100;
- NUM_GROUPS=2; #for default
- check_task="";
- declare -a pid;
- allowed_latency=10;
- export TCID="cpuctl_latency_test";
- export TST_COUNT=1;
- export TST_TOTAL=2;
- . parameters.sh
- latency_cleanup()
- {
- local i;
- if [ -n "${pid[1]}" ]; then
- for i in $(seq 1 $NUM_TASKS)
- do
- kill -s SIGUSR1 ${pid[$i]} 2>/dev/null;
- done
- fi
- sleep 2;
- if [ $TEST_NUM -eq 2 ]; then
- # move any remaining task
- sleep 2;
- for task in `cat /dev/cpuctl/group*/tasks`; do
- echo $task > /dev/cpuctl/tasks #2>/dev/null 1>&2;
- done
- rmdir /dev/cpuctl/group* #2> /dev/null
- umount /dev/cpuctl #2> /dev/null
- rmdir /dev/cpuctl #2> /dev/null
- rm -f myfifo;
- fi;
- echo "Cleanup done for latency test $TEST_NUM"
- echo
- }
- log2()
- {
- local x=$1 n=2 l=-1;
- while((x));do
- let l+=1
- let x/=n;
- done;
- return $l;
- }
- # There is no single criterion for max latency, so pass or fail is only
- # intuitive. Here we use the same logic as by the kernel
- calc_allowed_latency()
- {
- # default sched granularity=5ms if not exported by kernel
- def_gran=5000 #in microseconds
- if [ -f /proc/sys/kernel/sched_wakeup_granularity_ns ]; then
- sys_latency=`cat /proc/sys/kernel/sched_wakeup_granularity_ns`
- allowed_latency=`expr $sys_latency / 1000` # in microseconds
- else
- num_cpus=`tst_ncpus`
- log2 $num_cpus;
- ln_num_cpus=$?
- ln_num_cpus=`expr $ln_num_cpus + 1`
- allowed_latency=`expr $ln_num_cpus \* $def_gran`
- fi
- # To be more practical we will take our criterio as double of this value
- allowed_latency=`expr $allowed_latency \* 2`
- }
- PWD=`pwd`
- ################################
- # Start
- ################################
- TEST_NUM=$1;
- if [ -z $TEST_NUM ]; then
- echo "Invalid test no passed to test script"
- echo "Exiting the test..."
- exit 1;
- fi;
- cd $LTPROOT/testcases/bin/ #Bad idea????????
- # Check if sources are compiled
- if [ ! -f $cpuctl_latency_test ] || [ ! -f $cpuctl_latency_check_task ]
- then
- echo "TBROK The sources are not compiled...."
- cd $PWD;
- exit 1;
- fi
- # Keep the signal handler ready
- trap 'echo "Doing cleanup"; latency_cleanup;' 0;
- # Calculate the alowed latency value
- calc_allowed_latency;
- case $TEST_NUM in
- "1") #without creating any groups
- # Run the load creating tasks
- echo TINFO "Running cpuctl Latency Test 1"
- for i in $(seq 1 $NUM_TASKS)
- do
- # Execute the load tasks
- ./cpuctl_latency_test $TEST_NUM &
- if [ $? -ne 0 ]
- then
- echo "TBROK Failed to execute binary"
- exit;
- else
- pid[$i]=$!;
- fi
- done
- # Run the latency checking task
- ./cpuctl_latency_check_task $TEST_NUM $$ $allowed_latency &
- if [ $? -ne 0 ]
- then
- echo "TBROK Failed to execute main binary"
- exit;
- else
- check_task=$!;
- fi;
- ;;
- "2") # With group scheduling
- echo TINFO "Running cpuctl Latency Test 2"
- NUM_CPUS=`tst_ncpus`
- get_num_groups; # NUM_GROUPS is set now
- do_setup;
- for num in $(seq 1 $NUM_TASKS)
- do
- group=/dev/cpuctl/group_`expr $num % $NUM_GROUPS + 1`;
- ./cpuctl_latency_test $TEST_NUM $group &
- if [ $? -ne 0 ]
- then
- echo "TBROK Failed to execute binary"
- exit;
- else
- pid[$num]=$!;
- fi;
- done;
- # Calculate the alowed latency value
- ./cpuctl_latency_check_task $TEST_NUM $$ $allowed_latency $group &
- if [ $? -ne 0 ]
- then
- echo "TBROK Failed to execute main binary";
- exit;
- else
- check_task=$!;
- fi;
- ;;
- * ) # wrong test num
- echo TBROK "Invalid test number passed to the script"
- exit;
- ;;
- esac;
- wait $check_task;
- RC=$?; # Return status of the task being waited
- if [ $RC -ne 0 ]
- then
- echo "Task $check_task exited abnormaly with return value: $RC";
- echo TBROK "Test could'nt execute for expected duration";
- fi
- cd $PWD;
|