Add a metric for percpu memory (#10964)
Vladimir Kobal committed
Apr 14, 2021 at 12:20 UTC
9e5e1340aa9a91382704402b83b97bfde9332fe7
1 file changed
+17
-1
collectors/proc.plugin/proc_meminfo.c
+17
-1
@@ -10,6 +10,7 @@ int do_proc_meminfo(int update_every, usec_t dt) {
10
11
static procfile *ff = NULL;
12
static int do_ram = -1, do_swap = -1, do_hwcorrupt = -1, do_committed = -1, do_writeback = -1, do_kernel = -1, do_slab = -1, do_hugepages = -1, do_transparent_hugepages = -1;
13
+ static int do_percpu = 0;
14
15
static ARL_BASE *arl_base = NULL;
16
static ARL_ENTRY *arl_hwcorrupted = NULL, *arl_memavailable = NULL;
@@ -49,6 +50,7 @@ int do_proc_meminfo(int update_every, usec_t dt) {
50
//VmallocTotal = 0,
51
VmallocUsed = 0,
52
//VmallocChunk = 0,
53
+ Percpu = 0,
54
AnonHugePages = 0,
55
ShmemHugePages = 0,
56
HugePages_Total = 0,
@@ -106,6 +108,7 @@ int do_proc_meminfo(int update_every, usec_t dt) {
108
//arl_expect(arl_base, "VmallocTotal", &VmallocTotal);
109
arl_expect(arl_base, "VmallocUsed", &VmallocUsed);
110
//arl_expect(arl_base, "VmallocChunk", &VmallocChunk);
111
+ arl_expect(arl_base, "Percpu", &Percpu);
112
arl_hwcorrupted = arl_expect(arl_base, "HardwareCorrupted", &HardwareCorrupted);
113
arl_expect(arl_base, "AnonHugePages", &AnonHugePages);
114
arl_expect(arl_base, "ShmemHugePages", &ShmemHugePages);
@@ -134,15 +137,23 @@ int do_proc_meminfo(int update_every, usec_t dt) {
137
138
arl_begin(arl_base);
139
140
+ static int first_ff_read = 1;
141
+
142
for(l = 0; l < lines ;l++) {
143
size_t words = procfile_linewords(ff, l);
144
if(unlikely(words < 2)) continue;
145
146
+ if (first_ff_read && !strcmp(procfile_lineword(ff, l, 0), "Percpu"))
147
+ do_percpu = 1;
148
+
149
if(unlikely(arl_check(arl_base,
150
procfile_lineword(ff, l, 0),
151
procfile_lineword(ff, l, 1)))) break;
152
}
153
154
+ if (first_ff_read)
155
+ first_ff_read = 0;
156
+
157
// --------------------------------------------------------------------
158
159
// http://calimeroteknik.free.fr/blag/?article20/really-used-memory-on-gnu-linux
@@ -371,7 +382,8 @@ int do_proc_meminfo(int update_every, usec_t dt) {
382
383
if(do_kernel) {
384
static RRDSET *st_mem_kernel = NULL;
374
- static RRDDIM *rd_slab = NULL, *rd_kernelstack = NULL, *rd_pagetables = NULL, *rd_vmallocused = NULL;
385
+ static RRDDIM *rd_slab = NULL, *rd_kernelstack = NULL, *rd_pagetables = NULL, *rd_vmallocused = NULL,
386
+ *rd_percpu = NULL;
387
388
if(unlikely(!st_mem_kernel)) {
389
st_mem_kernel = rrdset_create_localhost(
@@ -395,6 +407,8 @@ int do_proc_meminfo(int update_every, usec_t dt) {
407
rd_kernelstack = rrddim_add(st_mem_kernel, "KernelStack", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
408
rd_pagetables = rrddim_add(st_mem_kernel, "PageTables", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
409
rd_vmallocused = rrddim_add(st_mem_kernel, "VmallocUsed", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
410
+ if (do_percpu)
411
+ rd_percpu = rrddim_add(st_mem_kernel, "Percpu", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
412
}
413
else rrdset_next(st_mem_kernel);
414
@@ -402,6 +416,8 @@ int do_proc_meminfo(int update_every, usec_t dt) {
416
rrddim_set_by_pointer(st_mem_kernel, rd_kernelstack, KernelStack);
417
rrddim_set_by_pointer(st_mem_kernel, rd_pagetables, PageTables);
418
rrddim_set_by_pointer(st_mem_kernel, rd_vmallocused, VmallocUsed);
419
+ if (do_percpu)
420
+ rrddim_set_by_pointer(st_mem_kernel, rd_percpu, Percpu);
421
422
rrdset_done(st_mem_kernel);
423
}