1 #!/bin/bash 2 # 3 # This program is free software; you can redistribute it and/or 4 # modify it under the terms of the GNU General Public 5 # License as published by the Free Software Foundation; either 6 # version 2 of the License, or (at your option) any later version. 7 # 8 # This program is distributed in the hope that it will be useful, 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 # General Public License for more details. 12 # 13 # You should have received a copy of the GNU General Public 14 # License along with this program; if not, write to the 15 # Free Software Foundation, Inc., 59 Temple Place - Suite 330, 16 # Boston, MA 021110-1307, USA. 17 # 18 # Copyright (C) 2008 Andrea Righi <righi.andrea (at] gmail.com> 19 # 20 # Usage: ./run_io_throttle_test.sh 21 # Description: test block device I/O bandwidth controller functionalities 22 23 . ./myfunctions-io.sh 24 25 trap cleanup SIGINT 26 27 BUFSIZE=16m 28 DATASIZE=64m 29 30 setup 31 32 # get the device name of the entire mounted block device 33 dev=`df -P . | sed '1d' | cut -d' ' -f1 | sed 's/[p]*[0-9]*$//'` 34 35 # evaluate device bandwidth 36 export MYGROUP= 37 phys_bw=`./iobw -direct 1 $BUFSIZE $DATASIZE | grep TOTAL | awk '{print $7}'` 38 if [ $? -ne 0 ]; then 39 echo "ERROR: could not evaluate i/o bandwidth of $dev. Exiting test." 40 cleanup 41 exit 1 42 fi 43 echo ">> physical i/o bandwidth limit is: $phys_bw KiB/s" 44 # show cgroup i/o bandwidth limits 45 for i in `seq 1 3`; do 46 MYGROUP=cgroup-$i 47 echo "($MYGROUP) max i/o bw: " \ 48 "$(($phys_bw / `echo 2^$i | bc`)) KiB/s + O_DIRECT" 49 done 50 51 for tasks in 1 2 4; do 52 for strategy in 0 1; do 53 # set bw limiting rules 54 if [ -f /dev/blockioctl/blockio.bandwidth ]; then 55 io_throttle_file=blockio.bandwidth 56 elif [ -f /dev/blockioctl/blockio.bandwidth-max ]; then 57 io_throttle_file=blockio.bandwidth-max 58 else 59 echo "ERROR: unknown kernel ABI. Exiting test." 60 cleanup 61 exit 1 62 fi 63 for i in `seq 1 3`; do 64 limit=$(($phys_bw * 1024 / `echo 2^$i | bc`)) 65 IOBW[$i]=$(($limit / 1024)) 66 /bin/echo $dev:$limit:$strategy:$limit > \ 67 /dev/blockioctl/cgroup-$i/${io_throttle_file} 68 if [ $? -ne 0 ]; then 69 echo "ERROR: could not set i/o bandwidth limit for cgroup-$i. Exiting test." 70 cleanup 71 exit 1 72 fi 73 done 74 75 # run benchmark 76 if [ $tasks -eq 1 ]; then 77 stream="stream" 78 else 79 stream="streams" 80 fi 81 echo -n ">> testing $tasks parallel $stream per cgroup " 82 if [ $strategy -eq 0 ]; then 83 echo "(leaky-bucket i/o throttling)" 84 else 85 echo "(token-bucket i/o throttling)" 86 fi 87 for i in `seq 1 3`; do 88 MYGROUP=cgroup-$i 89 /bin/echo $$ > /dev/blockioctl/$MYGROUP/tasks 90 if [ $? -ne 0 ]; then 91 echo "ERROR: could not set i/o bandwidth limit for cgroup-$i. Exiting test." 92 cleanup 93 exit 1 94 fi 95 # exec i/o benchmark 96 ./iobw -direct $tasks $BUFSIZE $DATASIZE > /tmp/$MYGROUP.out & 97 PID[$i]=$! 98 done 99 /bin/echo $$ > /dev/blockioctl/tasks 100 101 # wait for children completion 102 for i in `seq 1 3`; do 103 MYGROUP=cgroup-$i 104 wait ${PID[$i]} 105 ret=$? 106 if [ $ret -ne 0 ]; then 107 echo "ERROR: error code $ret during test $tasks.$strategy.$i. Exiting test." 108 cleanup 109 exit 1 110 fi 111 iorate=`grep parent /tmp/${MYGROUP}.out | awk '{print $7}'` 112 diff=$((${IOBW[$i]} - $iorate)) 113 echo "($MYGROUP) i/o-bw ${IOBW[$i]} KiB/s, i/o-rate $iorate KiB/s, err $diff KiB/s" 114 if [ ${IOBW[$i]} -ge $iorate ]; then 115 echo "TPASS Block device I/O bandwidth controller: test $tasks.$strategy.$i PASSED"; 116 else 117 echo "TFAIL Block device I/O bandwidth controller: test $tasks.$strategy.$i FAILED"; 118 fi 119 done 120 done 121 done 122 123 cleanup 124