1*387f9dfdSAndroid Build Coastguard WorkerDemonstrations of funclatency, the Linux eBPF/bcc version. 2*387f9dfdSAndroid Build Coastguard Worker 3*387f9dfdSAndroid Build Coastguard Worker 4*387f9dfdSAndroid Build Coastguard WorkerTiming the do_sys_open() kernel function until Ctrl-C: 5*387f9dfdSAndroid Build Coastguard Worker 6*387f9dfdSAndroid Build Coastguard Worker# ./funclatency do_sys_open 7*387f9dfdSAndroid Build Coastguard WorkerTracing do_sys_open... Hit Ctrl-C to end. 8*387f9dfdSAndroid Build Coastguard Worker^C 9*387f9dfdSAndroid Build Coastguard Worker nsecs : count distribution 10*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 11*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 12*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 13*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 14*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 15*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 16*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 17*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 18*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 19*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 0 | | 20*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 0 | | 21*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 124 |**************** | 22*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 291 |**************************************| 23*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 36 |**** | 24*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 16 |** | 25*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 8 |* | 26*387f9dfdSAndroid Build Coastguard Worker 65536 -> 131071 : 0 | | 27*387f9dfdSAndroid Build Coastguard Worker 131072 -> 262143 : 0 | | 28*387f9dfdSAndroid Build Coastguard Worker 262144 -> 524287 : 0 | | 29*387f9dfdSAndroid Build Coastguard Worker 524288 -> 1048575 : 0 | | 30*387f9dfdSAndroid Build Coastguard Worker 1048576 -> 2097151 : 0 | | 31*387f9dfdSAndroid Build Coastguard Worker 2097152 -> 4194303 : 1 | | 32*387f9dfdSAndroid Build Coastguard Worker 33*387f9dfdSAndroid Build Coastguard Workeravg = 13746 nsecs, total: 6543360 nsecs, count: 476 34*387f9dfdSAndroid Build Coastguard Worker 35*387f9dfdSAndroid Build Coastguard WorkerDetaching... 36*387f9dfdSAndroid Build Coastguard Worker 37*387f9dfdSAndroid Build Coastguard WorkerThe output shows a histogram of function latency (call time), measured from when 38*387f9dfdSAndroid Build Coastguard Workerthe function began executing (was called) to when it finished (returned). 39*387f9dfdSAndroid Build Coastguard Worker 40*387f9dfdSAndroid Build Coastguard WorkerThis example output shows that most of the time, do_sys_open() took between 41*387f9dfdSAndroid Build Coastguard Worker2048 and 65536 nanoseconds (2 to 65 microseconds). The peak of this distribution 42*387f9dfdSAndroid Build Coastguard Workershows 291 calls of between 4096 and 8191 nanoseconds. There was also one 43*387f9dfdSAndroid Build Coastguard Workeroccurrence, an outlier, in the 2 to 4 millisecond range. 44*387f9dfdSAndroid Build Coastguard Worker 45*387f9dfdSAndroid Build Coastguard WorkerHow this works: the function entry and return are traced using the kernel kprobe 46*387f9dfdSAndroid Build Coastguard Workerand kretprobe tracer. Timestamps are collected, the delta time calculated, which 47*387f9dfdSAndroid Build Coastguard Workeris the bucketized and stored as an in-kernel histogram for efficiency. The 48*387f9dfdSAndroid Build Coastguard Workerhistogram is visible in the output: it's the "count" column; everything else is 49*387f9dfdSAndroid Build Coastguard Workerdecoration. Only the count column is copied to user-level on output. This is an 50*387f9dfdSAndroid Build Coastguard Workerefficient way to time kernel functions and examine their latency distribution. 51*387f9dfdSAndroid Build Coastguard Worker 52*387f9dfdSAndroid Build Coastguard Worker 53*387f9dfdSAndroid Build Coastguard WorkerNow trace a user function, pthread_mutex_lock in libpthread, to determine if 54*387f9dfdSAndroid Build Coastguard Workerthere is considerable lock contention: 55*387f9dfdSAndroid Build Coastguard Worker 56*387f9dfdSAndroid Build Coastguard Worker# ./funclatency pthread:pthread_mutex_lock -p $(pidof contentions) 57*387f9dfdSAndroid Build Coastguard WorkerTracing 1 function for "pthread:pthread_mutex_lock"... Hit Ctrl-C to end. 58*387f9dfdSAndroid Build Coastguard Worker nsecs : count distribution 59*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 60*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 61*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 62*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 63*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 64*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 65*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 66*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 67*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 68*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 0 | | 69*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 0 | | 70*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 508967 |****************************************| 71*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 70072 |***** | 72*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 27686 |** | 73*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 5075 | | 74*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 2318 | | 75*387f9dfdSAndroid Build Coastguard Worker 65536 -> 131071 : 581 | | 76*387f9dfdSAndroid Build Coastguard Worker 131072 -> 262143 : 38 | | 77*387f9dfdSAndroid Build Coastguard Worker 262144 -> 524287 : 5 | | 78*387f9dfdSAndroid Build Coastguard Worker 524288 -> 1048575 : 1 | | 79*387f9dfdSAndroid Build Coastguard Worker 1048576 -> 2097151 : 9 | | 80*387f9dfdSAndroid Build Coastguard Worker 81*387f9dfdSAndroid Build Coastguard Workeravg = 4317 nsecs, total: 2654426112 nsecs, count: 614752 82*387f9dfdSAndroid Build Coastguard Worker 83*387f9dfdSAndroid Build Coastguard WorkerDetaching... 84*387f9dfdSAndroid Build Coastguard Worker 85*387f9dfdSAndroid Build Coastguard WorkerIt seems that most calls to pthread_mutex_lock completed rather quickly (in 86*387f9dfdSAndroid Build Coastguard Workerunder 4us), but there were some cases of considerable contention, sometimes 87*387f9dfdSAndroid Build Coastguard Workerover a full millisecond. 88*387f9dfdSAndroid Build Coastguard Worker 89*387f9dfdSAndroid Build Coastguard Worker 90*387f9dfdSAndroid Build Coastguard WorkerRun a quick-and-dirty profiler over all the functions in an executable: 91*387f9dfdSAndroid Build Coastguard Worker# ./funclatency /home/user/primes:* -p $(pidof primes) -F 92*387f9dfdSAndroid Build Coastguard WorkerTracing 15 functions for "/home/user/primes:*"... Hit Ctrl-C to end. 93*387f9dfdSAndroid Build Coastguard Worker^C 94*387f9dfdSAndroid Build Coastguard Worker 95*387f9dfdSAndroid Build Coastguard WorkerFunction = is_prime [6556] 96*387f9dfdSAndroid Build Coastguard Worker nsecs : count distribution 97*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 98*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 99*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 100*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 101*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 102*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 103*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 104*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 105*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 106*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 0 | | 107*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 0 | | 108*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 1495322 |****************************************| 109*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 95744 |** | 110*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 9926 | | 111*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 3070 | | 112*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 1415 | | 113*387f9dfdSAndroid Build Coastguard Worker 65536 -> 131071 : 112 | | 114*387f9dfdSAndroid Build Coastguard Worker 131072 -> 262143 : 9 | | 115*387f9dfdSAndroid Build Coastguard Worker 262144 -> 524287 : 3 | | 116*387f9dfdSAndroid Build Coastguard Worker 524288 -> 1048575 : 0 | | 117*387f9dfdSAndroid Build Coastguard Worker 1048576 -> 2097151 : 8 | | 118*387f9dfdSAndroid Build Coastguard Worker 119*387f9dfdSAndroid Build Coastguard WorkerFunction = insert_result [6556] 120*387f9dfdSAndroid Build Coastguard Worker nsecs : count distribution 121*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 122*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 123*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 124*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 125*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 126*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 127*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 128*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 129*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 130*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 0 | | 131*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 0 | | 132*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 111047 |****************************************| 133*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 3998 |* | 134*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 720 | | 135*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 238 | | 136*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 106 | | 137*387f9dfdSAndroid Build Coastguard Worker 65536 -> 131071 : 5 | | 138*387f9dfdSAndroid Build Coastguard Worker 131072 -> 262143 : 4 | | 139*387f9dfdSAndroid Build Coastguard Worker 140*387f9dfdSAndroid Build Coastguard Workeravg = 3404 nsecs, total: 5862276096 nsecs, count: 1721727 141*387f9dfdSAndroid Build Coastguard Worker 142*387f9dfdSAndroid Build Coastguard WorkerDetaching... 143*387f9dfdSAndroid Build Coastguard Worker 144*387f9dfdSAndroid Build Coastguard WorkerFrom the results, we can see that the is_prime function has something resembling 145*387f9dfdSAndroid Build Coastguard Workeran exponential distribution -- very few primes take a very long time to test, 146*387f9dfdSAndroid Build Coastguard Workerwhile most numbers are verified as prime or composite in less than 4us. The 147*387f9dfdSAndroid Build Coastguard Workerinsert_result function exhibits a similar phenomenon, likely due to contention 148*387f9dfdSAndroid Build Coastguard Workerover a shared results container. 149*387f9dfdSAndroid Build Coastguard Worker 150*387f9dfdSAndroid Build Coastguard Worker 151*387f9dfdSAndroid Build Coastguard WorkerNow vfs_read() is traced, and a microseconds histogram printed: 152*387f9dfdSAndroid Build Coastguard Worker 153*387f9dfdSAndroid Build Coastguard Worker# ./funclatency -u vfs_read 154*387f9dfdSAndroid Build Coastguard WorkerTracing vfs_read... Hit Ctrl-C to end. 155*387f9dfdSAndroid Build Coastguard Worker^C 156*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 157*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 1143 |**************************************| 158*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 420 |************* | 159*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 159 |***** | 160*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 295 |********* | 161*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 25 | | 162*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 5 | | 163*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 1 | | 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 : 1 | | 168*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 0 | | 169*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 5 | | 170*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 0 | | 171*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 0 | | 172*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 0 | | 173*387f9dfdSAndroid Build Coastguard Worker 65536 -> 131071 : 7 | | 174*387f9dfdSAndroid Build Coastguard Worker 131072 -> 262143 : 7 | | 175*387f9dfdSAndroid Build Coastguard Worker 262144 -> 524287 : 3 | | 176*387f9dfdSAndroid Build Coastguard Worker 524288 -> 1048575 : 7 | | 177*387f9dfdSAndroid Build Coastguard Worker 178*387f9dfdSAndroid Build Coastguard Workeravg = 4229 nsecs, total: 8789145 nsecs, count: 2078 179*387f9dfdSAndroid Build Coastguard Worker 180*387f9dfdSAndroid Build Coastguard WorkerDetaching... 181*387f9dfdSAndroid Build Coastguard Worker 182*387f9dfdSAndroid Build Coastguard WorkerThis shows a bimodal distribution. Many vfs_read() calls were faster than 15 183*387f9dfdSAndroid Build Coastguard Workermicroseconds, however, there was also a small handful between 65 milliseconds 184*387f9dfdSAndroid Build Coastguard Workerand 1 second, seen at the bottom of the table. These are likely network reads 185*387f9dfdSAndroid Build Coastguard Workerfrom SSH, waiting on interactive keystrokes. 186*387f9dfdSAndroid Build Coastguard Worker 187*387f9dfdSAndroid Build Coastguard Worker 188*387f9dfdSAndroid Build Coastguard WorkerTracing do_nanosleep() in milliseconds: 189*387f9dfdSAndroid Build Coastguard Worker 190*387f9dfdSAndroid Build Coastguard Worker# ./funclatency -m do_nanosleep 191*387f9dfdSAndroid Build Coastguard WorkerTracing do_nanosleep... Hit Ctrl-C to end. 192*387f9dfdSAndroid Build Coastguard Worker^C 193*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 194*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 195*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 196*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 197*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 198*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 199*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 200*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 201*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 202*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 203*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 328 |**************************************| 204*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 0 | | 205*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 0 | | 206*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 32 |*** | 207*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 0 | | 208*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 0 | | 209*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 2 | | 210*387f9dfdSAndroid Build Coastguard Worker 211*387f9dfdSAndroid Build Coastguard Workeravg = 1510 nsecs, total: 546816 nsecs, count: 326 212*387f9dfdSAndroid Build Coastguard Worker 213*387f9dfdSAndroid Build Coastguard WorkerDetaching... 214*387f9dfdSAndroid Build Coastguard Worker 215*387f9dfdSAndroid Build Coastguard WorkerThis looks like it has found threads that are sleeping every 1, 5, and 60 216*387f9dfdSAndroid Build Coastguard Workerseconds. 217*387f9dfdSAndroid Build Coastguard Worker 218*387f9dfdSAndroid Build Coastguard Worker 219*387f9dfdSAndroid Build Coastguard WorkerAn interval can be provided using -i, and timestamps added using -T. For 220*387f9dfdSAndroid Build Coastguard Workerexample, tracing vfs_read() latency in milliseconds and printing output 221*387f9dfdSAndroid Build Coastguard Workerevery 5 seconds: 222*387f9dfdSAndroid Build Coastguard Worker 223*387f9dfdSAndroid Build Coastguard Worker# ./funclatency -mTi 5 vfs_read 224*387f9dfdSAndroid Build Coastguard WorkerTracing vfs_read... Hit Ctrl-C to end. 225*387f9dfdSAndroid Build Coastguard Worker 226*387f9dfdSAndroid Build Coastguard Worker20:10:08 227*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 228*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 1500 |*************************************+| 229*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 3 | | 230*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 1 | | 231*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 2 | | 232*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 233*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 234*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 4 | | 235*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 3 | | 236*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 1 | | 237*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 7 | | 238*387f9dfdSAndroid Build Coastguard Worker 239*387f9dfdSAndroid Build Coastguard Workeravg = 5 nsecs, total: 8259 nsecs, count: 1521 240*387f9dfdSAndroid Build Coastguard Worker 241*387f9dfdSAndroid Build Coastguard Worker20:10:13 242*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 243*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 1251 |*************************************+| 244*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 3 | | 245*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 2 | | 246*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 247*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 2 | | 248*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 3 | | 249*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 5 | | 250*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 5 | | 251*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 3 | | 252*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 6 | | 253*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 2 | | 254*387f9dfdSAndroid Build Coastguard Worker 255*387f9dfdSAndroid Build Coastguard Workeravg = 9 nsecs, total: 11736 nsecs, count: 1282 256*387f9dfdSAndroid Build Coastguard Worker 257*387f9dfdSAndroid Build Coastguard Worker20:10:18 258*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 259*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 1265 |*************************************+| 260*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 261*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 5 | | 262*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 9 | | 263*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 7 | | 264*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 1 | | 265*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 2 | | 266*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 3 | | 267*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 5 | | 268*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 5 | | 269*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 0 | | 270*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 1 | | 271*387f9dfdSAndroid Build Coastguard Worker 272*387f9dfdSAndroid Build Coastguard Workeravg = 8 nsecs, total: 11219 nsecs, count: 1303 273*387f9dfdSAndroid Build Coastguard Worker 274*387f9dfdSAndroid Build Coastguard Worker^C 275*387f9dfdSAndroid Build Coastguard Worker20:10:20 276*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 277*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 249 |*************************************+| 278*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 279*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 280*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 1 | | 281*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 282*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 283*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 284*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 285*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 286*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 1 | | 287*387f9dfdSAndroid Build Coastguard Worker 288*387f9dfdSAndroid Build Coastguard Workeravg = 4 nsecs, total: 1029 nsecs, count: 251 289*387f9dfdSAndroid Build Coastguard Worker 290*387f9dfdSAndroid Build Coastguard WorkerDetaching... 291*387f9dfdSAndroid Build Coastguard Worker 292*387f9dfdSAndroid Build Coastguard Worker 293*387f9dfdSAndroid Build Coastguard WorkerA single process can be traced, which filters in-kernel for efficiency. Here, 294*387f9dfdSAndroid Build Coastguard Workerthe vfs_read() function is timed as milliseconds for PID 17064, which is a 295*387f9dfdSAndroid Build Coastguard Workerbash shell: 296*387f9dfdSAndroid Build Coastguard Worker 297*387f9dfdSAndroid Build Coastguard Worker# ./funclatency -mp 17064 vfs_read 298*387f9dfdSAndroid Build Coastguard WorkerTracing vfs_read... Hit Ctrl-C to end. 299*387f9dfdSAndroid Build Coastguard Worker^C 300*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 301*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 1 |** | 302*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 303*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 304*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 1 |** | 305*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 2 |***** | 306*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 307*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 13 |**************************************| 308*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 10 |***************************** | 309*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 4 |*********** | 310*387f9dfdSAndroid Build Coastguard Worker 311*387f9dfdSAndroid Build Coastguard Workeravg = 153 nsecs, total: 4765 nsecs, count: 31 312*387f9dfdSAndroid Build Coastguard Worker 313*387f9dfdSAndroid Build Coastguard WorkerDetaching... 314*387f9dfdSAndroid Build Coastguard Worker 315*387f9dfdSAndroid Build Coastguard WorkerThe distribution between 64 and 511 milliseconds shows keystroke latency. 316*387f9dfdSAndroid Build Coastguard Worker 317*387f9dfdSAndroid Build Coastguard Worker 318*387f9dfdSAndroid Build Coastguard WorkerThe -F option can be used to print a histogram per function. Eg: 319*387f9dfdSAndroid Build Coastguard Worker 320*387f9dfdSAndroid Build Coastguard Worker# ./funclatency -uF 'vfs_r*' 321*387f9dfdSAndroid Build Coastguard WorkerTracing 5 functions for "vfs_r*"... Hit Ctrl-C to end. 322*387f9dfdSAndroid Build Coastguard Worker^C 323*387f9dfdSAndroid Build Coastguard Worker 324*387f9dfdSAndroid Build Coastguard WorkerFunction = vfs_read 325*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 326*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 1044 |****************************************| 327*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 383 |************** | 328*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 76 |** | 329*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 41 |* | 330*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 26 | | 331*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 332*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 1 | | 333*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 334*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 335*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 0 | | 336*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 0 | | 337*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 4 | | 338*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 2 | | 339*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 0 | | 340*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 0 | | 341*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 2 | | 342*387f9dfdSAndroid Build Coastguard Worker 65536 -> 131071 : 5 | | 343*387f9dfdSAndroid Build Coastguard Worker 131072 -> 262143 : 5 | | 344*387f9dfdSAndroid Build Coastguard Worker 262144 -> 524287 : 3 | | 345*387f9dfdSAndroid Build Coastguard Worker 524288 -> 1048575 : 7 | | 346*387f9dfdSAndroid Build Coastguard Worker 347*387f9dfdSAndroid Build Coastguard WorkerFunction = vfs_rename 348*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 349*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 2 |**** | 350*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 2 |**** | 351*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 2 |**** | 352*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 353*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 6 |************* | 354*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 18 |****************************************| 355*387f9dfdSAndroid Build Coastguard Worker 356*387f9dfdSAndroid Build Coastguard Workeravg = 5087 nsecs, total: 8287001 nsecs, count: 1629 357*387f9dfdSAndroid Build Coastguard Worker 358*387f9dfdSAndroid Build Coastguard WorkerDetaching... 359*387f9dfdSAndroid Build Coastguard Worker 360*387f9dfdSAndroid Build Coastguard Worker 361*387f9dfdSAndroid Build Coastguard Worker 362*387f9dfdSAndroid Build Coastguard WorkerUSAGE message: 363*387f9dfdSAndroid Build Coastguard Worker 364*387f9dfdSAndroid Build Coastguard Worker# ./funclatency -h 365*387f9dfdSAndroid Build Coastguard Workerusage: funclatency [-h] [-p PID] [-i INTERVAL] [-T] [-u] [-m] [-F] [-r] [-v] 366*387f9dfdSAndroid Build Coastguard Worker pattern 367*387f9dfdSAndroid Build Coastguard Worker 368*387f9dfdSAndroid Build Coastguard WorkerTime functions and print latency as a histogram 369*387f9dfdSAndroid Build Coastguard Worker 370*387f9dfdSAndroid Build Coastguard Workerpositional arguments: 371*387f9dfdSAndroid Build Coastguard Worker pattern search expression for functions 372*387f9dfdSAndroid Build Coastguard Worker 373*387f9dfdSAndroid Build Coastguard Workeroptional arguments: 374*387f9dfdSAndroid Build Coastguard Worker -h, --help show this help message and exit 375*387f9dfdSAndroid Build Coastguard Worker -p PID, --pid PID trace this PID only 376*387f9dfdSAndroid Build Coastguard Worker -i INTERVAL, --interval INTERVAL 377*387f9dfdSAndroid Build Coastguard Worker summary interval, in seconds 378*387f9dfdSAndroid Build Coastguard Worker -d DURATION, --duration DURATION 379*387f9dfdSAndroid Build Coastguard Worker total duration of trace, in seconds 380*387f9dfdSAndroid Build Coastguard Worker -T, --timestamp include timestamp on output 381*387f9dfdSAndroid Build Coastguard Worker -u, --microseconds microsecond histogram 382*387f9dfdSAndroid Build Coastguard Worker -m, --milliseconds millisecond histogram 383*387f9dfdSAndroid Build Coastguard Worker -F, --function show a separate histogram per function 384*387f9dfdSAndroid Build Coastguard Worker -r, --regexp use regular expressions. Default is "*" wildcards 385*387f9dfdSAndroid Build Coastguard Worker only. 386*387f9dfdSAndroid Build Coastguard Worker -l LEVEL, --level LEVEL 387*387f9dfdSAndroid Build Coastguard Worker set the level of nested or recursive functions 388*387f9dfdSAndroid Build Coastguard Worker -v, --verbose print the BPF program (for debugging purposes) 389*387f9dfdSAndroid Build Coastguard Worker 390*387f9dfdSAndroid Build Coastguard Workerexamples: 391*387f9dfdSAndroid Build Coastguard Worker ./funclatency do_sys_open # time the do_sys_open() kernel function 392*387f9dfdSAndroid Build Coastguard Worker ./funclatency c:read # time the read() C library function 393*387f9dfdSAndroid Build Coastguard Worker ./funclatency -u vfs_read # time vfs_read(), in microseconds 394*387f9dfdSAndroid Build Coastguard Worker ./funclatency -m do_nanosleep # time do_nanosleep(), in milliseconds 395*387f9dfdSAndroid Build Coastguard Worker ./funclatency -i 2 -d 10 c:open # output every 2 seconds, for duration 10s 396*387f9dfdSAndroid Build Coastguard Worker ./funclatency -mTi 5 vfs_read # output every 5 seconds, with timestamps 397*387f9dfdSAndroid Build Coastguard Worker ./funclatency -p 181 vfs_read # time process 181 only 398*387f9dfdSAndroid Build Coastguard Worker ./funclatency 'vfs_fstat*' # time both vfs_fstat() and vfs_fstatat() 399*387f9dfdSAndroid Build Coastguard Worker ./funclatency 'c:*printf' # time the *printf family of functions 400*387f9dfdSAndroid Build Coastguard Worker ./funclatency -F 'vfs_r*' # show one histogram per matched function 401