1*387f9dfdSAndroid Build Coastguard WorkerDemonstrations of nfsdist, the Linux eBPF/bcc version. 2*387f9dfdSAndroid Build Coastguard Worker 3*387f9dfdSAndroid Build Coastguard Workernfsdist traces NFS reads, writes, opens, and getattr, and summarizes their 4*387f9dfdSAndroid Build Coastguard Workerlatency as a power-of-2 histogram. For example: 5*387f9dfdSAndroid Build Coastguard Worker 6*387f9dfdSAndroid Build Coastguard Worker 7*387f9dfdSAndroid Build Coastguard Worker./nfsdist.py 8*387f9dfdSAndroid Build Coastguard Worker 9*387f9dfdSAndroid Build Coastguard WorkerTracing NFS operation latency... Hit Ctrl-C to end. 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 : 4 | | 14*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 15*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 16*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 7107 |************** | 17*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 19864 |****************************************| 18*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 1494 |*** | 19*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 491 | | 20*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 1810 |*** | 21*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 6356 |************ | 22*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 4860 |********* | 23*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 3070 |****** | 24*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 1853 |*** | 25*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 921 |* | 26*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 122 | | 27*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 15 | | 28*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 5 | | 29*387f9dfdSAndroid Build Coastguard Worker 65536 -> 131071 : 2 | | 30*387f9dfdSAndroid Build Coastguard Worker 131072 -> 262143 : 1 | | 31*387f9dfdSAndroid Build Coastguard Worker 32*387f9dfdSAndroid Build Coastguard Workeroperation = write 33*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 34*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 35*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 36*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 37*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 1 | | 38*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 39*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 9 | | 40*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 19491 |****************************************| 41*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 3064 |****** | 42*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 940 |* | 43*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 365 | | 44*387f9dfdSAndroid Build Coastguard Worker 1024 -> 2047 : 312 | | 45*387f9dfdSAndroid Build Coastguard Worker 2048 -> 4095 : 119 | | 46*387f9dfdSAndroid Build Coastguard Worker 4096 -> 8191 : 31 | | 47*387f9dfdSAndroid Build Coastguard Worker 8192 -> 16383 : 84 | | 48*387f9dfdSAndroid Build Coastguard Worker 16384 -> 32767 : 31 | | 49*387f9dfdSAndroid Build Coastguard Worker 32768 -> 65535 : 5 | | 50*387f9dfdSAndroid Build Coastguard Worker 65536 -> 131071 : 3 | | 51*387f9dfdSAndroid Build Coastguard Worker 131072 -> 262143 : 0 | | 52*387f9dfdSAndroid Build Coastguard Worker 262144 -> 524287 : 1 | | 53*387f9dfdSAndroid Build Coastguard Worker 54*387f9dfdSAndroid Build Coastguard Workeroperation = getattr 55*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 56*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 27 |****************************************| 57*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 2 |** | 58*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 3 |**** | 59*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 60*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 61*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 62*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 63*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 64*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 2 |** | 65*387f9dfdSAndroid Build Coastguard Worker 512 -> 1023 : 2 |** | 66*387f9dfdSAndroid Build Coastguard Worker 67*387f9dfdSAndroid Build Coastguard Workeroperation = open 68*387f9dfdSAndroid Build Coastguard Worker usecs : count distribution 69*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 70*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 0 | | 71*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 0 | | 72*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 0 | | 73*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 0 | | 74*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 0 | | 75*387f9dfdSAndroid Build Coastguard Worker 64 -> 127 : 0 | | 76*387f9dfdSAndroid Build Coastguard Worker 128 -> 255 : 0 | | 77*387f9dfdSAndroid Build Coastguard Worker 256 -> 511 : 2 |****************************************| 78*387f9dfdSAndroid Build Coastguard Worker 79*387f9dfdSAndroid Build Coastguard Worker 80*387f9dfdSAndroid Build Coastguard WorkerIn this example you can see that the read traffic is rather bi-modal, with about 81*387f9dfdSAndroid Build Coastguard Worker26K reads falling within 8 - 30 usecs and about 18K reads spread between 128 - 82*387f9dfdSAndroid Build Coastguard Worker8191 usecs. Write traffic is largely clustered in the 64 - 127 usecs bracket. 83*387f9dfdSAndroid Build Coastguard WorkerThe faster read traffic is probably coming from a filesystem cache and the slower 84*387f9dfdSAndroid Build Coastguard Workertraffic from disk. The reason why the writes are so consistently fast is because 85*387f9dfdSAndroid Build Coastguard Workerthis example test was run on a couple of VM's and I believe the hypervisor was 86*387f9dfdSAndroid Build Coastguard Workercaching all the write traffic to memory. 87*387f9dfdSAndroid Build Coastguard Worker 88*387f9dfdSAndroid Build Coastguard WorkerThis "latency" is measured from when the operation was issued from the VFS 89*387f9dfdSAndroid Build Coastguard Workerinterface to the file system, to when it completed. This spans everything: 90*387f9dfdSAndroid Build Coastguard WorkerRPC latency, network latency, file system CPU cycles, file system locks, run 91*387f9dfdSAndroid Build Coastguard Workerqueue latency, etc. This is a better measure of the latency suffered by 92*387f9dfdSAndroid Build Coastguard Workerapplications reading from a NFS share and can better expose problems 93*387f9dfdSAndroid Build Coastguard Workerexperienced by NFS clients. 94*387f9dfdSAndroid Build Coastguard Worker 95*387f9dfdSAndroid Build Coastguard WorkerNote that this only traces the common NFS operations (read, write, open and 96*387f9dfdSAndroid Build Coastguard Workergetattr). I chose to include getattr as a significant percentage of NFS 97*387f9dfdSAndroid Build Coastguard Workertraffic end up being getattr calls and are a good indicator of problems 98*387f9dfdSAndroid Build Coastguard Workerwith an NFS server. 99*387f9dfdSAndroid Build Coastguard Worker 100*387f9dfdSAndroid Build Coastguard WorkerAn optional interval and a count can be provided, as well as -m to show the 101*387f9dfdSAndroid Build Coastguard Workerdistributions in milliseconds. For example: 102*387f9dfdSAndroid Build Coastguard Worker 103*387f9dfdSAndroid Build Coastguard Worker./nfsdist -m 1 5 104*387f9dfdSAndroid Build Coastguard WorkerTracing NFS operation latency... Hit Ctrl-C to end. 105*387f9dfdSAndroid Build Coastguard Worker 106*387f9dfdSAndroid Build Coastguard Worker11:02:39: 107*387f9dfdSAndroid Build Coastguard Worker 108*387f9dfdSAndroid Build Coastguard Workeroperation = write 109*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 110*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 1 | | 111*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 24 |******** | 112*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 114 |****************************************| 113*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 9 |*** | 114*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 1 | | 115*387f9dfdSAndroid Build Coastguard Worker 32 -> 63 : 1 | | 116*387f9dfdSAndroid Build Coastguard Worker 117*387f9dfdSAndroid Build Coastguard Worker11:02:40: 118*387f9dfdSAndroid Build Coastguard Worker 119*387f9dfdSAndroid Build Coastguard Workeroperation = write 120*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 121*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 122*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 11 |*** | 123*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 111 |****************************************| 124*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 13 |**** | 125*387f9dfdSAndroid Build Coastguard Worker 16 -> 31 : 1 | | 126*387f9dfdSAndroid Build Coastguard Worker 127*387f9dfdSAndroid Build Coastguard Worker11:02:41: 128*387f9dfdSAndroid Build Coastguard Worker 129*387f9dfdSAndroid Build Coastguard Workeroperation = write 130*387f9dfdSAndroid Build Coastguard Worker msecs : count distribution 131*387f9dfdSAndroid Build Coastguard Worker 0 -> 1 : 0 | | 132*387f9dfdSAndroid Build Coastguard Worker 2 -> 3 : 21 |****** | 133*387f9dfdSAndroid Build Coastguard Worker 4 -> 7 : 137 |****************************************| 134*387f9dfdSAndroid Build Coastguard Worker 8 -> 15 : 3 | | 135*387f9dfdSAndroid Build Coastguard Worker 136*387f9dfdSAndroid Build Coastguard WorkerThis shows a write workload, with writes hovering primarily in the 4-7ms range. 137*387f9dfdSAndroid Build Coastguard Worker 138*387f9dfdSAndroid Build Coastguard WorkerUSAGE message: 139*387f9dfdSAndroid Build Coastguard Worker 140*387f9dfdSAndroid Build Coastguard Worker 141*387f9dfdSAndroid Build Coastguard Worker./nfsdist -h 142*387f9dfdSAndroid Build Coastguard Workerusage: nfsdist.py [-h] [-T] [-m] [-p PID] [interval] [count] 143*387f9dfdSAndroid Build Coastguard Worker 144*387f9dfdSAndroid Build Coastguard WorkerSummarize NFS operation latency 145*387f9dfdSAndroid Build Coastguard Worker 146*387f9dfdSAndroid Build Coastguard Workerpositional arguments: 147*387f9dfdSAndroid Build Coastguard Worker interval output interval, in seconds 148*387f9dfdSAndroid Build Coastguard Worker count number of outputs 149*387f9dfdSAndroid Build Coastguard Worker 150*387f9dfdSAndroid Build Coastguard Workeroptional arguments: 151*387f9dfdSAndroid Build Coastguard Worker -h, --help show this help message and exit 152*387f9dfdSAndroid Build Coastguard Worker -T, --notimestamp don't include timestamp on interval output 153*387f9dfdSAndroid Build Coastguard Worker -m, --milliseconds output in milliseconds 154*387f9dfdSAndroid Build Coastguard Worker -p PID, --pid PID trace this PID only 155*387f9dfdSAndroid Build Coastguard Worker 156*387f9dfdSAndroid Build Coastguard Workerexamples: 157*387f9dfdSAndroid Build Coastguard Worker ./nfsdist # show operation latency as a histogram 158*387f9dfdSAndroid Build Coastguard Worker ./nfsdist -p 181 # trace PID 181 only 159*387f9dfdSAndroid Build Coastguard Worker ./nfsdist 1 10 # print 1 second summaries, 10 times 160*387f9dfdSAndroid Build Coastguard Worker ./nfsdist -m 5 # 5s summaries, milliseconds 161