1*387f9dfdSAndroid Build Coastguard WorkerDemonstrations of dcstat, the Linux eBPF/bcc version. 2*387f9dfdSAndroid Build Coastguard Worker 3*387f9dfdSAndroid Build Coastguard Worker 4*387f9dfdSAndroid Build Coastguard Workerdcstat shows directory entry cache (dcache) statistics. For example: 5*387f9dfdSAndroid Build Coastguard Worker 6*387f9dfdSAndroid Build Coastguard Worker# ./dcstat 7*387f9dfdSAndroid Build Coastguard WorkerTIME REFS/s SLOW/s MISS/s HIT% 8*387f9dfdSAndroid Build Coastguard Worker08:11:47: 2059 141 97 95.29 9*387f9dfdSAndroid Build Coastguard Worker08:11:48: 79974 151 106 99.87 10*387f9dfdSAndroid Build Coastguard Worker08:11:49: 192874 146 102 99.95 11*387f9dfdSAndroid Build Coastguard Worker08:11:50: 2051 144 100 95.12 12*387f9dfdSAndroid Build Coastguard Worker08:11:51: 73373 17239 17194 76.57 13*387f9dfdSAndroid Build Coastguard Worker08:11:52: 54685 25431 25387 53.58 14*387f9dfdSAndroid Build Coastguard Worker08:11:53: 18127 8182 8137 55.12 15*387f9dfdSAndroid Build Coastguard Worker08:11:54: 22517 10345 10301 54.25 16*387f9dfdSAndroid Build Coastguard Worker08:11:55: 7524 2881 2836 62.31 17*387f9dfdSAndroid Build Coastguard Worker08:11:56: 2067 141 97 95.31 18*387f9dfdSAndroid Build Coastguard Worker08:11:57: 2115 145 101 95.22 19*387f9dfdSAndroid Build Coastguard Worker 20*387f9dfdSAndroid Build Coastguard WorkerThe output shows the total references per second ("REFS/s"), the number that 21*387f9dfdSAndroid Build Coastguard Workertook a slower code path to be processed ("SLOW/s"), the number of dcache misses 22*387f9dfdSAndroid Build Coastguard Worker("MISS/s"), and the hit ratio as a percentage. By default, an interval of 1 23*387f9dfdSAndroid Build Coastguard Workersecond is used. 24*387f9dfdSAndroid Build Coastguard Worker 25*387f9dfdSAndroid Build Coastguard WorkerAt 08:11:49, there were 192 thousand references, which almost entirely hit 26*387f9dfdSAndroid Build Coastguard Workerfrom the dcache, with a hit ration of 99.95%. A little later, starting at 27*387f9dfdSAndroid Build Coastguard Worker08:11:51, a workload began that walked many uncached files, reducing the hit 28*387f9dfdSAndroid Build Coastguard Workerratio to 53%, and more importantly, a miss rate of over 10 thousand per second. 29*387f9dfdSAndroid Build Coastguard Worker 30*387f9dfdSAndroid Build Coastguard Worker 31*387f9dfdSAndroid Build Coastguard WorkerHere's an interesting workload: 32*387f9dfdSAndroid Build Coastguard Worker 33*387f9dfdSAndroid Build Coastguard Worker# ./dcstat 34*387f9dfdSAndroid Build Coastguard WorkerTIME REFS/s SLOW/s MISS/s HIT% 35*387f9dfdSAndroid Build Coastguard Worker08:15:53: 250683 141 97 99.96 36*387f9dfdSAndroid Build Coastguard Worker08:15:54: 266115 145 101 99.96 37*387f9dfdSAndroid Build Coastguard Worker08:15:55: 268428 141 97 99.96 38*387f9dfdSAndroid Build Coastguard Worker08:15:56: 260389 143 99 99.96 39*387f9dfdSAndroid Build Coastguard Worker 40*387f9dfdSAndroid Build Coastguard WorkerIt's a 99.96% hit ratio, and these are all negative hits: accessing a file that 41*387f9dfdSAndroid Build Coastguard Workerdoes not exist. Here's the C program that generated the workload: 42*387f9dfdSAndroid Build Coastguard Worker 43*387f9dfdSAndroid Build Coastguard Worker# cat -n badopen.c 44*387f9dfdSAndroid Build Coastguard Worker 1 #include <sys/types.h> 45*387f9dfdSAndroid Build Coastguard Worker 2 #include <sys/stat.h> 46*387f9dfdSAndroid Build Coastguard Worker 3 #include <fcntl.h> 47*387f9dfdSAndroid Build Coastguard Worker 4 48*387f9dfdSAndroid Build Coastguard Worker 5 int 49*387f9dfdSAndroid Build Coastguard Worker 6 main(int argc, char *argv[]) 50*387f9dfdSAndroid Build Coastguard Worker 7 { 51*387f9dfdSAndroid Build Coastguard Worker 8 int fd; 52*387f9dfdSAndroid Build Coastguard Worker 9 while (1) { 53*387f9dfdSAndroid Build Coastguard Worker 10 fd = open("bad", O_RDONLY); 54*387f9dfdSAndroid Build Coastguard Worker 11 } 55*387f9dfdSAndroid Build Coastguard Worker 12 return 0; 56*387f9dfdSAndroid Build Coastguard Worker 13 } 57*387f9dfdSAndroid Build Coastguard Worker 58*387f9dfdSAndroid Build Coastguard WorkerThis is a simple workload generator than tries to open a missing file ("bad") 59*387f9dfdSAndroid Build Coastguard Workeras quickly as possible. 60*387f9dfdSAndroid Build Coastguard Worker 61*387f9dfdSAndroid Build Coastguard Worker 62*387f9dfdSAndroid Build Coastguard WorkerLets see what happens if the workload attempts to open a different filename 63*387f9dfdSAndroid Build Coastguard Workereach time (which is also a missing file), using the following C code: 64*387f9dfdSAndroid Build Coastguard Worker 65*387f9dfdSAndroid Build Coastguard Worker# cat -n badopen2.c 66*387f9dfdSAndroid Build Coastguard Worker 1 #include <sys/types.h> 67*387f9dfdSAndroid Build Coastguard Worker 2 #include <sys/stat.h> 68*387f9dfdSAndroid Build Coastguard Worker 3 #include <fcntl.h> 69*387f9dfdSAndroid Build Coastguard Worker 4 #include <stdio.h> 70*387f9dfdSAndroid Build Coastguard Worker 5 71*387f9dfdSAndroid Build Coastguard Worker 6 int 72*387f9dfdSAndroid Build Coastguard Worker 7 main(int argc, char *argv[]) 73*387f9dfdSAndroid Build Coastguard Worker 8 { 74*387f9dfdSAndroid Build Coastguard Worker 9 int fd, i = 0; 75*387f9dfdSAndroid Build Coastguard Worker 10 char buf[128] = {}; 76*387f9dfdSAndroid Build Coastguard Worker 11 77*387f9dfdSAndroid Build Coastguard Worker 12 while (1) { 78*387f9dfdSAndroid Build Coastguard Worker 13 sprintf(buf, "bad%d", i++); 79*387f9dfdSAndroid Build Coastguard Worker 14 fd = open(buf, O_RDONLY); 80*387f9dfdSAndroid Build Coastguard Worker 15 } 81*387f9dfdSAndroid Build Coastguard Worker 16 return 0; 82*387f9dfdSAndroid Build Coastguard Worker 17 } 83*387f9dfdSAndroid Build Coastguard Worker 84*387f9dfdSAndroid Build Coastguard WorkerHere's dcstat: 85*387f9dfdSAndroid Build Coastguard Worker 86*387f9dfdSAndroid Build Coastguard Worker# ./dcstat 87*387f9dfdSAndroid Build Coastguard WorkerTIME REFS/s SLOW/s MISS/s HIT% 88*387f9dfdSAndroid Build Coastguard Worker08:18:52: 241131 237544 237505 1.51 89*387f9dfdSAndroid Build Coastguard Worker08:18:53: 238210 236323 236278 0.82 90*387f9dfdSAndroid Build Coastguard Worker08:18:54: 235259 233307 233261 0.85 91*387f9dfdSAndroid Build Coastguard Worker08:18:55: 233144 231256 231214 0.83 92*387f9dfdSAndroid Build Coastguard Worker08:18:56: 231981 230097 230053 0.83 93*387f9dfdSAndroid Build Coastguard Worker 94*387f9dfdSAndroid Build Coastguard Worker 95*387f9dfdSAndroid Build Coastguard Workerdcstat also supports an optional interval and optional count. For example, 96*387f9dfdSAndroid Build Coastguard Workerprinting 5 second summaries 3 times: 97*387f9dfdSAndroid Build Coastguard Worker 98*387f9dfdSAndroid Build Coastguard Worker# ./dcstat 5 3 99*387f9dfdSAndroid Build Coastguard WorkerTIME REFS/s SLOW/s MISS/s HIT% 100*387f9dfdSAndroid Build Coastguard Worker08:20:03: 2085 143 99 95.23 101*387f9dfdSAndroid Build Coastguard Worker08:20:08: 2077 143 98 95.24 102*387f9dfdSAndroid Build Coastguard Worker08:20:14: 2071 144 100 95.15 103*387f9dfdSAndroid Build Coastguard Worker 104*387f9dfdSAndroid Build Coastguard Worker 105*387f9dfdSAndroid Build Coastguard WorkerUSAGE message: 106*387f9dfdSAndroid Build Coastguard Worker 107*387f9dfdSAndroid Build Coastguard Worker# ./dcstat -h 108*387f9dfdSAndroid Build Coastguard WorkerUSAGE: ./dcstat [interval [count]] 109