Demonstrations of biolatpcts, the Linux eBPF/bcc version. biolatpcts traces block device I/O (disk I/O), and prints the latency percentiles per I/O type. Example: # ./biolatpcts.py /dev/nvme0n1 nvme0n1 p1 p5 p10 p16 p25 p50 p75 p84 p90 p95 p99 p100 read 95us 175us 305us 515us 895us 985us 995us 1.5ms 2.5ms 3.5ms 4.5ms 10ms write 5us 5us 5us 15us 25us 135us 765us 855us 885us 895us 965us 1.5ms discard 5us 5us 5us 5us 135us 145us 165us 205us 385us 875us 1.5ms 2.5ms flush 5us 5us 5us 5us 5us 5us 5us 5us 5us 1.5ms 4.5ms 5.5ms [...] Unless changed with the -i option, the latency percentiles are printed every 3 seconds. Any number of custom percentiles can be requested with the -p option: # ./biolatpcts.py /dev/nvme0n1 -p 01,90.0,99.9,99.99,100.0 nvme0n1 01 90.0 99.9 99.99 100.0 read 5us 4.5ms 16ms 22ms 26ms write 15us 255us 365us 515us 2.5ms discard - - - - - flush 5us 5us 5us 5us 24ms [...] Note that the target percentile strings are preserved as-is to facilitate exact key matching when the output is consumed by another program. When the output is consumed by another program, parsing can be tedious. The -j option makes biolatpcts output results in json, one line per interval. # ./tools/biolatpcts.py /dev/nvme0n1 -j {"read": {"1": 2.5e-05, "5": 3.5e-05, "10": 4.5e-05, "16": 0.000145, "25": 0.000195, "50": 0.000355, "75": 0.000605, "84": 0.000775, "90": 0.000965, "95": 0.0015, "99": 0.0025, "100": 0.0235}, "write": {"1": 5e-06, "5": 5e-06, "10": 5e-06, "16": 5e-06, "25": 1.5e-05, "50": 2.5e-05, "75": 4.5e-05, "84": 7.5e-05, "90": 0.000195, "95": 0.000665, "99": 0.0015, "100": 0.0035}, "discard": {"1": 0.0, "5": 0.0, "10": 0.0, "16": 0.0, "25": 0.0, "50": 0.0, "75": 0.0, "84": 0.0, "90": 0.0, "95": 0.0, "99": 0.0, "100": 0.0}, "flush": {"1": 0.0, "5": 0.0, "10": 0.0, "16": 0.0, "25": 0.0, "50": 0.0, "75": 0.0, "84": 0.0, "90": 0.0, "95": 0.0, "99": 0.0, "100": 0.0}} [...] By default biolatpcts measures the duration each IO was on the device. It can be changed using the -w option. USAGE message: usage: biolatpcts.py [-h] [-i INTERVAL] [-w {from-rq-alloc,after-rq-alloc,on-device}] [-p PCT,...] [-j] [--verbose] DEV Monitor IO latency distribution of a block device positional arguments: DEV Target block device (/dev/DEVNAME, DEVNAME or MAJ:MIN) optional arguments: -h, --help show this help message and exit -i INTERVAL, --interval INTERVAL Report interval (default: 3) -w {from-rq-alloc,after-rq-alloc,on-device}, --which {from-rq-alloc,after-rq-alloc,on-device} Which latency to measure (default: on-device) -p PCT,..., --pcts PCT,... Percentiles to calculate (default: 1,5,10,16,25,50,75,84,90,95,99,100) -j, --json Output in json (default: False) --verbose, -v