xref: /aosp_15_r20/external/bcc/tools/dcstat_example.txt (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
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