#!/bin/bash # # A script intended to provide help with characterizing a block device and # provide help with setting IO scheduler tunbales accordingly. # # Author: Vivek Goyal generate_report_nr_procs () { local nr_procs=$1 local individual_bw local individual_bw_copy local bw local total_bw=0 individual_bw=`cat $TEMPFILE | sed -n "/BEGIN NR_PROCESSES=$nr_procs/,/END NR_PROCESSES=$nr_procs/p" | grep "bytes.*copied" | awk -F ',' '{print $3}' | awk '{print $1}' | sed -e :a -e '$!N;s/\n/ /;ta'` # echo "individual bw is $individual_bw" for bw in $individual_bw;do total_bw=`echo "$total_bw + $bw" | bc` done printf "%-8s%-10s%-60s\n" $nr_procs $total_bw "$individual_bw" } generate_report () { local i for ((i=1; i<=$MAX_NR_PROCESSES; i=$i*2)) { generate_report_nr_procs $i } } # Run the test for nr processes run_test_nr_processes () { local nr_processes=$1 local bdev_size_bytes=`blockdev --getsize64 $BLOCKDEV` local bdev_nr_ibs=$(($bdev_size_bytes/$BS)) local nr_ibs_per_process=$(($bdev_nr_ibs/$nr_processes)) local j # disk might be big. By default read 512MB of data per process local nr_blocks_to_read=$(((512*1024*1024)/$BS)) # Run processes for((j=1; j<=$nr_processes; j++)) { local skip_mult=$(($j-1)) local skip_blocks=$(($nr_ibs_per_process*$skip_mult)) dd if=$BLOCKDEV of=/dev/null ibs=$BS count=$nr_blocks_to_read skip=$skip_blocks >> $TEMPFILE 2>&1 & } } start_test () { local i # Launch increasing number of dd threads. Determine device capacity # divide the total capacity by number of threads and let different # threads work on different area of block device. echo "Will Run up to $MAX_NR_PROCESSES readers" for((i=1; i<=$MAX_NR_PROCESSES; i=$i*2)) { echo "Running test with $i readers" echo "BEGIN NR_PROCESSES=$i" >> $TEMPFILE run_test_nr_processes $i wait echo "END NR_PROCESSES=$i" >> $TEMPFILE } } Usage () { echo "Usage: $0 DEVICE" } # Main script if [ $# -lt 1 ];then Usage exit 1 fi BLOCKDEV=$1 # default block size BS=4096 TEMPFILE=`mktemp /tmp/iostune.XXXXX` MAX_NR_PROCESSES=8 if [ ! -b "$BLOCKDEV" ];then echo "Error: $BLOCKDEV is not a block device." exit 1 fi start_test wait generate_report