| Demonstrations of dcstat, the Linux eBPF/bcc version. | |
| dcstat shows directory entry cache (dcache) statistics. For example: | |
| # ./dcstat | |
| TIME REFS/s SLOW/s MISS/s HIT% | |
| 08:11:47: 2059 141 97 95.29 | |
| 08:11:48: 79974 151 106 99.87 | |
| 08:11:49: 192874 146 102 99.95 | |
| 08:11:50: 2051 144 100 95.12 | |
| 08:11:51: 73373 17239 17194 76.57 | |
| 08:11:52: 54685 25431 25387 53.58 | |
| 08:11:53: 18127 8182 8137 55.12 | |
| 08:11:54: 22517 10345 10301 54.25 | |
| 08:11:55: 7524 2881 2836 62.31 | |
| 08:11:56: 2067 141 97 95.31 | |
| 08:11:57: 2115 145 101 95.22 | |
| The output shows the total references per second ("REFS/s"), the number that | |
| took a slower code path to be processed ("SLOW/s"), the number of dcache misses | |
| ("MISS/s"), and the hit ratio as a percentage. By default, an interval of 1 | |
| second is used. | |
| At 08:11:49, there were 192 thousand references, which almost entirely hit | |
| from the dcache, with a hit ration of 99.95%. A little later, starting at | |
| 08:11:51, a workload began that walked many uncached files, reducing the hit | |
| ratio to 53%, and more importantly, a miss rate of over 10 thousand per second. | |
| Here's an interesting workload: | |
| # ./dcstat | |
| TIME REFS/s SLOW/s MISS/s HIT% | |
| 08:15:53: 250683 141 97 99.96 | |
| 08:15:54: 266115 145 101 99.96 | |
| 08:15:55: 268428 141 97 99.96 | |
| 08:15:56: 260389 143 99 99.96 | |
| It's a 99.96% hit ratio, and these are all negative hits: accessing a file that | |
| does not exist. Here's the C program that generated the workload: | |
| # cat -n badopen.c | |
| 1 #include <sys/types.h> | |
| 2 #include <sys/stat.h> | |
| 3 #include <fcntl.h> | |
| 4 | |
| 5 int | |
| 6 main(int argc, char *argv[]) | |
| 7 { | |
| 8 int fd; | |
| 9 while (1) { | |
| 10 fd = open("bad", O_RDONLY); | |
| 11 } | |
| 12 return 0; | |
| 13 } | |
| This is a simple workload generator than tries to open a missing file ("bad") | |
| as quickly as possible. | |
| Lets see what happens if the workload attempts to open a different filename | |
| each time (which is also a missing file), using the following C code: | |
| # cat -n badopen2.c | |
| 1 #include <sys/types.h> | |
| 2 #include <sys/stat.h> | |
| 3 #include <fcntl.h> | |
| 4 #include <stdio.h> | |
| 5 | |
| 6 int | |
| 7 main(int argc, char *argv[]) | |
| 8 { | |
| 9 int fd, i = 0; | |
| 10 char buf[128] = {}; | |
| 11 | |
| 12 while (1) { | |
| 13 sprintf(buf, "bad%d", i++); | |
| 14 fd = open(buf, O_RDONLY); | |
| 15 } | |
| 16 return 0; | |
| 17 } | |
| Here's dcstat: | |
| # ./dcstat | |
| TIME REFS/s SLOW/s MISS/s HIT% | |
| 08:18:52: 241131 237544 237505 1.51 | |
| 08:18:53: 238210 236323 236278 0.82 | |
| 08:18:54: 235259 233307 233261 0.85 | |
| 08:18:55: 233144 231256 231214 0.83 | |
| 08:18:56: 231981 230097 230053 0.83 | |
| dcstat also supports an optional interval and optional count. For example, | |
| printing 5 second summaries 3 times: | |
| # ./dcstat 5 3 | |
| TIME REFS/s SLOW/s MISS/s HIT% | |
| 08:20:03: 2085 143 99 95.23 | |
| 08:20:08: 2077 143 98 95.24 | |
| 08:20:14: 2071 144 100 95.15 | |
| USAGE message: | |
| # ./dcstat -h | |
| USAGE: ./dcstat [interval [count]] |