1*387f9dfdSAndroid Build Coastguard WorkerDemonstrations of zfsdist, the Linux eBPF/bcc version. 2*387f9dfdSAndroid Build Coastguard Worker 3*387f9dfdSAndroid Build Coastguard Worker 4*387f9dfdSAndroid Build Coastguard Workerzfsdist traces ZFS reads, writes, opens, and fsyncs, and summarizes their 5*387f9dfdSAndroid Build Coastguard Workerlatency as a power-of-2 histogram. It has been written to work on ZFS on Linux 6*387f9dfdSAndroid Build Coastguard Worker(http://zfsonlinux.org). For example: 7*387f9dfdSAndroid Build Coastguard Worker 8*387f9dfdSAndroid Build Coastguard Worker# ./zfsdist 9*387f9dfdSAndroid Build Coastguard WorkerTracing ZFS operation latency... Hit Ctrl-C to end. 10*387f9dfdSAndroid Build Coastguard Worker^C 11*387f9dfdSAndroid Build Coastguard Worker 12*387f9dfdSAndroid Build Coastguard Workeroperation = 'read' 13*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 14*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 15*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 16*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 4479 |****************************************| 17*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 1028 |********* | 18*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 14 | | 19*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 1 | | 20*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 2 | | 21*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 6 | | 22*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 1 | | 23*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 1256 |*********** | 24*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 9 | | 25*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 1 | | 26*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 2 | | 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 : 0 | | 34*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 35*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 36*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 37*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 75 |****************************************| 38*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 11 |***** | 39*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 0 | | 40*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 0 | | 41*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 0 | | 42*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 0 | | 43*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 0 | | 44*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 0 | | 45*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 0 | | 46*387f9dfdSAndroid Build Coastguard Worker 65536 -> 131071 : 13 |****** | 47*387f9dfdSAndroid Build Coastguard Worker 131072 -> 262143 : 1 | | 48*387f9dfdSAndroid Build Coastguard Worker 49*387f9dfdSAndroid Build Coastguard Workeroperation = 'open' 50*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 51*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 52*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 2 |****************************************| 53*387f9dfdSAndroid Build Coastguard Worker 54*387f9dfdSAndroid Build Coastguard WorkerThis output shows a bimodal distribution for read latency, with a faster 55*387f9dfdSAndroid Build Coastguard Workermode of around 5 thousand reads that took between 4 and 15 microseconds, and a 56*387f9dfdSAndroid Build Coastguard Workerslower mode of 1256 reads that took between 512 and 1023 microseconds. It's 57*387f9dfdSAndroid Build Coastguard Workerlikely that the faster mode was a hit from the in-memory file system cache, 58*387f9dfdSAndroid Build Coastguard Workerand the slower mode is a read from a storage device (disk). 59*387f9dfdSAndroid Build Coastguard Worker 60*387f9dfdSAndroid Build Coastguard WorkerThe write latency is also bimodal, with a faster mode between 128 and 511 us, 61*387f9dfdSAndroid Build Coastguard Workerand the slower mode between 65 and 131 ms. 62*387f9dfdSAndroid Build Coastguard Worker 63*387f9dfdSAndroid Build Coastguard WorkerThis "latency" is measured from when the operation was issued from the VFS 64*387f9dfdSAndroid Build Coastguard Workerinterface to the file system (via the ZFS POSIX layer), to when it completed. 65*387f9dfdSAndroid Build Coastguard WorkerThis spans everything: block device I/O (disk I/O), file system CPU cycles, 66*387f9dfdSAndroid Build Coastguard Workerfile system locks, run queue latency, etc. This is a better measure of the 67*387f9dfdSAndroid Build Coastguard Workerlatency suffered by applications reading from the file system than measuring 68*387f9dfdSAndroid Build Coastguard Workerthis down at the block device interface. 69*387f9dfdSAndroid Build Coastguard Worker 70*387f9dfdSAndroid Build Coastguard WorkerNote that this only traces the common file system operations previously 71*387f9dfdSAndroid Build Coastguard Workerlisted: other file system operations (eg, inode operations including 72*387f9dfdSAndroid Build Coastguard Workergetattr()) are not traced. 73*387f9dfdSAndroid Build Coastguard Worker 74*387f9dfdSAndroid Build Coastguard Worker 75*387f9dfdSAndroid Build Coastguard WorkerAn optional interval and a count can be provided, as well as -m to show the 76*387f9dfdSAndroid Build Coastguard Workerdistributions in milliseconds. For example: 77*387f9dfdSAndroid Build Coastguard Worker 78*387f9dfdSAndroid Build Coastguard Worker# ./zfsdist 1 5 79*387f9dfdSAndroid Build Coastguard WorkerTracing ZFS operation latency... Hit Ctrl-C to end. 80*387f9dfdSAndroid Build Coastguard Worker 81*387f9dfdSAndroid Build Coastguard Worker06:55:41: 82*387f9dfdSAndroid Build Coastguard Worker 83*387f9dfdSAndroid Build Coastguard Workeroperation = 'read' 84*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 85*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 86*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 87*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 3976 |****************************************| 88*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 1181 |*********** | 89*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 18 | | 90*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 4 | | 91*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 17 | | 92*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 16 | | 93*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 94*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 1275 |************ | 95*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 36 | | 96*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 3 | | 97*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 0 | | 98*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 1 | | 99*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 1 | | 100*387f9dfdSAndroid Build Coastguard Worker 101*387f9dfdSAndroid Build Coastguard Worker06:55:42: 102*387f9dfdSAndroid Build Coastguard Worker 103*387f9dfdSAndroid Build Coastguard Workeroperation = 'read' 104*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 105*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 106*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 107*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 12751 |****************************************| 108*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 1190 |*** | 109*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 38 | | 110*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 7 | | 111*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 85 | | 112*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 47 | | 113*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 114*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 1010 |*** | 115*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 49 | | 116*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 12 | | 117*387f9dfdSAndroid Build Coastguard Worker 118*387f9dfdSAndroid Build Coastguard Worker06:55:43: 119*387f9dfdSAndroid Build Coastguard Worker 120*387f9dfdSAndroid Build Coastguard Workeroperation = 'read' 121*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 122*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 123*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 124*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 80925 |****************************************| 125*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 1645 | | 126*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 251 | | 127*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 24 | | 128*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 16 | | 129*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 12 | | 130*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 0 | | 131*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 80 | | 132*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 1 | | 133*387f9dfdSAndroid Build Coastguard Worker 134*387f9dfdSAndroid Build Coastguard Worker06:55:44: 135*387f9dfdSAndroid Build Coastguard Worker 136*387f9dfdSAndroid Build Coastguard Workeroperation = 'read' 137*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 138*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 139*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 140*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 81207 |****************************************| 141*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 2075 |* | 142*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 2005 | | 143*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 177 | | 144*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 3 | | 145*387f9dfdSAndroid Build Coastguard Worker 146*387f9dfdSAndroid Build Coastguard Worker06:55:45: 147*387f9dfdSAndroid Build Coastguard Worker 148*387f9dfdSAndroid Build Coastguard Workeroperation = 'read' 149*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 150*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 151*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 152*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 74364 |****************************************| 153*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 865 | | 154*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 4960 |** | 155*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 625 | | 156*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 2 | | 157*387f9dfdSAndroid Build Coastguard Worker 158*387f9dfdSAndroid Build Coastguard WorkerThis workload was randomly reading from a file that became cached. The slower 159*387f9dfdSAndroid Build Coastguard Workermode can be seen to disappear by the final summaries. 160*387f9dfdSAndroid Build Coastguard Worker 161*387f9dfdSAndroid Build Coastguard Worker 162*387f9dfdSAndroid Build Coastguard WorkerUSAGE message: 163*387f9dfdSAndroid Build Coastguard Worker 164*387f9dfdSAndroid Build Coastguard Worker# ./zfsdist -h 165*387f9dfdSAndroid Build Coastguard Workerusage: zfsdist [-h] [-T] [-m] [-p PID] [interval] [count] 166*387f9dfdSAndroid Build Coastguard Worker 167*387f9dfdSAndroid Build Coastguard WorkerSummarize ZFS operation latency 168*387f9dfdSAndroid Build Coastguard Worker 169*387f9dfdSAndroid Build Coastguard Workerpositional arguments: 170*387f9dfdSAndroid Build Coastguard Worker interval output interval, in seconds 171*387f9dfdSAndroid Build Coastguard Worker count number of outputs 172*387f9dfdSAndroid Build Coastguard Worker 173*387f9dfdSAndroid Build Coastguard Workeroptional arguments: 174*387f9dfdSAndroid Build Coastguard Worker -h, --help show this help message and exit 175*387f9dfdSAndroid Build Coastguard Worker -T, --notimestamp don't include timestamp on interval output 176*387f9dfdSAndroid Build Coastguard Worker -m, --milliseconds output in milliseconds 177*387f9dfdSAndroid Build Coastguard Worker -p PID, --pid PID trace this PID only 178*387f9dfdSAndroid Build Coastguard Worker 179*387f9dfdSAndroid Build Coastguard Workerexamples: 180*387f9dfdSAndroid Build Coastguard Worker ./zfsdist # show operation latency as a histogram 181*387f9dfdSAndroid Build Coastguard Worker ./zfsdist -p 181 # trace PID 181 only 182*387f9dfdSAndroid Build Coastguard Worker ./zfsdist 1 10 # print 1 second summaries, 10 times 183*387f9dfdSAndroid Build Coastguard Worker ./zfsdist -m 5 # 5s summaries, milliseconds 184