1*387f9dfdSAndroid Build Coastguard WorkerDemonstrations of funcinterval, the Linux eBPF/bcc version. 2*387f9dfdSAndroid Build Coastguard Worker 3*387f9dfdSAndroid Build Coastguard WorkereBPF/bcc is very suitable for platform performance tuning. 4*387f9dfdSAndroid Build Coastguard WorkerBy funclatency, we can profile specific functions to know how latency 5*387f9dfdSAndroid Build Coastguard Workerthis function costs. However, sometimes performance drop is not about the 6*387f9dfdSAndroid Build Coastguard Workerlatency of function but the interval between function calls. 7*387f9dfdSAndroid Build Coastguard Workerfuncinterval is born for this purpose. 8*387f9dfdSAndroid Build Coastguard Worker 9*387f9dfdSAndroid Build Coastguard WorkerAnother story, hardware performance tuning on the platform we will use 10*387f9dfdSAndroid Build Coastguard Workerprotocol analyzer to analyze performance, but most protocol analyzers lack 11*387f9dfdSAndroid Build Coastguard Workerthe distribution feature. Using a protocol analyzer you need a lot of time 12*387f9dfdSAndroid Build Coastguard Workerto check every detail latency. By funcinterval, we can save a lot of time 13*387f9dfdSAndroid Build Coastguard Workerby distribution feature. 14*387f9dfdSAndroid Build Coastguard Worker 15*387f9dfdSAndroid Build Coastguard WorkerFor example: 16*387f9dfdSAndroid Build Coastguard Worker 17*387f9dfdSAndroid Build Coastguard Worker# ./funcinterval xhci_ring_ep_doorbell -d 2 -u 18*387f9dfdSAndroid Build Coastguard WorkerTracing 1 functions for "xhci_ring_ep_doorbell"... Hit Ctrl-C to end. 19*387f9dfdSAndroid Build Coastguard Worker 20*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 21*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 22*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 23*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 24*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 25*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 26*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 134 | | 27*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 2862 |******************** | 28*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 5552 |****************************************| 29*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 216 |* | 30*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 2 | | 31*387f9dfdSAndroid Build Coastguard WorkerDetaching... 32*387f9dfdSAndroid Build Coastguard Worker 33*387f9dfdSAndroid Build Coastguard WorkerThis example output shows that the interval latency of xhci_ring_ep_doorbell 34*387f9dfdSAndroid Build Coastguard Workertook between 64 and 255 microseconds. USB MAC will start its job after USB 35*387f9dfdSAndroid Build Coastguard Workerdoorbell register ringing, above information that can help hardware engineer to 36*387f9dfdSAndroid Build Coastguard Workeranalyze, the performance drop is because software rings the doorbell too 37*387f9dfdSAndroid Build Coastguard Workerlate or just slowly hardware DMA. 38*387f9dfdSAndroid Build Coastguard Worker 39*387f9dfdSAndroid Build Coastguard Worker# ./funcinterval blk_start_request -i 2 -u 40*387f9dfdSAndroid Build Coastguard WorkerTracing 1 functions for "blk_start_request"... Hit Ctrl-C to end. 41*387f9dfdSAndroid Build Coastguard Worker 42*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 43*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 44*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 45*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 46*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 5 |* | 47*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 48*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 1 | | 49*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 2 | | 50*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 1 | | 51*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 52*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 1 | | 53*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 1 | | 54*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 117 |****************************************| 55*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 13 |**** | 56*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 1 | | 57*387f9dfdSAndroid Build Coastguard Worker 58*387f9dfdSAndroid Build Coastguard WorkerIf using biolatency tool that has no difference between two platforms. 59*387f9dfdSAndroid Build Coastguard WorkerMaybe the problem is related to the interval time instead of block 60*387f9dfdSAndroid Build Coastguard Workerdevice I/O latency. 61*387f9dfdSAndroid Build Coastguard Worker 62*387f9dfdSAndroid Build Coastguard Worker# ./funcinterval ion_ioctl -i 2 -m 63*387f9dfdSAndroid Build Coastguard WorkerTracing 1 functions for "ion_ioctl"... Hit Ctrl-C to end. 64*387f9dfdSAndroid Build Coastguard Worker 65*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 66*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 215 |****************************************| 67*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 68*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 4 | | 69*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 5 | | 70*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 29 |***** | 71*387f9dfdSAndroid Build Coastguard Worker 72*387f9dfdSAndroid Build Coastguard WorkerYou can also check the ion_ioctl. By the above output, we know the activity 73*387f9dfdSAndroid Build Coastguard Workerfrequency of ion_ioctl() is high mostly(less than 1 ms), but has 29 times low 74*387f9dfdSAndroid Build Coastguard Workerfrequency. 75*387f9dfdSAndroid Build Coastguard Worker 76*387f9dfdSAndroid Build Coastguard Worker# ./funcinterval t:block:block_bio_queue -d 30 -u 77*387f9dfdSAndroid Build Coastguard WorkerTracing tracepoint for "block:block_bio_queue"... Hit Ctrl-C to end. 78*387f9dfdSAndroid Build Coastguard Worker 79*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 80*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 81*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 82*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 83*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 2 | | 84*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 262 | | 85*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 9075 |******************* | 86*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 18668 |****************************************| 87*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 1492 |*** | 88*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 2616 |***** | 89*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 7226 |*************** | 90*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 8982 |******************* | 91*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 2394 |***** | 92*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 163 | | 93*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 42 | | 94*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 2 | | 95*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 0 | | 96*387f9dfdSAndroid Build Coastguard Worker 65536 -> 131071 : 0 | | 97*387f9dfdSAndroid Build Coastguard Worker 131072 -> 262143 : 0 | | 98*387f9dfdSAndroid Build Coastguard Worker 262144 -> 524287 : 0 | | 99*387f9dfdSAndroid Build Coastguard Worker 524288 -> 1048575 : 1 | | 100*387f9dfdSAndroid Build Coastguard WorkerDetaching... 101*387f9dfdSAndroid Build Coastguard Worker 102*387f9dfdSAndroid Build Coastguard Worker# ./funcinterval t:block:block_rq_issue -d 30 -u 103*387f9dfdSAndroid Build Coastguard WorkerTracing tracepoint for "block:block_rq_issue"... Hit Ctrl-C to end. 104*387f9dfdSAndroid Build Coastguard Worker 105*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 106*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 107*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 108*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 109*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 110*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 5 | | 111*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 18 | | 112*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 32 | | 113*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 95 | | 114*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 2194 |****** | 115*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 13830 |****************************************| 116*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 9001 |************************** | 117*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 1569 |**** | 118*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 96 | | 119*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 17 | | 120*387f9dfdSAndroid Build Coastguard WorkerDetaching... 121*387f9dfdSAndroid Build Coastguard Worker 122*387f9dfdSAndroid Build Coastguard Workerfuncinterval also supports tracepoint filter. The above two cases are under EMMC 123*387f9dfdSAndroid Build Coastguard Workerthroughput testing, by those results you know which layer has a slower interval 124*387f9dfdSAndroid Build Coastguard Workertime. In our case, mmc-cmdqd is slower than block layer. 125*387f9dfdSAndroid Build Coastguard Worker 126*387f9dfdSAndroid Build Coastguard Worker 127*387f9dfdSAndroid Build Coastguard Worker# ./funcinterval -p `pidof -s top` c:malloc -i 3 128*387f9dfdSAndroid Build Coastguard WorkerTracing uprobe function for "malloc"... Hit Ctrl-C to end. 129*387f9dfdSAndroid Build Coastguard Worker 130*387f9dfdSAndroid Build Coastguard Worker nsecs : count distribution 131*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 132*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 133*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 134*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 135*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 136*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 137*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 138*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 139*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 140*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 0 | | 141*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 0 | | 142*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 0 | | 143*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 7 |************************* | 144*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 11 |****************************************| 145*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 4 |************** | 146*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 1 |*** | 147*387f9dfdSAndroid Build Coastguard Worker 65536 -> 131071 : 1 |*** | 148*387f9dfdSAndroid Build Coastguard Worker 131072 -> 262143 : 1 |*** | 149*387f9dfdSAndroid Build Coastguard Worker 262144 -> 524287 : 0 | | 150*387f9dfdSAndroid Build Coastguard Worker 524288 -> 1048575 : 0 | | 151*387f9dfdSAndroid Build Coastguard Worker 1048576 -> 2097151 : 0 | | 152*387f9dfdSAndroid Build Coastguard Worker 2097152 -> 4194303 : 0 | | 153*387f9dfdSAndroid Build Coastguard Worker 4194304 -> 8388607 : 1 |*** | 154*387f9dfdSAndroid Build Coastguard Worker 155*387f9dfdSAndroid Build Coastguard Worker 156*387f9dfdSAndroid Build Coastguard Worker nsecs : count distribution 157*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 158*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 159*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 160*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 161*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 162*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 163*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 164*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 165*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 166*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 0 | | 167*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 0 | | 168*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 0 | | 169*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 8 |******************************** | 170*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 10 |****************************************| 171*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 4 |**************** | 172*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 1 |**** | 173*387f9dfdSAndroid Build Coastguard Worker 65536 -> 131071 : 1 |**** | 174*387f9dfdSAndroid Build Coastguard Worker 131072 -> 262143 : 1 |**** | 175*387f9dfdSAndroid Build Coastguard Worker 262144 -> 524287 : 0 | | 176*387f9dfdSAndroid Build Coastguard Worker 524288 -> 1048575 : 0 | | 177*387f9dfdSAndroid Build Coastguard Worker 1048576 -> 2097151 : 0 | | 178*387f9dfdSAndroid Build Coastguard Worker 2097152 -> 4194303 : 0 | | 179*387f9dfdSAndroid Build Coastguard Worker 4194304 -> 8388607 : 1 |**** | 180*387f9dfdSAndroid Build Coastguard Worker 181*387f9dfdSAndroid Build Coastguard WorkerTime the interval of libc's malloc for top utility every 3 seconds. 182*387f9dfdSAndroid Build Coastguard Worker 183*387f9dfdSAndroid Build Coastguard Worker# ./funcinterval /usr/local/bin/python:main 184*387f9dfdSAndroid Build Coastguard WorkerTracing uprobe function for "main"... Hit Ctrl-C to end. 185*387f9dfdSAndroid Build Coastguard Worker^C 186*387f9dfdSAndroid Build Coastguard Worker nsecs : count distribution 187*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 188*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 189*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 190*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 191*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 192*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 193*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 194*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 195*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 196*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 0 | | 197*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 0 | | 198*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 0 | | 199*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 0 | | 200*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 0 | | 201*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 0 | | 202*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 0 | | 203*387f9dfdSAndroid Build Coastguard Worker 65536 -> 131071 : 0 | | 204*387f9dfdSAndroid Build Coastguard Worker 131072 -> 262143 : 0 | | 205*387f9dfdSAndroid Build Coastguard Worker 262144 -> 524287 : 0 | | 206*387f9dfdSAndroid Build Coastguard Worker 524288 -> 1048575 : 0 | | 207*387f9dfdSAndroid Build Coastguard Worker 1048576 -> 2097151 : 0 | | 208*387f9dfdSAndroid Build Coastguard Worker 2097152 -> 4194303 : 0 | | 209*387f9dfdSAndroid Build Coastguard Worker 4194304 -> 8388607 : 0 | | 210*387f9dfdSAndroid Build Coastguard Worker 8388608 -> 16777215 : 0 | | 211*387f9dfdSAndroid Build Coastguard Worker 16777216 -> 33554431 : 0 | | 212*387f9dfdSAndroid Build Coastguard Worker 33554432 -> 67108863 : 0 | | 213*387f9dfdSAndroid Build Coastguard Worker 67108864 -> 134217727 : 0 | | 214*387f9dfdSAndroid Build Coastguard Worker 134217728 -> 268435455 : 0 | | 215*387f9dfdSAndroid Build Coastguard Worker 268435456 -> 536870911 : 1 |****************************************| 216*387f9dfdSAndroid Build Coastguard Worker 536870912 -> 1073741823 : 1 |****************************************| 217*387f9dfdSAndroid Build Coastguard Worker1073741824 -> 2147483647 : 1 |****************************************| 218*387f9dfdSAndroid Build Coastguard Worker2147483648 -> 4294967295 : 1 |****************************************| 219*387f9dfdSAndroid Build Coastguard WorkerDetaching... 220*387f9dfdSAndroid Build Coastguard Worker 221*387f9dfdSAndroid Build Coastguard WorkerTime the interal of python's main function. 222*387f9dfdSAndroid Build Coastguard Worker 223*387f9dfdSAndroid Build Coastguard WorkerUSAGE message: 224*387f9dfdSAndroid Build Coastguard Worker 225*387f9dfdSAndroid Build Coastguard Worker# ./funcinterval -h 226*387f9dfdSAndroid Build Coastguard Workerusage: funcinterval [-h] [-p PID] [-i INTERVAL] [-d DURATION] [-T] [-u] [-m] 227*387f9dfdSAndroid Build Coastguard Worker [-v] 228*387f9dfdSAndroid Build Coastguard Worker pattern 229*387f9dfdSAndroid Build Coastguard Worker 230*387f9dfdSAndroid Build Coastguard WorkerTime interval and print latency as a histogram 231*387f9dfdSAndroid Build Coastguard Worker 232*387f9dfdSAndroid Build Coastguard Workerpositional arguments: 233*387f9dfdSAndroid Build Coastguard Worker pattern Function name for tracing 234*387f9dfdSAndroid Build Coastguard Worker 235*387f9dfdSAndroid Build Coastguard Workeroptional arguments: 236*387f9dfdSAndroid Build Coastguard Worker -h, --help show this help message and exit 237*387f9dfdSAndroid Build Coastguard Worker -p PID, --pid PID trace this PID only 238*387f9dfdSAndroid Build Coastguard Worker -i INTERVAL, --interval INTERVAL 239*387f9dfdSAndroid Build Coastguard Worker summary interval, in seconds 240*387f9dfdSAndroid Build Coastguard Worker -d DURATION, --duration DURATION 241*387f9dfdSAndroid Build Coastguard Worker total duration of trace, in seconds 242*387f9dfdSAndroid Build Coastguard Worker -T, --timestamp include timestamp on output 243*387f9dfdSAndroid Build Coastguard Worker -u, --microseconds microsecond histogram 244*387f9dfdSAndroid Build Coastguard Worker -m, --milliseconds millisecond histogram 245*387f9dfdSAndroid Build Coastguard Worker -v, --verbose print the BPF program (for debugging purposes) 246*387f9dfdSAndroid Build Coastguard Worker 247*387f9dfdSAndroid Build Coastguard Workerexamples: 248*387f9dfdSAndroid Build Coastguard Worker # time the interval of do_sys_open() 249*387f9dfdSAndroid Build Coastguard Worker ./funcinterval do_sys_open 250*387f9dfdSAndroid Build Coastguard Worker # time the interval of xhci_ring_ep_doorbell(), in microseconds 251*387f9dfdSAndroid Build Coastguard Worker ./funcinterval -u xhci_ring_ep_doorbell 252*387f9dfdSAndroid Build Coastguard Worker # time the interval of do_nanosleep(), in milliseconds 253*387f9dfdSAndroid Build Coastguard Worker ./funcinterval -m do_nanosleep 254*387f9dfdSAndroid Build Coastguard Worker # output every 5 seconds, with timestamps 255*387f9dfdSAndroid Build Coastguard Worker ./funcinterval -mTi 5 vfs_read 256*387f9dfdSAndroid Build Coastguard Worker # time process 181 only 257*387f9dfdSAndroid Build Coastguard Worker ./funcinterval -p 181 vfs_read 258*387f9dfdSAndroid Build Coastguard Worker # time the interval of mm_vmscan_direct_reclaim_begin tracepoint 259*387f9dfdSAndroid Build Coastguard Worker ./funcinterval t:vmscan:mm_vmscan_direct_reclaim_begin 260*387f9dfdSAndroid Build Coastguard Worker # time the interval of c:malloc used by top every 3 seconds 261*387f9dfdSAndroid Build Coastguard Worker ./funcinterval -p `pidof -s top` -i 3 c:malloc 262*387f9dfdSAndroid Build Coastguard Worker # time /usr/local/bin/python main function 263*387f9dfdSAndroid Build Coastguard Worker ./funcinterval /usr/local/bin/python:main 264