1*387f9dfdSAndroid Build Coastguard WorkerDemonstrations of ext4dist, the Linux eBPF/bcc version. 2*387f9dfdSAndroid Build Coastguard Worker 3*387f9dfdSAndroid Build Coastguard Worker 4*387f9dfdSAndroid Build Coastguard Workerext4dist traces ext4 reads, writes, opens, and fsyncs, and summarizes their 5*387f9dfdSAndroid Build Coastguard Workerlatency as a power-of-2 histogram. For example: 6*387f9dfdSAndroid Build Coastguard Worker 7*387f9dfdSAndroid Build Coastguard Worker# ./ext4dist 8*387f9dfdSAndroid Build Coastguard WorkerTracing ext4 operation latency... Hit Ctrl-C to end. 9*387f9dfdSAndroid Build Coastguard Worker^C 10*387f9dfdSAndroid Build Coastguard Worker 11*387f9dfdSAndroid Build Coastguard Workeroperation = 'read' 12*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 13*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 1210 |****************************************| 14*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 126 |**** | 15*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 376 |************ | 16*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 86 |** | 17*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 9 | | 18*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 47 |* | 19*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 6 | | 20*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 24 | | 21*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 137 |**** | 22*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 66 |** | 23*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 13 | | 24*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 7 | | 25*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 13 | | 26*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 3 | | 27*387f9dfdSAndroid Build Coastguard Worker 28*387f9dfdSAndroid Build Coastguard Workeroperation = 'write' 29*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 30*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 31*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 32*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 33*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 75 |****************************************| 34*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 5 |** | 35*387f9dfdSAndroid Build Coastguard Worker 36*387f9dfdSAndroid Build Coastguard Workeroperation = 'open' 37*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 38*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 1278 |****************************************| 39*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 40 |* | 40*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 4 | | 41*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 1 | | 42*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 1 | | 43*387f9dfdSAndroid Build Coastguard Worker 44*387f9dfdSAndroid Build Coastguard WorkerThis output shows a bi-modal distribution for read latency, with a faster 45*387f9dfdSAndroid Build Coastguard Workermode of less than 7 microseconds, and a slower mode of between 256 and 1023 46*387f9dfdSAndroid Build Coastguard Workermicroseconds. The count column shows how many events fell into that latency 47*387f9dfdSAndroid Build Coastguard Workerrange. It's likely that the faster mode was a hit from the in-memory file 48*387f9dfdSAndroid Build Coastguard Workersystem cache, and the slower mode is a read from a storage device (disk). 49*387f9dfdSAndroid Build Coastguard Worker 50*387f9dfdSAndroid Build Coastguard WorkerThis "latency" is measured from when the operation was issued from the VFS 51*387f9dfdSAndroid Build Coastguard Workerinterface to the file system, to when it completed. This spans everything: 52*387f9dfdSAndroid Build Coastguard Workerblock device I/O (disk I/O), file system CPU cycles, file system locks, run 53*387f9dfdSAndroid Build Coastguard Workerqueue latency, etc. This is a better measure of the latency suffered by 54*387f9dfdSAndroid Build Coastguard Workerapplications reading from the file system than measuring this down at the 55*387f9dfdSAndroid Build Coastguard Workerblock device interface. 56*387f9dfdSAndroid Build Coastguard Worker 57*387f9dfdSAndroid Build Coastguard WorkerNote that this only traces the common file system operations previously 58*387f9dfdSAndroid Build Coastguard Workerlisted: other file system operations (eg, inode operations including 59*387f9dfdSAndroid Build Coastguard Workergetattr()) are not traced. 60*387f9dfdSAndroid Build Coastguard Worker 61*387f9dfdSAndroid Build Coastguard Worker 62*387f9dfdSAndroid Build Coastguard WorkerAn optional interval and a count can be provided, as well as -m to show the 63*387f9dfdSAndroid Build Coastguard Workerdistributions in milliseconds. For example: 64*387f9dfdSAndroid Build Coastguard Worker 65*387f9dfdSAndroid Build Coastguard Worker# ./ext4dist -m 1 5 66*387f9dfdSAndroid Build Coastguard WorkerTracing ext4 operation latency... Hit Ctrl-C to end. 67*387f9dfdSAndroid Build Coastguard Worker 68*387f9dfdSAndroid Build Coastguard Worker10:19:00: 69*387f9dfdSAndroid Build Coastguard Worker 70*387f9dfdSAndroid Build Coastguard Workeroperation = 'read' 71*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 72*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 576 |****************************************| 73*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 5 | | 74*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 6 | | 75*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 13 | | 76*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 17 |* | 77*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 5 | | 78*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 1 | | 79*387f9dfdSAndroid Build Coastguard Worker 80*387f9dfdSAndroid Build Coastguard Workeroperation = 'write' 81*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 82*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 20 |****************************************| 83*387f9dfdSAndroid Build Coastguard Worker 84*387f9dfdSAndroid Build Coastguard Workeroperation = 'open' 85*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 86*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 346 |****************************************| 87*387f9dfdSAndroid Build Coastguard Worker 88*387f9dfdSAndroid Build Coastguard Worker10:19:01: 89*387f9dfdSAndroid Build Coastguard Worker 90*387f9dfdSAndroid Build Coastguard Workeroperation = 'read' 91*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 92*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 584 |****************************************| 93*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 10 | | 94*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 11 | | 95*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 16 |* | 96*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 6 | | 97*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 4 | | 98*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 2 | | 99*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 1 | | 100*387f9dfdSAndroid Build Coastguard Worker 101*387f9dfdSAndroid Build Coastguard Workeroperation = 'write' 102*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 103*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 20 |****************************************| 104*387f9dfdSAndroid Build Coastguard Worker 105*387f9dfdSAndroid Build Coastguard Workeroperation = 'open' 106*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 107*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 336 |****************************************| 108*387f9dfdSAndroid Build Coastguard Worker 109*387f9dfdSAndroid Build Coastguard Worker10:19:02: 110*387f9dfdSAndroid Build Coastguard Worker 111*387f9dfdSAndroid Build Coastguard Workeroperation = 'read' 112*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 113*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 678 |****************************************| 114*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 7 | | 115*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 9 | | 116*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 25 |* | 117*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 10 | | 118*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 3 | | 119*387f9dfdSAndroid Build Coastguard Worker 120*387f9dfdSAndroid Build Coastguard Workeroperation = 'write' 121*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 122*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 19 |****************************************| 123*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 1 |** | 124*387f9dfdSAndroid Build Coastguard Worker 125*387f9dfdSAndroid Build Coastguard Workeroperation = 'open' 126*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 127*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 390 |****************************************| 128*387f9dfdSAndroid Build Coastguard Worker 129*387f9dfdSAndroid Build Coastguard Worker10:19:03: 130*387f9dfdSAndroid Build Coastguard Worker 131*387f9dfdSAndroid Build Coastguard Workeroperation = 'read' 132*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 133*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 567 |****************************************| 134*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 7 | | 135*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 9 | | 136*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 20 |* | 137*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 15 |* | 138*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 5 | | 139*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 2 | | 140*387f9dfdSAndroid Build Coastguard Worker 141*387f9dfdSAndroid Build Coastguard Workeroperation = 'write' 142*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 143*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 20 |****************************************| 144*387f9dfdSAndroid Build Coastguard Worker 145*387f9dfdSAndroid Build Coastguard Workeroperation = 'open' 146*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 147*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 417 |****************************************| 148*387f9dfdSAndroid Build Coastguard Worker 149*387f9dfdSAndroid Build Coastguard Worker10:19:04: 150*387f9dfdSAndroid Build Coastguard Worker 151*387f9dfdSAndroid Build Coastguard Workeroperation = 'read' 152*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 153*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 762 |****************************************| 154*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 9 | | 155*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 9 | | 156*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 11 | | 157*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 20 |* | 158*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 4 | | 159*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 1 | | 160*387f9dfdSAndroid Build Coastguard Worker 161*387f9dfdSAndroid Build Coastguard Workeroperation = 'write' 162*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 163*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 20 |****************************************| 164*387f9dfdSAndroid Build Coastguard Worker 165*387f9dfdSAndroid Build Coastguard Workeroperation = 'open' 166*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 167*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 427 |****************************************| 168*387f9dfdSAndroid Build Coastguard Worker 169*387f9dfdSAndroid Build Coastguard WorkerThis shows a mixed read/write workload. 170*387f9dfdSAndroid Build Coastguard Worker 171*387f9dfdSAndroid Build Coastguard Worker 172*387f9dfdSAndroid Build Coastguard WorkerUSAGE message: 173*387f9dfdSAndroid Build Coastguard Worker 174*387f9dfdSAndroid Build Coastguard Worker# ./ext4dist -h 175*387f9dfdSAndroid Build Coastguard Workerusage: ext4dist [-h] [-T] [-m] [-p PID] [interval] [count] 176*387f9dfdSAndroid Build Coastguard Worker 177*387f9dfdSAndroid Build Coastguard WorkerSummarize ext4 operation latency 178*387f9dfdSAndroid Build Coastguard Worker 179*387f9dfdSAndroid Build Coastguard Workerpositional arguments: 180*387f9dfdSAndroid Build Coastguard Worker interval output interval, in seconds 181*387f9dfdSAndroid Build Coastguard Worker count number of outputs 182*387f9dfdSAndroid Build Coastguard Worker 183*387f9dfdSAndroid Build Coastguard Workeroptional arguments: 184*387f9dfdSAndroid Build Coastguard Worker -h, --help show this help message and exit 185*387f9dfdSAndroid Build Coastguard Worker -T, --notimestamp don't include timestamp on interval output 186*387f9dfdSAndroid Build Coastguard Worker -m, --milliseconds output in milliseconds 187*387f9dfdSAndroid Build Coastguard Worker -p PID, --pid PID trace this PID only 188*387f9dfdSAndroid Build Coastguard Worker 189*387f9dfdSAndroid Build Coastguard Workerexamples: 190*387f9dfdSAndroid Build Coastguard Worker ./ext4dist # show operation latency as a histogram 191*387f9dfdSAndroid Build Coastguard Worker ./ext4dist -p 181 # trace PID 181 only 192*387f9dfdSAndroid Build Coastguard Worker ./ext4dist 1 10 # print 1 second summaries, 10 times 193*387f9dfdSAndroid Build Coastguard Worker ./ext4dist -m 5 # 5s summaries, milliseconds 194