You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
3.3 KiB
109 lines
3.3 KiB
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]]
|