Brendan Gregg | c937a9e | 2016-02-12 02:23:39 -0800 | [diff] [blame] | 1 | Demonstrations of xfsslower, the Linux eBPF/bcc version. |
| 2 | |
| 3 | |
| 4 | xfsslower shows XFS reads, writes, opens, and fsyncs, slower than a threshold. |
| 5 | For example: |
| 6 | |
| 7 | # ./xfsslower |
| 8 | Tracing XFS operations slower than 10 ms |
| 9 | TIME COMM PID T BYTES OFF_KB LAT(ms) FILENAME |
| 10 | 06:23:06 randread.pl 32497 R 8192 24938024 17.93 data1 |
| 11 | 06:23:06 randread.pl 32521 R 8192 13431528 18.27 data1 |
| 12 | 06:23:08 randread.pl 32497 R 8192 5070904 16.37 data1 |
| 13 | 06:23:08 randread.pl 32521 R 8192 12693016 16.06 data1 |
| 14 | 06:23:18 randread.pl 32521 R 8192 27049136 21.68 data1 |
| 15 | 06:23:18 randread.pl 32497 R 8192 257864 21.74 data1 |
| 16 | 06:23:20 randread.pl 32497 R 8192 17797208 13.37 data1 |
| 17 | 06:23:20 randread.pl 32497 R 8192 6088224 19.74 data1 |
| 18 | |
| 19 | This shows several reads from a "randread.pl" program, each 8 Kbytes in size, |
| 20 | and from a "data1" file. These all had over 10 ms latency. |
| 21 | |
| 22 | This "latency" is measured from when the operation was issued from the VFS |
| 23 | interface to the file system, to when it completed. This spans everything: |
| 24 | block device I/O (disk I/O), file system CPU cycles, file system locks, run |
| 25 | queue latency, etc. This is a better measure of the latency suffered by |
| 26 | applications reading from the file system than measuring this down at the |
| 27 | block device interface. |
| 28 | |
| 29 | Note that this only traces the common file system operations previously |
| 30 | listed: other file system operations (eg, inode operations including |
| 31 | getattr()) are not traced. |
| 32 | |
| 33 | |
| 34 | The threshold can be provided as an argument. Eg, I/O slower than 1 ms: |
| 35 | |
| 36 | # ./xfsslower 1 |
| 37 | Tracing XFS operations slower than 1 ms |
| 38 | TIME COMM PID T BYTES OFF_KB LAT(ms) FILENAME |
| 39 | 06:26:59 randread.pl 5394 R 8192 9045728 1.24 data1 |
| 40 | 06:26:59 randread.pl 5394 R 8192 23532136 1.17 data1 |
| 41 | 06:26:59 randread.pl 5442 R 8192 2192376 2.06 data1 |
| 42 | 06:27:00 randread.pl 5394 R 8192 3535176 1.27 data1 |
| 43 | 06:27:00 randread.pl 5442 R 8192 21361784 3.18 data1 |
| 44 | 06:27:00 randread.pl 5394 R 8192 2556336 3.23 data1 |
| 45 | 06:27:00 randread.pl 5394 R 8192 20020880 2.87 data1 |
| 46 | 06:27:00 randread.pl 5442 R 8192 20708888 3.32 data1 |
| 47 | 06:27:00 randread.pl 5394 R 8192 4654680 2.00 data1 |
| 48 | 06:27:00 randread.pl 5442 R 8192 5591744 1.98 data1 |
| 49 | 06:27:00 randread.pl 5394 R 8192 2431056 1.22 data1 |
| 50 | 06:27:00 randread.pl 5394 R 8192 384288 2.95 data1 |
| 51 | 06:27:00 randread.pl 5442 R 8192 29277672 3.07 data1 |
| 52 | 06:27:00 randread.pl 5442 R 8192 29508216 3.23 data1 |
| 53 | 06:27:00 randread.pl 5394 R 8192 17200008 2.86 data1 |
| 54 | 06:27:00 randread.pl 5442 R 8192 20693088 1.06 data1 |
| 55 | 06:27:00 randread.pl 5394 R 8192 28124192 1.38 data1 |
| 56 | 06:27:00 randread.pl 5442 R 8192 23821184 1.28 data1 |
| 57 | 06:27:00 randread.pl 5394 R 8192 1623200 1.47 data1 |
| 58 | [...] |
| 59 | |
| 60 | There's now much more output (this spans only 2 seconds, the previous output |
| 61 | spanned 14 seconds), as the lower threshold is catching more I/O. |
| 62 | |
| 63 | |
| 64 | A threshold of 0 will trace all operations. Warning: the output will be |
| 65 | verbose, as it will include all file system cache hits. |
| 66 | |
| 67 | # ./xfsslower 0 |
| 68 | Tracing XFS operations |
| 69 | TIME COMM PID T BYTES OFF_KB LAT(ms) FILENAME |
| 70 | 06:29:43 ls 9291 O 0 0 0.00 bench |
| 71 | 06:29:47 cat 9361 O 0 0 0.00 date.txt |
| 72 | 06:29:47 cat 9361 R 29 0 0.01 date.txt |
| 73 | 06:29:47 cat 9361 R 0 0 0.00 date.txt |
| 74 | 06:29:50 bash 20500 O 0 0 0.00 bench |
| 75 | 06:29:50 bash 20500 O 0 0 0.00 bench |
| 76 | 06:29:50 bash 20500 O 0 0 0.00 bench |
| 77 | 06:29:50 bash 9431 O 0 0 0.00 bench |
| 78 | 06:29:50 bash 9432 O 0 0 0.00 bench |
| 79 | 06:29:50 bash 9456 O 0 0 0.00 newdate.txt |
| 80 | 06:29:50 date 9456 W 29 0 0.01 newdate.txt |
| 81 | 06:29:53 cksum 9503 O 0 0 0.00 data1 |
| 82 | 06:29:53 cksum 9503 R 65536 0 0.06 data1 |
| 83 | 06:29:53 cksum 9503 R 65536 64 0.01 data1 |
| 84 | 06:29:53 cksum 9503 R 65536 128 0.02 data1 |
| 85 | 06:29:53 cksum 9503 R 65536 192 0.01 data1 |
| 86 | 06:29:53 cksum 9503 R 65536 256 0.01 data1 |
| 87 | 06:29:53 cksum 9503 R 65536 320 0.01 data1 |
| 88 | 06:29:53 cksum 9503 R 65536 384 0.01 data1 |
| 89 | 06:29:53 cksum 9503 R 65536 448 0.04 data1 |
| 90 | 06:29:53 cksum 9503 R 65536 512 0.01 data1 |
| 91 | 06:29:53 cksum 9503 R 65536 576 0.02 data1 |
| 92 | 06:29:53 cksum 9503 R 65536 640 0.01 data1 |
| 93 | 06:29:53 cksum 9503 R 65536 704 0.01 data1 |
| 94 | 06:29:53 cksum 9503 R 65536 768 0.01 data1 |
| 95 | 06:29:53 cksum 9503 R 65536 832 0.01 data1 |
| 96 | 06:29:53 cksum 9503 R 65536 896 0.01 data1 |
| 97 | 06:29:53 cksum 9503 R 65536 960 0.01 data1 |
| 98 | 06:29:53 cksum 9503 R 65536 1024 0.01 data1 |
| 99 | 06:29:53 cksum 9503 R 65536 1088 0.02 data1 |
| 100 | 06:29:53 cksum 9503 R 65536 1152 0.01 data1 |
| 101 | 06:29:53 cksum 9503 R 65536 1216 0.01 data1 |
| 102 | [...] |
| 103 | |
| 104 | The output now includes open operations ("O"), and writes ("W"). A cksum(1) |
| 105 | command can be seen reading from a data1 file, from progressively increasing |
| 106 | offsets: a sequential workload. |
| 107 | |
| 108 | |
| 109 | A -j option will print just the fields (parsable output, csv): |
| 110 | |
| 111 | # ./xfsslower -j 1 |
| 112 | ENDTIME_us,TASK,PID,TYPE,BYTES,OFFSET_b,LATENCY_us,FILE |
| 113 | 125563830632,randread.pl,12155,R,8192,27824193536,1057,data1 |
| 114 | 125565050578,randread.pl,12155,R,8192,16908525568,1969,data1 |
| 115 | 125566331140,randread.pl,12202,R,8192,16310689792,1738,data1 |
| 116 | 125566427955,randread.pl,12155,R,8192,11127439360,1058,data1 |
| 117 | 125567223494,randread.pl,12202,R,8192,8422031360,1131,data1 |
| 118 | 125567331145,randread.pl,12155,R,8192,9233088512,1230,data1 |
| 119 | 125567331220,randread.pl,12202,R,8192,12716326912,1148,data1 |
| 120 | 125567334983,randread.pl,12155,R,8192,24545206272,2182,data1 |
| 121 | [...] |
| 122 | |
| 123 | This may be useful for visualizing with another tool, for example, for |
| 124 | producing a scatter plot of ENDTIME vs LATENCY, to look for time-based |
| 125 | patterns. |
| 126 | |
| 127 | |
| 128 | USAGE message: |
| 129 | |
| 130 | # ./xfsslower -h |
| 131 | usage: xfsslower [-h] [-j] [-p PID] [min_ms] |
| 132 | |
| 133 | Trace common XFS file operations slower than a threshold |
| 134 | |
| 135 | positional arguments: |
| 136 | min_ms minimum I/O duration to trace, in ms (default 10) |
| 137 | |
| 138 | optional arguments: |
| 139 | -h, --help show this help message and exit |
| 140 | -j, --csv just print fields: comma-separated values |
| 141 | -p PID, --pid PID trace this PID only |
| 142 | |
| 143 | examples: |
| 144 | ./xfsslower # trace operations slower than 10 ms (default) |
| 145 | ./xfsslower 1 # trace operations slower than 1 ms |
| 146 | ./xfsslower -j 1 # ... 1 ms, parsable output (csv) |
| 147 | ./xfsslower 0 # trace all operations (warning: verbose) |
| 148 | ./xfsslower -p 185 # trace PID 185 only |