Add linux zpios support
[zfs.git] / scripts / zpios-profile / zpios-profile-disk.sh
1 #!/bin/bash
2 #
3 # /proc/diskinfo <after skipping major/minor>
4 # Field 1 -- device name
5 # Field 2 -- # of reads issued
6 # Field 3 -- # of reads merged
7 # Field 4 -- # of sectors read
8 # Field 5 -- # of milliseconds spent reading
9 # Field 6 -- # of writes completed
10 # Field 7 -- # of writes merged
11 # Field 8 -- # of sectors written
12 # Field 9 -- # of milliseconds spent writing
13 # Field 10 -- # of I/Os currently in progress
14 # Field 11 -- # of milliseconds spent doing I/Os
15 # Field 12 -- weighted # of milliseconds spent doing I/Os
16
17 PROG=zpios-profile-disk.sh
18
19 RUN_PIDS=${0}
20 RUN_LOG_DIR=${1}
21 RUN_ID=${2}
22
23 create_table() {
24         local FIELD=$1
25         local ROW_M=()
26         local ROW_N=()
27         local HEADER=1
28         local STEP=1
29
30         for DISK_FILE in `ls -r --sort=time --time=ctime ${RUN_LOG_DIR}/${RUN_ID}/disk-[0-9]*`; do
31                 ROW_M=( ${ROW_N[@]} )
32                 ROW_N=( `cat ${DISK_FILE} | grep sd | cut -c11- | cut -f${FIELD} -d' ' | tr "\n" "\t"` )
33
34                 if [ $HEADER -eq 1 ]; then
35                         echo -n "step, "
36                         cat ${DISK_FILE} | grep sd | cut -c11- | cut -f1 -d' ' | tr "\n" ", "
37                         echo "total"
38                         HEADER=0
39                 fi
40
41                 if [ ${#ROW_M[@]} -eq 0 ]; then
42                         continue
43                 fi
44
45                 if [ ${#ROW_M[@]} -ne ${#ROW_N[@]} ]; then
46                         echo "Badly formatted profile data in ${DISK_FILE}"
47                         break
48                 fi
49
50                 TOTAL=0
51                 echo -n "${STEP}, "
52                 for (( i=0; i<${#ROW_N[@]}; i++ )); do
53                         DELTA=`echo "${ROW_N[${i}]}-${ROW_M[${i}]}" | bc`
54                         let TOTAL=${TOTAL}+${DELTA}
55                         echo -n "${DELTA}, "
56                 done
57                 echo "${TOTAL}, "
58
59                 let STEP=${STEP}+1
60         done
61 }
62
63 create_table_mbs() {
64         local FIELD=$1
65         local TIME=$2
66         local ROW_M=()
67         local ROW_N=()
68         local HEADER=1
69         local STEP=1
70
71         for DISK_FILE in `ls -r --sort=time --time=ctime ${RUN_LOG_DIR}/${RUN_ID}/disk-[0-9]*`; do
72                 ROW_M=( ${ROW_N[@]} )
73                 ROW_N=( `cat ${DISK_FILE} | grep sd | cut -c11- | cut -f${FIELD} -d' ' | tr "\n" "\t"` )
74
75                 if [ $HEADER -eq 1 ]; then
76                         echo -n "step, "
77                         cat ${DISK_FILE} | grep sd | cut -c11- | cut -f1 -d' ' | tr "\n" ", "
78                         echo "total"
79                         HEADER=0
80                 fi
81
82                 if [ ${#ROW_M[@]} -eq 0 ]; then
83                         continue
84                 fi
85
86                 if [ ${#ROW_M[@]} -ne ${#ROW_N[@]} ]; then
87                         echo "Badly formatted profile data in ${DISK_FILE}"
88                         break
89                 fi
90
91                 TOTAL=0
92                 echo -n "${STEP}, "
93                 for (( i=0; i<${#ROW_N[@]}; i++ )); do
94                         DELTA=`echo "${ROW_N[${i}]}-${ROW_M[${i}]}" | bc`
95                         MBS=`echo "scale=2; ((${DELTA}*512)/${TIME})/(1024*1024)" | bc`
96                         TOTAL=`echo "scale=2; ${TOTAL}+${MBS}" | bc`
97                         echo -n "${MBS}, "
98                 done
99                 echo "${TOTAL}, "
100
101                 let STEP=${STEP}+1
102         done
103 }
104
105 echo
106 echo "Reads issued per device"
107 create_table 2
108 echo
109 echo "Reads merged per device"
110 create_table 3
111 echo
112 echo "Sectors read per device"
113 create_table 4
114 echo "MB/s per device"
115 create_table_mbs 4 3
116
117 echo
118 echo "Writes issued per device"
119 create_table 6
120 echo
121 echo "Writes merged per device"
122 create_table 7
123 echo
124 echo "Sectors written per device"
125 create_table 8
126 echo "MB/s per device"
127 create_table_mbs 8 3
128
129 exit 0