proc: collect ksm/swap/cma/zswap only when feature enabled (#18076)
Ilya Mashchenko committed
Jul 7, 2024 at 16:53 UTC
54d05d31ab80f72506c14a84ca6848fe7d832ddd
4 files changed
+77
-11
src/collectors/proc.plugin/plugin_proc.c
+61
@@ -102,6 +102,9 @@ static void proc_main_cleanup(void *pptr)
102
}
103
104
bool inside_lxc_container = false;
105
+bool is_mem_swap_enabled = false;
106
+bool is_mem_zswap_enabled = false;
107
+bool is_mem_ksm_enabled = false;
108
109
static bool is_lxcfs_proc_mounted() {
110
procfile *ff = NULL;
@@ -136,6 +139,61 @@ static bool is_lxcfs_proc_mounted() {
139
return false;
140
}
141
142
+static bool is_ksm_enabled() {
143
+ unsigned long long ksm_run = 0;
144
+
145
+ char filename[FILENAME_MAX + 1];
146
+ snprintfz(filename, FILENAME_MAX, "%s/sys/kernel/mm/ksm/run", netdata_configured_host_prefix);
147
+
148
+ return !read_single_number_file(filename, &ksm_run) && ksm_run == 1;
149
+}
150
+
151
+static bool is_zswap_enabled() {
152
+ char filename[FILENAME_MAX + 1];
153
+ snprintfz(filename, FILENAME_MAX, "/sys/module/zswap/parameters/enabled"); // host prefix is not needed here
154
+ char state[1 + 1]; // Y or N
155
+
156
+ int ret = read_txt_file(filename, state, sizeof(state));
157
+
158
+ return !ret && !strcmp(state, "Y");
159
+}
160
+
161
+static bool is_swap_enabled() {
162
+ char filename[FILENAME_MAX + 1];
163
+ snprintfz(filename, FILENAME_MAX, "%s/proc/meminfo", netdata_configured_host_prefix);
164
+
165
+ procfile *ff = procfile_open(filename, " \t:", PROCFILE_FLAG_DEFAULT);
166
+ if (!ff) {
167
+ return false;
168
+ }
169
+
170
+ ff = procfile_readall(ff);
171
+ if (!ff) {
172
+ procfile_close(ff);
173
+ return false;
174
+ }
175
+
176
+ unsigned long long swap_total = 0;
177
+
178
+ size_t lines = procfile_lines(ff), l;
179
+
180
+ for (l = 0; l < lines; l++) {
181
+ size_t words = procfile_linewords(ff, l);
182
+ if (words < 2)
183
+ continue;
184
+
185
+ const char *key = procfile_lineword(ff, l, 0);
186
+ if (strcmp(key, "SwapTotal") == 0) {
187
+ swap_total = str2ull(procfile_lineword(ff, l, 1), NULL);
188
+ break;
189
+ }
190
+ }
191
+
192
+ procfile_close(ff);
193
+
194
+ return swap_total > 0;
195
+}
196
+
197
static bool log_proc_module(BUFFER *wb, void *data) {
198
struct proc_module *pm = data;
199
buffer_sprintf(wb, "proc.plugin[%s]", pm->name);
@@ -174,6 +232,9 @@ void *proc_main(void *ptr)
232
heartbeat_init(&hb);
233
234
inside_lxc_container = is_lxcfs_proc_mounted();
235
+ is_mem_swap_enabled = is_swap_enabled();
236
+ is_mem_zswap_enabled = is_zswap_enabled();
237
+ is_mem_ksm_enabled = is_ksm_enabled();
238
239
#define LGS_MODULE_ID 0
240
src/collectors/proc.plugin/plugin_proc.h
+4
@@ -53,6 +53,10 @@ int get_numa_node_count(void);
53
extern unsigned long long zfs_arcstats_shrinkable_cache_size_bytes;
54
extern bool inside_lxc_container;
55
56
+extern bool is_mem_swap_enabled;
57
+extern bool is_mem_zswap_enabled;
58
+extern bool is_mem_ksm_enabled;
59
+
60
// netdev renames
61
void cgroup_rename_task_add(
62
const char *host_device,
src/collectors/proc.plugin/proc_meminfo.c
+8
-8
@@ -101,18 +101,18 @@ int do_proc_meminfo(int update_every, usec_t dt) {
101
;
102
103
if(unlikely(!arl_base)) {
104
- do_ram = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "system ram", 1);
104
+ do_ram = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "system ram", CONFIG_BOOLEAN_YES);
105
do_swap = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "system swap", CONFIG_BOOLEAN_AUTO);
106
do_hwcorrupt = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "hardware corrupted ECC", CONFIG_BOOLEAN_AUTO);
107
- do_committed = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "committed memory", 1);
108
- do_writeback = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "writeback memory", 1);
109
- do_kernel = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "kernel memory", 1);
110
- do_slab = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "slab memory", 1);
107
+ do_committed = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "committed memory", CONFIG_BOOLEAN_YES);
108
+ do_writeback = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "writeback memory", CONFIG_BOOLEAN_YES);
109
+ do_kernel = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "kernel memory", CONFIG_BOOLEAN_YES);
110
+ do_slab = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "slab memory", CONFIG_BOOLEAN_YES);
111
do_hugepages = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "hugepages", CONFIG_BOOLEAN_AUTO);
112
do_transparent_hugepages = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "transparent hugepages", CONFIG_BOOLEAN_AUTO);
113
do_reclaiming = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "memory reclaiming", CONFIG_BOOLEAN_AUTO);
114
do_high_low = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "high low memory", CONFIG_BOOLEAN_AUTO);
115
- do_cma = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "cma memory", CONFIG_BOOLEAN_AUTO);
115
+ do_cma = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "cma memory", CONFIG_BOOLEAN_AUTO);
116
do_directmap = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "direct maps", CONFIG_BOOLEAN_AUTO);
117
118
// https://github.com/torvalds/linux/blob/master/fs/proc/meminfo.c
@@ -285,7 +285,7 @@ int do_proc_meminfo(int update_every, usec_t dt) {
285
rrdset_done(st_mem_swap_cached);
286
}
287
288
- if(arl_zswapped->flags & ARL_ENTRY_FLAG_FOUND) {
288
+ if (is_mem_zswap_enabled && (arl_zswapped->flags & ARL_ENTRY_FLAG_FOUND)) {
289
static RRDSET *st_mem_zswap = NULL;
290
static RRDDIM *rd_zswap = NULL, *rd_zswapped = NULL;
291
@@ -673,7 +673,7 @@ int do_proc_meminfo(int update_every, usec_t dt) {
673
rrdset_done(st_mem_high_low);
674
}
675
676
- if(do_cma == CONFIG_BOOLEAN_YES || (do_cma == CONFIG_BOOLEAN_AUTO && (arl_cma_total->flags & ARL_ENTRY_FLAG_FOUND) && CmaTotal)) {
676
+ if (CmaTotal && do_cma != CONFIG_BOOLEAN_NO) {
677
do_cma = CONFIG_BOOLEAN_YES;
678
679
static RRDSET *st_mem_cma = NULL;
src/collectors/proc.plugin/proc_vmstat.c
+4
-3
@@ -10,6 +10,7 @@
10
#define _COMMON_PLUGIN_MODULE_NAME PLUGIN_PROC_MODULE_VMSTAT_NAME
11
#include "../common-contexts/common-contexts.h"
12
13
+
14
int do_proc_vmstat(int update_every, usec_t dt) {
15
(void)dt;
16
@@ -262,7 +263,7 @@ int do_proc_vmstat(int update_every, usec_t dt) {
263
264
// --------------------------------------------------------------------
265
265
- if (do_swapio == CONFIG_BOOLEAN_YES || do_swapio == CONFIG_BOOLEAN_AUTO) {
266
+ if (is_mem_swap_enabled && (do_swapio == CONFIG_BOOLEAN_YES || do_swapio == CONFIG_BOOLEAN_AUTO)) {
267
do_swapio = CONFIG_BOOLEAN_YES;
268
269
static RRDSET *st_swapio = NULL;
@@ -465,7 +466,7 @@ int do_proc_vmstat(int update_every, usec_t dt) {
466
467
// --------------------------------------------------------------------
468
468
- if (do_zswapio == CONFIG_BOOLEAN_YES || do_zswapio == CONFIG_BOOLEAN_AUTO) {
469
+ if (is_mem_zswap_enabled && (do_zswapio == CONFIG_BOOLEAN_YES || do_zswapio == CONFIG_BOOLEAN_AUTO)) {
470
do_zswapio = CONFIG_BOOLEAN_YES;
471
472
static RRDSET *st_zswapio = NULL;
@@ -498,7 +499,7 @@ int do_proc_vmstat(int update_every, usec_t dt) {
499
500
// --------------------------------------------------------------------
501
501
- if (do_ksm == CONFIG_BOOLEAN_YES || do_ksm == CONFIG_BOOLEAN_AUTO) {
502
+ if (is_mem_ksm_enabled && (do_ksm == CONFIG_BOOLEAN_YES || do_ksm == CONFIG_BOOLEAN_AUTO)) {
503
do_ksm = CONFIG_BOOLEAN_YES;
504
505
static RRDSET *st_ksm_cow = NULL;