|  | Demonstrations of xfsdist, the Linux eBPF/bcc version. | 
|  |  | 
|  |  | 
|  | xfsdist traces XFS reads, writes, opens, and fsyncs, and summarizes their | 
|  | latency as a power-of-2 histogram. For example: | 
|  |  | 
|  | # ./xfsdist | 
|  | Tracing XFS operation latency... Hit Ctrl-C to end. | 
|  | ^C | 
|  |  | 
|  | operation = 'read' | 
|  | usecs               : count     distribution | 
|  | 0 -> 1          : 0        |                                        | | 
|  | 2 -> 3          : 362      |                                        | | 
|  | 4 -> 7          : 807      |*                                       | | 
|  | 8 -> 15         : 20686    |****************************************| | 
|  | 16 -> 31         : 512      |                                        | | 
|  | 32 -> 63         : 4        |                                        | | 
|  | 64 -> 127        : 2744     |*****                                   | | 
|  | 128 -> 255        : 7127     |*************                           | | 
|  | 256 -> 511        : 2483     |****                                    | | 
|  | 512 -> 1023       : 1281     |**                                      | | 
|  | 1024 -> 2047       : 39       |                                        | | 
|  | 2048 -> 4095       : 5        |                                        | | 
|  | 4096 -> 8191       : 1        |                                        | | 
|  |  | 
|  | operation = 'open' | 
|  | usecs               : count     distribution | 
|  | 0 -> 1          : 0        |                                        | | 
|  | 2 -> 3          : 3        |****************************************| | 
|  |  | 
|  | This output shows a bi-modal distribution for read latency, with a faster | 
|  | mode of 20,686 reads that took between 8 and 15 microseconds, and a slower | 
|  | mode of over 10,000 reads that took between 64 and 1023 microseconds. It's | 
|  | likely that the faster mode was a hit from the in-memory file system cache, | 
|  | and the slower mode is a read from a storage device (disk). | 
|  |  | 
|  | This "latency" is measured from when the operation was issued from the VFS | 
|  | interface to the file system, to when it completed. This spans everything: | 
|  | block device I/O (disk I/O), file system CPU cycles, file system locks, run | 
|  | queue latency, etc. This is a better measure of the latency suffered by | 
|  | applications reading from the file system than measuring this down at the | 
|  | block device interface. | 
|  |  | 
|  | Note that this only traces the common file system operations previously | 
|  | listed: other file system operations (eg, inode operations including | 
|  | getattr()) are not traced. | 
|  |  | 
|  |  | 
|  | An optional interval and a count can be provided, as well as -m to show the | 
|  | distributions in milliseconds. For example: | 
|  |  | 
|  | # ./xfsdist -m 1 5 | 
|  | Tracing XFS operation latency... Hit Ctrl-C to end. | 
|  |  | 
|  | 10:14:15: | 
|  |  | 
|  | operation = 'read' | 
|  | msecs               : count     distribution | 
|  | 0 -> 1          : 1366     |****************************************| | 
|  | 2 -> 3          : 86       |**                                      | | 
|  | 4 -> 7          : 95       |**                                      | | 
|  | 8 -> 15         : 132      |***                                     | | 
|  | 16 -> 31         : 72       |**                                      | | 
|  |  | 
|  | operation = 'write' | 
|  | msecs               : count     distribution | 
|  | 0 -> 1          : 685      |****************************************| | 
|  |  | 
|  | 10:14:16: | 
|  |  | 
|  | operation = 'read' | 
|  | msecs               : count     distribution | 
|  | 0 -> 1          : 984      |****************************************| | 
|  | 2 -> 3          : 66       |**                                      | | 
|  | 4 -> 7          : 67       |**                                      | | 
|  | 8 -> 15         : 104      |****                                    | | 
|  | 16 -> 31         : 70       |**                                      | | 
|  | 32 -> 63         : 12       |                                        | | 
|  |  | 
|  | operation = 'write' | 
|  | msecs               : count     distribution | 
|  | 0 -> 1          : 536      |****************************************| | 
|  |  | 
|  | 10:14:17: | 
|  |  | 
|  | operation = 'read' | 
|  | msecs               : count     distribution | 
|  | 0 -> 1          : 1262     |****************************************| | 
|  | 2 -> 3          : 75       |**                                      | | 
|  | 4 -> 7          : 80       |**                                      | | 
|  | 8 -> 15         : 119      |***                                     | | 
|  | 16 -> 31         : 75       |**                                      | | 
|  | 32 -> 63         : 3        |                                        | | 
|  |  | 
|  | operation = 'write' | 
|  | msecs               : count     distribution | 
|  | 0 -> 1          : 639      |****************************************| | 
|  |  | 
|  | 10:14:18: | 
|  |  | 
|  | operation = 'read' | 
|  | msecs               : count     distribution | 
|  | 0 -> 1          : 1070     |****************************************| | 
|  | 2 -> 3          : 58       |**                                      | | 
|  | 4 -> 7          : 74       |**                                      | | 
|  | 8 -> 15         : 140      |*****                                   | | 
|  | 16 -> 31         : 60       |**                                      | | 
|  | 32 -> 63         : 5        |                                        | | 
|  |  | 
|  | operation = 'write' | 
|  | msecs               : count     distribution | 
|  | 0 -> 1          : 556      |****************************************| | 
|  |  | 
|  | 10:14:19: | 
|  |  | 
|  | operation = 'read' | 
|  | msecs               : count     distribution | 
|  | 0 -> 1          : 1176     |****************************************| | 
|  | 2 -> 3          : 53       |*                                       | | 
|  | 4 -> 7          : 94       |***                                     | | 
|  | 8 -> 15         : 112      |***                                     | | 
|  | 16 -> 31         : 77       |**                                      | | 
|  | 32 -> 63         : 3        |                                        | | 
|  |  | 
|  | operation = 'write' | 
|  | msecs               : count     distribution | 
|  | 0 -> 1          : 613      |****************************************| | 
|  |  | 
|  | This shows a mixed read/write workload, where the slower read mode was around | 
|  | 10 ms. | 
|  |  | 
|  |  | 
|  | USAGE message: | 
|  |  | 
|  | # ./xfsdist -h | 
|  | usage: xfsdist [-h] [-T] [-m] [-p PID] [interval] [count] | 
|  |  | 
|  | Summarize XFS operation latency | 
|  |  | 
|  | positional arguments: | 
|  | interval            output interval, in seconds | 
|  | count               number of outputs | 
|  |  | 
|  | optional arguments: | 
|  | -h, --help          show this help message and exit | 
|  | -T, --notimestamp   don't include timestamp on interval output | 
|  | -m, --milliseconds  output in milliseconds | 
|  | -p PID, --pid PID   trace this PID only | 
|  |  | 
|  | examples: | 
|  | ./xfsdist            # show operation latency as a histogram | 
|  | ./xfsdist -p 181     # trace PID 181 only | 
|  | ./xfsdist 1 10       # print 1 second summaries, 10 times | 
|  | ./xfsdist -m 5       # 5s summaries, milliseconds |