d3fa10c9131c001ced924140ff6f749e40e68829
[zfs.git] / scripts / profile-kpios-pids.sh
1 #!/bin/bash
2 # profile-kpios-pids.sh
3
4 RUN_PIDS=${0}
5 RUN_LOG_DIR=${1}
6 RUN_ID=${2}
7
8 ROW_M=()
9 ROW_N=()
10 ROW_N_SCHED=()
11 ROW_N_WAIT=()
12
13 HEADER=1
14 STEP=1
15
16 for PID_FILE in `ls -r --sort=time --time=ctime ${RUN_LOG_DIR}/${RUN_ID}/pids-[0-9]*`; do
17         ROW_M=( ${ROW_N[@]} )
18         ROW_N=( 0 0 0 0  0 0 0 0  0 0 0 0  0 0 0 0  0 0 0 )
19         ROW_N_SCHED=( `cat ${PID_FILE} | cut -f15 -d' ' | tr "\n" "\t"` )
20         ROW_N_WAIT=(  `cat ${PID_FILE} | cut -f17 -d' ' | tr "\n" "\t"` )
21         ROW_N_NAMES=( `cat ${PID_FILE} | cut -f2  -d' ' | cut -f2 -d'(' | 
22                        cut -f1 -d')'   | cut -f1  -d'/' | tr "\n" "\t"` )
23
24         for (( i=0; i<${#ROW_N_SCHED[@]}; i++ )); do
25                 SUM=`echo "${ROW_N_WAIT[${i}]}+${ROW_N_SCHED[${i}]}" | bc`
26
27                 case ${ROW_N_NAMES[${i}]} in
28                         zio_taskq)      IDX=0;;
29                         zio_req_nul)    IDX=1;;
30                         zio_irq_nul)    IDX=2;;
31                         zio_req_rd)     IDX=3;;
32                         zio_irq_rd)     IDX=4;;
33                         zio_req_wr)     IDX=5;;
34                         zio_irq_wr)     IDX=6;;
35                         zio_req_fr)     IDX=7;;
36                         zio_irq_fr)     IDX=8;;
37                         zio_req_cm)     IDX=9;;
38                         zio_irq_cm)     IDX=10;;
39                         zio_req_ctl)    IDX=11;;
40                         zio_irq_ctl)    IDX=12;;
41                         txg_quiesce)    IDX=13;;
42                         txg_sync)       IDX=14;;
43                         txg_timelimit)  IDX=15;;
44                         arc_reclaim)    IDX=16;;
45                         l2arc_feed)     IDX=17;;
46                         kpios_io)       IDX=18;;
47                         *)              continue;;
48                 esac
49
50                 let ROW_N[${IDX}]=${ROW_N[${IDX}]}+${SUM}
51         done
52
53         if [ $HEADER -eq 1 ]; then
54                 echo "step, zio_taskq, zio_req_nul, zio_irq_nul, "        \
55                      "zio_req_rd, zio_irq_rd, zio_req_wr, zio_irq_wr, "   \
56                      "zio_req_fr, zio_irq_fr, zio_req_cm, zio_irq_cm, "   \
57                      "zio_req_ctl, zio_irq_ctl, txg_quiesce, txg_sync, "  \
58                      "txg_timelimit, arc_reclaim, l2arc_feed, kpios_io, " \
59                      "idle"
60                 HEADER=0
61         fi
62
63         if [ ${#ROW_M[@]} -eq 0 ]; then
64                 continue
65         fi
66
67         if [ ${#ROW_M[@]} -ne ${#ROW_N[@]} ]; then
68                 echo "Badly formatted profile data in ${PID_FILE}"
69                 break
70         fi
71
72         # Original values are in jiffies and we expect HZ to be 1000
73         # on most 2.6 systems thus we divide by 10 to get a percentage.
74         IDLE=1000
75         echo -n "${STEP}, "
76         for (( i=0; i<${#ROW_N[@]}; i++ )); do
77                 DELTA=`echo "${ROW_N[${i}]}-${ROW_M[${i}]}" | bc`
78                 DELTA_PERCENT=`echo "scale=1; ${DELTA}/10" | bc`
79                 let IDLE=${IDLE}-${DELTA}
80                 echo -n "${DELTA_PERCENT}, "
81         done
82         ILDE_PERCENT=`echo "scale=1; ${IDLE}/10" | bc`
83         echo "${ILDE_PERCENT}"
84
85         let STEP=${STEP}+1
86 done
87
88 exit
89
90 echo
91 echo "Percent of total system time per pid"
92 for PID_FILE in `ls -r --sort=time --time=ctime ${RUN_LOG_DIR}/${RUN_ID}/pids-[0-9]*`; do
93         ROW_M=( ${ROW_N[@]} )
94         ROW_N_SCHED=( `cat ${PID_FILE} | cut -f15 -d' ' | tr "\n" "\t"` )
95         ROW_N_WAIT=( `cat ${PID_FILE} | cut -f17 -d' ' | tr "\n" "\t"` )
96
97         for (( i=0; i<${#ROW_N_SCHED[@]}; i++ )); do
98                 ROW_N[${i}]=`echo "${ROW_N_WAIT[${i}]}+${ROW_N_SCHED[${i}]}" | bc`
99         done
100
101         if [ $HEADER -eq 1 ]; then
102                 echo -n "step, "
103                 cat ${PID_FILE} | cut -f2 -d' ' | tr "\n" ", "
104                 echo
105                 HEADER=0
106         fi
107
108         if [ ${#ROW_M[@]} -eq 0 ]; then
109                 continue
110         fi
111
112         if [ ${#ROW_M[@]} -ne ${#ROW_N[@]} ]; then
113                 echo "Badly formatted profile data in ${PID_FILE}"
114                 break
115         fi
116
117         # Original values are in jiffies and we expect HZ to be 1000
118         # on most 2.6 systems thus we divide by 10 to get a percentage.
119         echo -n "${STEP}, "
120         for (( i=0; i<${#ROW_N[@]}; i++ )); do
121                 DELTA=`echo "scale=1; (${ROW_N[${i}]}-${ROW_M[${i}]})/10" | bc`
122                 echo -n "${DELTA}, "
123         done
124
125         echo
126         let STEP=${STEP}+1
127 done
128
129
130 exit 0