%PDF- %PDF-
Direktori : /usr/share/doc/bpfcc-tools/examples/doc/ |
Current File : //usr/share/doc/bpfcc-tools/examples/doc/dcstat_example.txt |
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]]