]> git.proxmox.com Git - mirror_zfs-debian.git/blob - scripts/profile-kpios-pids.sh
d3fa10c9131c001ced924140ff6f749e40e68829
[mirror_zfs-debian.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