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