Home | History | Annotate | Download | only in tools
      1 Demonstrations of btrfsdist, the Linux eBPF/bcc version.
      2 
      3 
      4 btrfsdist traces btrfs reads, writes, opens, and fsyncs, and summarizes their
      5 latency as a power-of-2 histogram. For example:
      6 
      7 # ./btrfsdist 
      8 Tracing btrfs operation latency... Hit Ctrl-C to end.
      9 ^C
     10 
     11 operation = 'read'
     12      usecs               : count     distribution
     13          0 -> 1          : 15       |                                        |
     14          2 -> 3          : 1308     |*******                                 |
     15          4 -> 7          : 198      |*                                       |
     16          8 -> 15         : 0        |                                        |
     17         16 -> 31         : 11       |                                        |
     18         32 -> 63         : 361      |*                                       |
     19         64 -> 127        : 55       |                                        |
     20        128 -> 255        : 104      |                                        |
     21        256 -> 511        : 7312     |****************************************|
     22        512 -> 1023       : 387      |**                                      |
     23       1024 -> 2047       : 10       |                                        |
     24       2048 -> 4095       : 4        |                                        |
     25 
     26 operation = 'write'
     27      usecs               : count     distribution
     28          0 -> 1          : 0        |                                        |
     29          2 -> 3          : 0        |                                        |
     30          4 -> 7          : 0        |                                        |
     31          8 -> 15         : 4        |****************************************|
     32 
     33 operation = 'open'
     34      usecs               : count     distribution
     35          0 -> 1          : 1        |**********                              |
     36          2 -> 3          : 4        |****************************************|
     37 
     38 This output shows a bi-modal distribution for read latency, with a faster
     39 mode of 1,308 reads that took between 2 and 3 microseconds, and a slower
     40 mode of over 7,312 reads that took between 256 and 511 microseconds. It's
     41 likely that the faster mode was a hit from the in-memory file system cache,
     42 and the slower mode is a read from a storage device (disk).
     43 
     44 This "latency" is measured from when the operation was issued from the VFS
     45 interface to the file system, to when it completed. This spans everything:
     46 block device I/O (disk I/O), file system CPU cycles, file system locks, run
     47 queue latency, etc. This is a better measure of the latency suffered by
     48 applications reading from the file system than measuring this down at the
     49 block device interface.
     50 
     51 Note that this only traces the common file system operations previously
     52 listed: other file system operations (eg, inode operations including
     53 getattr()) are not traced.
     54 
     55 
     56 An optional interval and a count can be provided, as well as -m to show the
     57 distributions in milliseconds. For example, two second summaries, five times:
     58 
     59 # ./btrfsdist 2 5
     60 Tracing btrfs operation latency... Hit Ctrl-C to end.
     61 
     62 03:40:49:
     63 
     64 operation = 'read'
     65      usecs               : count     distribution
     66          0 -> 1          : 15       |                                        |
     67          2 -> 3          : 833      |********                                |
     68          4 -> 7          : 127      |*                                       |
     69          8 -> 15         : 0        |                                        |
     70         16 -> 31         : 8        |                                        |
     71         32 -> 63         : 907      |********                                |
     72         64 -> 127        : 91       |                                        |
     73        128 -> 255        : 246      |**                                      |
     74        256 -> 511        : 4164     |****************************************|
     75        512 -> 1023       : 193      |*                                       |
     76       1024 -> 2047       : 4        |                                        |
     77       2048 -> 4095       : 6        |                                        |
     78       4096 -> 8191       : 2        |                                        |
     79 
     80 03:40:51:
     81 
     82 operation = 'read'
     83      usecs               : count     distribution
     84          0 -> 1          : 25       |                                        |
     85          2 -> 3          : 1491     |***************                         |
     86          4 -> 7          : 218      |**                                      |
     87          8 -> 15         : 0        |                                        |
     88         16 -> 31         : 16       |                                        |
     89         32 -> 63         : 1527     |***************                         |
     90         64 -> 127        : 319      |***                                     |
     91        128 -> 255        : 429      |****                                    |
     92        256 -> 511        : 3841     |****************************************|
     93        512 -> 1023       : 232      |**                                      |
     94       1024 -> 2047       : 3        |                                        |
     95       2048 -> 4095       : 6        |                                        |
     96       4096 -> 8191       : 1        |                                        |
     97       8192 -> 16383      : 1        |                                        |
     98 
     99 03:40:53:
    100 
    101 operation = 'read'
    102      usecs               : count     distribution
    103          0 -> 1          : 27       |                                        |
    104          2 -> 3          : 2999     |*********************************       |
    105          4 -> 7          : 407      |****                                    |
    106          8 -> 15         : 0        |                                        |
    107         16 -> 31         : 46       |                                        |
    108         32 -> 63         : 3538     |****************************************|
    109         64 -> 127        : 595      |******                                  |
    110        128 -> 255        : 621      |*******                                 |
    111        256 -> 511        : 3532     |*************************************** |
    112        512 -> 1023       : 212      |**                                      |
    113       1024 -> 2047       : 1        |                                        |
    114       2048 -> 4095       : 0        |                                        |
    115       4096 -> 8191       : 0        |                                        |
    116       8192 -> 16383      : 0        |                                        |
    117      16384 -> 32767      : 1        |                                        |
    118 
    119 03:40:55:
    120 
    121 operation = 'read'
    122      usecs               : count     distribution
    123          0 -> 1          : 221      |                                        |
    124          2 -> 3          : 12580    |****************************************|
    125          4 -> 7          : 1366     |****                                    |
    126          8 -> 15         : 0        |                                        |
    127         16 -> 31         : 289      |                                        |
    128         32 -> 63         : 10782    |**********************************      |
    129         64 -> 127        : 1232     |***                                     |
    130        128 -> 255        : 807      |**                                      |
    131        256 -> 511        : 2299     |*******                                 |
    132        512 -> 1023       : 135      |                                        |
    133       1024 -> 2047       : 5        |                                        |
    134       2048 -> 4095       : 2        |                                        |
    135 
    136 03:40:57:
    137 
    138 operation = 'read'
    139      usecs               : count     distribution
    140          0 -> 1          : 73951    |*************************               |
    141          2 -> 3          : 117639   |****************************************|
    142          4 -> 7          : 7943     |**                                      |
    143          8 -> 15         : 1841     |                                        |
    144         16 -> 31         : 1143     |                                        |
    145         32 -> 63         : 5006     |*                                       |
    146         64 -> 127        : 483      |                                        |
    147        128 -> 255        : 242      |                                        |
    148        256 -> 511        : 253      |                                        |
    149        512 -> 1023       : 84       |                                        |
    150       1024 -> 2047       : 23       |                                        |
    151 
    152 This shows a read workload that begins bimodal, and eventually the second
    153 mode disappears. The reason for this is that the workload cached during
    154 tracing. Note that the rate also increased, with over 200k reads for the
    155 final two second sample.
    156 
    157 
    158 USAGE message:
    159 
    160 # ./btrfsdist -h
    161 usage: btrfsdist [-h] [-T] [-m] [-p PID] [interval] [count]
    162 
    163 Summarize btrfs operation latency
    164 
    165 positional arguments:
    166   interval            output interval, in seconds
    167   count               number of outputs
    168 
    169 optional arguments:
    170   -h, --help          show this help message and exit
    171   -T, --notimestamp   don't include timestamp on interval output
    172   -m, --milliseconds  output in milliseconds
    173   -p PID, --pid PID   trace this PID only
    174 
    175 examples:
    176     ./btrfsdist            # show operation latency as a histogram
    177     ./btrfsdist -p 181     # trace PID 181 only
    178     ./btrfsdist 1 10       # print 1 second summaries, 10 times
    179     ./btrfsdist -m 5       # 5s summaries, milliseconds
    180