1*387f9dfdSAndroid Build Coastguard WorkerDemonstrations of runqlen, the Linux eBPF/bcc version. 2*387f9dfdSAndroid Build Coastguard Worker 3*387f9dfdSAndroid Build Coastguard Worker 4*387f9dfdSAndroid Build Coastguard WorkerThis program summarizes scheduler queue length as a histogram, and can also 5*387f9dfdSAndroid Build Coastguard Workershow run queue occupancy. It works by sampling the run queue length on all 6*387f9dfdSAndroid Build Coastguard WorkerCPUs at 99 Hertz. 7*387f9dfdSAndroid Build Coastguard Worker 8*387f9dfdSAndroid Build Coastguard WorkerAs an example, here is an idle system: 9*387f9dfdSAndroid Build Coastguard Worker 10*387f9dfdSAndroid Build Coastguard Worker# ./runqlen.py 11*387f9dfdSAndroid Build Coastguard WorkerSampling run queue length... Hit Ctrl-C to end. 12*387f9dfdSAndroid Build Coastguard Worker^C 13*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 14*387f9dfdSAndroid Build Coastguard Worker 0 : 1776 |****************************************| 15*387f9dfdSAndroid Build Coastguard Worker 16*387f9dfdSAndroid Build Coastguard WorkerThis shows a zero run queue length each time it was sampled. 17*387f9dfdSAndroid Build Coastguard Worker 18*387f9dfdSAndroid Build Coastguard WorkerAnd now a heavily loaded system: 19*387f9dfdSAndroid Build Coastguard Worker 20*387f9dfdSAndroid Build Coastguard Worker# ./runqlen.py 21*387f9dfdSAndroid Build Coastguard WorkerSampling run queue length... Hit Ctrl-C to end. 22*387f9dfdSAndroid Build Coastguard Worker^C 23*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 24*387f9dfdSAndroid Build Coastguard Worker 0 : 1068 |****************************************| 25*387f9dfdSAndroid Build Coastguard Worker 1 : 642 |************************ | 26*387f9dfdSAndroid Build Coastguard Worker 2 : 369 |************* | 27*387f9dfdSAndroid Build Coastguard Worker 3 : 183 |****** | 28*387f9dfdSAndroid Build Coastguard Worker 4 : 104 |*** | 29*387f9dfdSAndroid Build Coastguard Worker 5 : 42 |* | 30*387f9dfdSAndroid Build Coastguard Worker 6 : 13 | | 31*387f9dfdSAndroid Build Coastguard Worker 7 : 2 | | 32*387f9dfdSAndroid Build Coastguard Worker 8 : 1 | | 33*387f9dfdSAndroid Build Coastguard Worker 34*387f9dfdSAndroid Build Coastguard WorkerNow there is often threads queued, with one sample reaching a queue length 35*387f9dfdSAndroid Build Coastguard Workerof 8. This will cause run queue latency, which can be measured by the bcc 36*387f9dfdSAndroid Build Coastguard Workerrunqlat tool. 37*387f9dfdSAndroid Build Coastguard Worker 38*387f9dfdSAndroid Build Coastguard Worker 39*387f9dfdSAndroid Build Coastguard WorkerHere's an example of an issue that runqlen can identify. Starting with the 40*387f9dfdSAndroid Build Coastguard Workersystem-wide summary: 41*387f9dfdSAndroid Build Coastguard Worker 42*387f9dfdSAndroid Build Coastguard Worker# ./runqlen.py 43*387f9dfdSAndroid Build Coastguard WorkerSampling run queue length... Hit Ctrl-C to end. 44*387f9dfdSAndroid Build Coastguard Worker^C 45*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 46*387f9dfdSAndroid Build Coastguard Worker 0 : 1209 |****************************************| 47*387f9dfdSAndroid Build Coastguard Worker 1 : 372 |************ | 48*387f9dfdSAndroid Build Coastguard Worker 2 : 73 |** | 49*387f9dfdSAndroid Build Coastguard Worker 3 : 3 | | 50*387f9dfdSAndroid Build Coastguard Worker 4 : 1 | | 51*387f9dfdSAndroid Build Coastguard Worker 5 : 0 | | 52*387f9dfdSAndroid Build Coastguard Worker 6 : 0 | | 53*387f9dfdSAndroid Build Coastguard Worker 7 : 237 |******* | 54*387f9dfdSAndroid Build Coastguard Worker 55*387f9dfdSAndroid Build Coastguard WorkerThis shows there is often a run queue length of 7. Now using the -C option to 56*387f9dfdSAndroid Build Coastguard Workersee per-CPU histograms: 57*387f9dfdSAndroid Build Coastguard Worker 58*387f9dfdSAndroid Build Coastguard Worker# ./runqlen.py -C 59*387f9dfdSAndroid Build Coastguard WorkerSampling run queue length... Hit Ctrl-C to end. 60*387f9dfdSAndroid Build Coastguard Worker^C 61*387f9dfdSAndroid Build Coastguard Worker 62*387f9dfdSAndroid Build Coastguard Workercpu = 0 63*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 64*387f9dfdSAndroid Build Coastguard Worker 0 : 257 |****************************************| 65*387f9dfdSAndroid Build Coastguard Worker 1 : 64 |********* | 66*387f9dfdSAndroid Build Coastguard Worker 2 : 5 | | 67*387f9dfdSAndroid Build Coastguard Worker 3 : 0 | | 68*387f9dfdSAndroid Build Coastguard Worker 4 : 0 | | 69*387f9dfdSAndroid Build Coastguard Worker 5 : 0 | | 70*387f9dfdSAndroid Build Coastguard Worker 6 : 1 | | 71*387f9dfdSAndroid Build Coastguard Worker 72*387f9dfdSAndroid Build Coastguard Workercpu = 1 73*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 74*387f9dfdSAndroid Build Coastguard Worker 0 : 226 |****************************************| 75*387f9dfdSAndroid Build Coastguard Worker 1 : 90 |*************** | 76*387f9dfdSAndroid Build Coastguard Worker 2 : 11 |* | 77*387f9dfdSAndroid Build Coastguard Worker 78*387f9dfdSAndroid Build Coastguard Workercpu = 2 79*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 80*387f9dfdSAndroid Build Coastguard Worker 0 : 264 |****************************************| 81*387f9dfdSAndroid Build Coastguard Worker 1 : 52 |******* | 82*387f9dfdSAndroid Build Coastguard Worker 2 : 8 |* | 83*387f9dfdSAndroid Build Coastguard Worker 3 : 1 | | 84*387f9dfdSAndroid Build Coastguard Worker 4 : 0 | | 85*387f9dfdSAndroid Build Coastguard Worker 5 : 0 | | 86*387f9dfdSAndroid Build Coastguard Worker 6 : 1 | | 87*387f9dfdSAndroid Build Coastguard Worker 7 : 0 | | 88*387f9dfdSAndroid Build Coastguard Worker 8 : 1 | | 89*387f9dfdSAndroid Build Coastguard Worker 90*387f9dfdSAndroid Build Coastguard Workercpu = 3 91*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 92*387f9dfdSAndroid Build Coastguard Worker 0 : 0 | | 93*387f9dfdSAndroid Build Coastguard Worker 1 : 0 | | 94*387f9dfdSAndroid Build Coastguard Worker 2 : 0 | | 95*387f9dfdSAndroid Build Coastguard Worker 3 : 0 | | 96*387f9dfdSAndroid Build Coastguard Worker 4 : 0 | | 97*387f9dfdSAndroid Build Coastguard Worker 5 : 0 | | 98*387f9dfdSAndroid Build Coastguard Worker 6 : 0 | | 99*387f9dfdSAndroid Build Coastguard Worker 7 : 327 |****************************************| 100*387f9dfdSAndroid Build Coastguard Worker 101*387f9dfdSAndroid Build Coastguard Workercpu = 4 102*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 103*387f9dfdSAndroid Build Coastguard Worker 0 : 255 |****************************************| 104*387f9dfdSAndroid Build Coastguard Worker 1 : 63 |********* | 105*387f9dfdSAndroid Build Coastguard Worker 2 : 9 |* | 106*387f9dfdSAndroid Build Coastguard Worker 107*387f9dfdSAndroid Build Coastguard Workercpu = 5 108*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 109*387f9dfdSAndroid Build Coastguard Worker 0 : 244 |****************************************| 110*387f9dfdSAndroid Build Coastguard Worker 1 : 78 |************ | 111*387f9dfdSAndroid Build Coastguard Worker 2 : 3 | | 112*387f9dfdSAndroid Build Coastguard Worker 3 : 2 | | 113*387f9dfdSAndroid Build Coastguard Worker 114*387f9dfdSAndroid Build Coastguard Workercpu = 6 115*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 116*387f9dfdSAndroid Build Coastguard Worker 0 : 253 |****************************************| 117*387f9dfdSAndroid Build Coastguard Worker 1 : 66 |********** | 118*387f9dfdSAndroid Build Coastguard Worker 2 : 6 | | 119*387f9dfdSAndroid Build Coastguard Worker 3 : 1 | | 120*387f9dfdSAndroid Build Coastguard Worker 4 : 1 | | 121*387f9dfdSAndroid Build Coastguard Worker 122*387f9dfdSAndroid Build Coastguard Workercpu = 7 123*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 124*387f9dfdSAndroid Build Coastguard Worker 0 : 243 |****************************************| 125*387f9dfdSAndroid Build Coastguard Worker 1 : 74 |************ | 126*387f9dfdSAndroid Build Coastguard Worker 2 : 6 | | 127*387f9dfdSAndroid Build Coastguard Worker 3 : 1 | | 128*387f9dfdSAndroid Build Coastguard Worker 4 : 0 | | 129*387f9dfdSAndroid Build Coastguard Worker 5 : 1 | | 130*387f9dfdSAndroid Build Coastguard Worker 6 : 2 | | 131*387f9dfdSAndroid Build Coastguard Worker 132*387f9dfdSAndroid Build Coastguard WorkerThe run queue length of 7 is isolated to CPU 3. It was caused by CPU binding 133*387f9dfdSAndroid Build Coastguard Worker(taskset). This can sometimes happen by applications that try to auto-bind 134*387f9dfdSAndroid Build Coastguard Workerto CPUs, leaving other CPUs idle while work is queued. 135*387f9dfdSAndroid Build Coastguard Worker 136*387f9dfdSAndroid Build Coastguard Worker 137*387f9dfdSAndroid Build Coastguard Workerrunqlat accepts an interval and a count. For example, with -T for timestamps: 138*387f9dfdSAndroid Build Coastguard Worker 139*387f9dfdSAndroid Build Coastguard Worker# ./runqlen.py -T 1 5 140*387f9dfdSAndroid Build Coastguard WorkerSampling run queue length... Hit Ctrl-C to end. 141*387f9dfdSAndroid Build Coastguard Worker 142*387f9dfdSAndroid Build Coastguard Worker19:51:34 143*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 144*387f9dfdSAndroid Build Coastguard Worker 0 : 635 |****************************************| 145*387f9dfdSAndroid Build Coastguard Worker 1 : 142 |******** | 146*387f9dfdSAndroid Build Coastguard Worker 2 : 13 | | 147*387f9dfdSAndroid Build Coastguard Worker 3 : 0 | | 148*387f9dfdSAndroid Build Coastguard Worker 4 : 1 | | 149*387f9dfdSAndroid Build Coastguard Worker 150*387f9dfdSAndroid Build Coastguard Worker19:51:35 151*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 152*387f9dfdSAndroid Build Coastguard Worker 0 : 640 |****************************************| 153*387f9dfdSAndroid Build Coastguard Worker 1 : 136 |******** | 154*387f9dfdSAndroid Build Coastguard Worker 2 : 13 | | 155*387f9dfdSAndroid Build Coastguard Worker 3 : 1 | | 156*387f9dfdSAndroid Build Coastguard Worker 4 : 0 | | 157*387f9dfdSAndroid Build Coastguard Worker 5 : 0 | | 158*387f9dfdSAndroid Build Coastguard Worker 6 : 0 | | 159*387f9dfdSAndroid Build Coastguard Worker 7 : 0 | | 160*387f9dfdSAndroid Build Coastguard Worker 8 : 0 | | 161*387f9dfdSAndroid Build Coastguard Worker 9 : 0 | | 162*387f9dfdSAndroid Build Coastguard Worker 10 : 1 | | 163*387f9dfdSAndroid Build Coastguard Worker 164*387f9dfdSAndroid Build Coastguard Worker19:51:36 165*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 166*387f9dfdSAndroid Build Coastguard Worker 0 : 603 |****************************************| 167*387f9dfdSAndroid Build Coastguard Worker 1 : 170 |*********** | 168*387f9dfdSAndroid Build Coastguard Worker 2 : 16 |* | 169*387f9dfdSAndroid Build Coastguard Worker 3 : 1 | | 170*387f9dfdSAndroid Build Coastguard Worker 4 : 0 | | 171*387f9dfdSAndroid Build Coastguard Worker 5 : 0 | | 172*387f9dfdSAndroid Build Coastguard Worker 6 : 0 | | 173*387f9dfdSAndroid Build Coastguard Worker 7 : 0 | | 174*387f9dfdSAndroid Build Coastguard Worker 8 : 0 | | 175*387f9dfdSAndroid Build Coastguard Worker 9 : 1 | | 176*387f9dfdSAndroid Build Coastguard Worker 177*387f9dfdSAndroid Build Coastguard Worker19:51:37 178*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 179*387f9dfdSAndroid Build Coastguard Worker 0 : 617 |****************************************| 180*387f9dfdSAndroid Build Coastguard Worker 1 : 154 |********* | 181*387f9dfdSAndroid Build Coastguard Worker 2 : 20 |* | 182*387f9dfdSAndroid Build Coastguard Worker 3 : 0 | | 183*387f9dfdSAndroid Build Coastguard Worker 4 : 0 | | 184*387f9dfdSAndroid Build Coastguard Worker 5 : 0 | | 185*387f9dfdSAndroid Build Coastguard Worker 6 : 0 | | 186*387f9dfdSAndroid Build Coastguard Worker 7 : 0 | | 187*387f9dfdSAndroid Build Coastguard Worker 8 : 0 | | 188*387f9dfdSAndroid Build Coastguard Worker 9 : 0 | | 189*387f9dfdSAndroid Build Coastguard Worker 10 : 0 | | 190*387f9dfdSAndroid Build Coastguard Worker 11 : 1 | | 191*387f9dfdSAndroid Build Coastguard Worker 192*387f9dfdSAndroid Build Coastguard Worker19:51:38 193*387f9dfdSAndroid Build Coastguard Worker runqlen : count distribution 194*387f9dfdSAndroid Build Coastguard Worker 0 : 603 |****************************************| 195*387f9dfdSAndroid Build Coastguard Worker 1 : 161 |********** | 196*387f9dfdSAndroid Build Coastguard Worker 2 : 24 |* | 197*387f9dfdSAndroid Build Coastguard Worker 3 : 4 | | 198*387f9dfdSAndroid Build Coastguard Worker 199*387f9dfdSAndroid Build Coastguard WorkerThe spikes in run queue length of 11 are likely threads waking up at the same 200*387f9dfdSAndroid Build Coastguard Workertime (a thundering herd), and then are scheduled and complete their execution 201*387f9dfdSAndroid Build Coastguard Workerquickly. 202*387f9dfdSAndroid Build Coastguard Worker 203*387f9dfdSAndroid Build Coastguard Worker 204*387f9dfdSAndroid Build Coastguard WorkerThe -O option prints run queue occupancy: the percentage of time that there 205*387f9dfdSAndroid Build Coastguard Workerwas work queued waiting its turn. Eg: 206*387f9dfdSAndroid Build Coastguard Worker 207*387f9dfdSAndroid Build Coastguard Worker# ./runqlen.py -OT 1 208*387f9dfdSAndroid Build Coastguard WorkerSampling run queue length... Hit Ctrl-C to end. 209*387f9dfdSAndroid Build Coastguard Worker 210*387f9dfdSAndroid Build Coastguard Worker19:54:53 211*387f9dfdSAndroid Build Coastguard Workerrunqocc: 41.09% 212*387f9dfdSAndroid Build Coastguard Worker 213*387f9dfdSAndroid Build Coastguard Worker19:54:54 214*387f9dfdSAndroid Build Coastguard Workerrunqocc: 41.85% 215*387f9dfdSAndroid Build Coastguard Worker 216*387f9dfdSAndroid Build Coastguard Worker19:54:55 217*387f9dfdSAndroid Build Coastguard Workerrunqocc: 41.47% 218*387f9dfdSAndroid Build Coastguard Worker 219*387f9dfdSAndroid Build Coastguard Worker19:54:56 220*387f9dfdSAndroid Build Coastguard Workerrunqocc: 42.35% 221*387f9dfdSAndroid Build Coastguard Worker 222*387f9dfdSAndroid Build Coastguard Worker19:54:57 223*387f9dfdSAndroid Build Coastguard Workerrunqocc: 40.83% 224*387f9dfdSAndroid Build Coastguard Worker[...] 225*387f9dfdSAndroid Build Coastguard Worker 226*387f9dfdSAndroid Build Coastguard WorkerThis can also be examined per-CPU: 227*387f9dfdSAndroid Build Coastguard Worker 228*387f9dfdSAndroid Build Coastguard Worker# ./runqlen.py -COT 1 229*387f9dfdSAndroid Build Coastguard WorkerSampling run queue length... Hit Ctrl-C to end. 230*387f9dfdSAndroid Build Coastguard Worker 231*387f9dfdSAndroid Build Coastguard Worker19:55:03 232*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 0 32.32% 233*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 1 26.26% 234*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 2 38.38% 235*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 3 100.00% 236*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 4 26.26% 237*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 5 32.32% 238*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 6 39.39% 239*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 7 46.46% 240*387f9dfdSAndroid Build Coastguard Worker 241*387f9dfdSAndroid Build Coastguard Worker19:55:04 242*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 0 35.00% 243*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 1 32.32% 244*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 2 37.00% 245*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 3 100.00% 246*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 4 43.43% 247*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 5 31.31% 248*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 6 28.00% 249*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 7 31.31% 250*387f9dfdSAndroid Build Coastguard Worker 251*387f9dfdSAndroid Build Coastguard Worker19:55:05 252*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 0 43.43% 253*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 1 32.32% 254*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 2 45.45% 255*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 3 100.00% 256*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 4 29.29% 257*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 5 36.36% 258*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 6 36.36% 259*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 7 30.30% 260*387f9dfdSAndroid Build Coastguard Worker 261*387f9dfdSAndroid Build Coastguard Worker19:55:06 262*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 0 40.00% 263*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 1 38.00% 264*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 2 31.31% 265*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 3 100.00% 266*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 4 31.31% 267*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 5 28.28% 268*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 6 31.00% 269*387f9dfdSAndroid Build Coastguard Workerrunqocc, CPU 7 29.29% 270*387f9dfdSAndroid Build Coastguard Worker[...] 271*387f9dfdSAndroid Build Coastguard Worker 272*387f9dfdSAndroid Build Coastguard Worker 273*387f9dfdSAndroid Build Coastguard WorkerUSAGE message: 274*387f9dfdSAndroid Build Coastguard Worker 275*387f9dfdSAndroid Build Coastguard Worker# ./runqlen -h 276*387f9dfdSAndroid Build Coastguard Workerusage: runqlen [-h] [-T] [-O] [-C] [interval] [count] 277*387f9dfdSAndroid Build Coastguard Worker 278*387f9dfdSAndroid Build Coastguard WorkerSummarize scheduler run queue length as a histogram 279*387f9dfdSAndroid Build Coastguard Worker 280*387f9dfdSAndroid Build Coastguard Workerpositional arguments: 281*387f9dfdSAndroid Build Coastguard Worker interval output interval, in seconds 282*387f9dfdSAndroid Build Coastguard Worker count number of outputs 283*387f9dfdSAndroid Build Coastguard Worker 284*387f9dfdSAndroid Build Coastguard Workeroptional arguments: 285*387f9dfdSAndroid Build Coastguard Worker -h, --help show this help message and exit 286*387f9dfdSAndroid Build Coastguard Worker -T, --timestamp include timestamp on output 287*387f9dfdSAndroid Build Coastguard Worker -O, --runqocc report run queue occupancy 288*387f9dfdSAndroid Build Coastguard Worker -C, --cpus print output for each CPU separately 289*387f9dfdSAndroid Build Coastguard Worker 290*387f9dfdSAndroid Build Coastguard Workerexamples: 291*387f9dfdSAndroid Build Coastguard Worker ./runqlen # summarize run queue length as a histogram 292*387f9dfdSAndroid Build Coastguard Worker ./runqlen 1 10 # print 1 second summaries, 10 times 293*387f9dfdSAndroid Build Coastguard Worker ./runqlen -T 1 # 1s summaries and timestamps 294*387f9dfdSAndroid Build Coastguard Worker ./runqlen -O # report run queue occupancy 295*387f9dfdSAndroid Build Coastguard Worker ./runqlen -C # show each CPU separately 296