more speed optimizations
Costa Tsaousis (ktsaou) committed
Sep 10, 2017 at 03:08 UTC
71d403647d024b7e9db96c8c38ec11109e4a694e
2 files changed
+302
-157
src/proc_meminfo.c
+191
-97
@@ -132,54 +132,79 @@ int do_proc_meminfo(int update_every, usec_t dt) {
132
procfile_lineword(ff, l, 1)))) break;
133
}
134
135
- RRDSET *st;
136
-
135
// --------------------------------------------------------------------
136
137
// http://stackoverflow.com/questions/3019748/how-to-reliably-measure-available-memory-in-linux
138
unsigned long long MemUsed = MemTotal - MemFree - Cached - Buffers;
139
140
if(do_ram) {
143
- st = rrdset_find_localhost("system.ram");
144
- if(!st) {
145
- st = rrdset_create_localhost("system", "ram", NULL, "ram", NULL, "System RAM", "MB", 200, update_every
146
- , RRDSET_TYPE_STACKED);
147
-
148
- rrddim_add(st, "free", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
149
- rrddim_add(st, "used", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
150
- rrddim_add(st, "cached", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
151
- rrddim_add(st, "buffers", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
141
+ static RRDSET *st_system_ram = NULL;
142
+ static RRDDIM *rd_free = NULL, *rd_used = NULL, *rd_cached = NULL, *rd_buffers = NULL;
143
+
144
+ if(unlikely(!st_system_ram)) {
145
+ st_system_ram = rrdset_create_localhost(
146
+ "system"
147
+ , "ram"
148
+ , NULL
149
+ , "ram"
150
+ , NULL
151
+ , "System RAM"
152
+ , "MB"
153
+ , 200
154
+ , update_every
155
+ , RRDSET_TYPE_STACKED
156
+ );
157
+
158
+ rd_free = rrddim_add(st_system_ram, "free", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
159
+ rd_used = rrddim_add(st_system_ram, "used", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
160
+ rd_cached = rrddim_add(st_system_ram, "cached", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
161
+ rd_buffers = rrddim_add(st_system_ram, "buffers", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
162
}
153
- else rrdset_next(st);
163
+ else rrdset_next(st_system_ram);
164
+
165
+ rrddim_set_by_pointer(st_system_ram, rd_free, MemFree);
166
+ rrddim_set_by_pointer(st_system_ram, rd_used, MemUsed);
167
+ rrddim_set_by_pointer(st_system_ram, rd_cached, Cached);
168
+ rrddim_set_by_pointer(st_system_ram, rd_buffers, Buffers);
169
155
- rrddim_set(st, "free", MemFree);
156
- rrddim_set(st, "used", MemUsed);
157
- rrddim_set(st, "cached", Cached);
158
- rrddim_set(st, "buffers", Buffers);
159
- rrdset_done(st);
170
+ rrdset_done(st_system_ram);
171
}
172
173
// --------------------------------------------------------------------
174
175
unsigned long long SwapUsed = SwapTotal - SwapFree;
176
166
- if(SwapTotal || SwapUsed || SwapFree || do_swap == CONFIG_BOOLEAN_YES) {
177
+ if(do_swap == CONFIG_BOOLEAN_YES || SwapTotal || SwapUsed || SwapFree) {
178
do_swap = CONFIG_BOOLEAN_YES;
179
169
- st = rrdset_find_localhost("system.swap");
170
- if(!st) {
171
- st = rrdset_create_localhost("system", "swap", NULL, "swap", NULL, "System Swap", "MB", 201, update_every
172
- , RRDSET_TYPE_STACKED);
173
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
174
-
175
- rrddim_add(st, "free", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
176
- rrddim_add(st, "used", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
180
+ static RRDSET *st_system_swap = NULL;
181
+ static RRDDIM *rd_free = NULL, *rd_used = NULL;
182
+
183
+ if(unlikely(!st_system_swap)) {
184
+ st_system_swap = rrdset_create_localhost(
185
+ "system"
186
+ , "swap"
187
+ , NULL
188
+ , "swap"
189
+ , NULL
190
+ , "System Swap"
191
+ , "MB"
192
+ , 201
193
+ , update_every
194
+ , RRDSET_TYPE_STACKED
195
+ );
196
+
197
+ rrdset_flag_set(st_system_swap, RRDSET_FLAG_DETAIL);
198
+
199
+ rd_free = rrddim_add(st_system_swap, "free", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
200
+ rd_used = rrddim_add(st_system_swap, "used", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
201
}
178
- else rrdset_next(st);
202
+ else rrdset_next(st_system_swap);
203
180
- rrddim_set(st, "used", SwapUsed);
181
- rrddim_set(st, "free", SwapFree);
182
- rrdset_done(st);
204
+ rrddim_set_by_pointer(st_system_swap, rd_used, SwapUsed);
205
+ rrddim_set_by_pointer(st_system_swap, rd_free, SwapFree);
206
+
207
+ rrdset_done(st_system_swap);
208
}
209
210
// --------------------------------------------------------------------
@@ -187,102 +212,171 @@ int do_proc_meminfo(int update_every, usec_t dt) {
212
if(arl_hwcorrupted->flags & ARL_ENTRY_FLAG_FOUND && (do_hwcorrupt == CONFIG_BOOLEAN_YES || (do_hwcorrupt == CONFIG_BOOLEAN_AUTO && HardwareCorrupted > 0))) {
213
do_hwcorrupt = CONFIG_BOOLEAN_YES;
214
190
- st = rrdset_find_localhost("mem.hwcorrupt");
191
- if(!st) {
192
- st = rrdset_create_localhost("mem", "hwcorrupt", NULL, "ecc", NULL, "Hardware Corrupted ECC", "MB", 9000
193
- , update_every, RRDSET_TYPE_LINE);
194
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
195
-
196
- rrddim_add(st, "HardwareCorrupted", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
215
+ static RRDSET *st_mem_hwcorrupt = NULL;
216
+ static RRDDIM *rd_corrupted = NULL;
217
+
218
+ if(unlikely(!st_mem_hwcorrupt)) {
219
+ st_mem_hwcorrupt = rrdset_create_localhost(
220
+ "mem"
221
+ , "hwcorrupt"
222
+ , NULL
223
+ , "ecc"
224
+ , NULL
225
+ , "Corrupted Memory, detected by ECC"
226
+ , "MB"
227
+ , 9000
228
+ , update_every
229
+ , RRDSET_TYPE_LINE
230
+ );
231
+
232
+ rrdset_flag_set(st_mem_hwcorrupt, RRDSET_FLAG_DETAIL);
233
+
234
+ rd_corrupted = rrddim_add(st_mem_hwcorrupt, "HardwareCorrupted", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
235
}
198
- else rrdset_next(st);
236
+ else rrdset_next(st_mem_hwcorrupt);
237
+
238
+ rrddim_set_by_pointer(st_mem_hwcorrupt, rd_corrupted, HardwareCorrupted);
239
200
- rrddim_set(st, "HardwareCorrupted", HardwareCorrupted);
201
- rrdset_done(st);
240
+ rrdset_done(st_mem_hwcorrupt);
241
}
242
243
// --------------------------------------------------------------------
244
245
if(do_committed) {
207
- st = rrdset_find_localhost("mem.committed");
208
- if(!st) {
209
- st = rrdset_create_localhost("mem", "committed", NULL, "system", NULL, "Committed (Allocated) Memory", "MB"
210
- , 5000, update_every, RRDSET_TYPE_AREA);
211
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
212
-
213
- rrddim_add(st, "Committed_AS", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
246
+ static RRDSET *st_mem_committed = NULL;
247
+ static RRDDIM *rd_committed = NULL;
248
+
249
+ if(unlikely(!st_mem_committed)) {
250
+ st_mem_committed = rrdset_create_localhost(
251
+ "mem"
252
+ , "committed"
253
+ , NULL
254
+ , "system"
255
+ , NULL
256
+ , "Committed (Allocated) Memory"
257
+ , "MB"
258
+ , 5000
259
+ , update_every
260
+ , RRDSET_TYPE_AREA
261
+ );
262
+
263
+ rrdset_flag_set(st_mem_committed, RRDSET_FLAG_DETAIL);
264
+
265
+ rd_committed = rrddim_add(st_mem_committed, "Committed_AS", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
266
}
215
- else rrdset_next(st);
267
+ else rrdset_next(st_mem_committed);
268
+
269
+ rrddim_set_by_pointer(st_mem_committed, rd_committed, Committed_AS);
270
217
- rrddim_set(st, "Committed_AS", Committed_AS);
218
- rrdset_done(st);
271
+ rrdset_done(st_mem_committed);
272
}
273
274
// --------------------------------------------------------------------
275
276
if(do_writeback) {
224
- st = rrdset_find_localhost("mem.writeback");
225
- if(!st) {
226
- st = rrdset_create_localhost("mem", "writeback", NULL, "kernel", NULL, "Writeback Memory", "MB", 4000
227
- , update_every, RRDSET_TYPE_LINE);
228
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
229
-
230
- rrddim_add(st, "Dirty", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
231
- rrddim_add(st, "Writeback", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
232
- rrddim_add(st, "FuseWriteback", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
233
- rrddim_add(st, "NfsWriteback", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
234
- rrddim_add(st, "Bounce", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
277
+ static RRDSET *st_mem_writeback = NULL;
278
+ static RRDDIM *rd_dirty = NULL, *rd_writeback = NULL, *rd_fusewriteback = NULL, *rd_nfs_writeback = NULL, *rd_bounce = NULL;
279
+
280
+ if(unlikely(!st_mem_writeback)) {
281
+ st_mem_writeback = rrdset_create_localhost(
282
+ "mem"
283
+ , "writeback"
284
+ , NULL
285
+ , "kernel"
286
+ , NULL
287
+ , "Writeback Memory"
288
+ , "MB"
289
+ , 4000
290
+ , update_every
291
+ , RRDSET_TYPE_LINE
292
+ );
293
+ rrdset_flag_set(st_mem_writeback, RRDSET_FLAG_DETAIL);
294
+
295
+ rd_dirty = rrddim_add(st_mem_writeback, "Dirty", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
296
+ rd_writeback = rrddim_add(st_mem_writeback, "Writeback", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
297
+ rd_fusewriteback = rrddim_add(st_mem_writeback, "FuseWriteback", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
298
+ rd_nfs_writeback = rrddim_add(st_mem_writeback, "NfsWriteback", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
299
+ rd_bounce = rrddim_add(st_mem_writeback, "Bounce", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
300
}
236
- else rrdset_next(st);
237
-
238
- rrddim_set(st, "Dirty", Dirty);
239
- rrddim_set(st, "Writeback", Writeback);
240
- rrddim_set(st, "FuseWriteback", WritebackTmp);
241
- rrddim_set(st, "NfsWriteback", NFS_Unstable);
242
- rrddim_set(st, "Bounce", Bounce);
243
- rrdset_done(st);
301
+ else rrdset_next(st_mem_writeback);
302
+
303
+ rrddim_set_by_pointer(st_mem_writeback, rd_dirty, Dirty);
304
+ rrddim_set_by_pointer(st_mem_writeback, rd_writeback, Writeback);
305
+ rrddim_set_by_pointer(st_mem_writeback, rd_fusewriteback, WritebackTmp);
306
+ rrddim_set_by_pointer(st_mem_writeback, rd_nfs_writeback, NFS_Unstable);
307
+ rrddim_set_by_pointer(st_mem_writeback, rd_bounce, Bounce);
308
+
309
+ rrdset_done(st_mem_writeback);
310
}
311
312
// --------------------------------------------------------------------
313
314
if(do_kernel) {
249
- st = rrdset_find_localhost("mem.kernel");
250
- if(!st) {
251
- st = rrdset_create_localhost("mem", "kernel", NULL, "kernel", NULL, "Memory Used by Kernel", "MB", 6000
252
- , update_every, RRDSET_TYPE_STACKED);
253
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
254
-
255
- rrddim_add(st, "Slab", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
256
- rrddim_add(st, "KernelStack", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
257
- rrddim_add(st, "PageTables", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
258
- rrddim_add(st, "VmallocUsed", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
315
+ static RRDSET *st_mem_kernel = NULL;
316
+ static RRDDIM *rd_slab = NULL, *rd_kernelstack = NULL, *rd_pagetables = NULL, *rd_vmallocused = NULL;
317
+
318
+ if(unlikely(!st_mem_kernel)) {
319
+ st_mem_kernel = rrdset_create_localhost(
320
+ "mem"
321
+ , "kernel"
322
+ , NULL
323
+ , "kernel"
324
+ , NULL
325
+ , "Memory Used by Kernel"
326
+ , "MB"
327
+ , 6000
328
+ , update_every
329
+ , RRDSET_TYPE_STACKED
330
+ );
331
+
332
+ rrdset_flag_set(st_mem_kernel, RRDSET_FLAG_DETAIL);
333
+
334
+ rd_slab = rrddim_add(st_mem_kernel, "Slab", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
335
+ rd_kernelstack = rrddim_add(st_mem_kernel, "KernelStack", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
336
+ rd_pagetables = rrddim_add(st_mem_kernel, "PageTables", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
337
+ rd_vmallocused = rrddim_add(st_mem_kernel, "VmallocUsed", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
338
}
260
- else rrdset_next(st);
339
+ else rrdset_next(st_mem_kernel);
340
+
341
+ rrddim_set_by_pointer(st_mem_kernel, rd_slab, Slab);
342
+ rrddim_set_by_pointer(st_mem_kernel, rd_kernelstack, KernelStack);
343
+ rrddim_set_by_pointer(st_mem_kernel, rd_pagetables, PageTables);
344
+ rrddim_set_by_pointer(st_mem_kernel, rd_vmallocused, VmallocUsed);
345
262
- rrddim_set(st, "KernelStack", KernelStack);
263
- rrddim_set(st, "Slab", Slab);
264
- rrddim_set(st, "PageTables", PageTables);
265
- rrddim_set(st, "VmallocUsed", VmallocUsed);
266
- rrdset_done(st);
346
+ rrdset_done(st_mem_kernel);
347
}
348
349
// --------------------------------------------------------------------
350
351
if(do_slab) {
272
- st = rrdset_find_localhost("mem.slab");
273
- if(!st) {
274
- st = rrdset_create_localhost("mem", "slab", NULL, "slab", NULL, "Reclaimable Kernel Memory", "MB", 6500
275
- , update_every, RRDSET_TYPE_STACKED);
276
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
277
-
278
- rrddim_add(st, "reclaimable", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
279
- rrddim_add(st, "unreclaimable", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
352
+ static RRDSET *st_mem_slab = NULL;
353
+ static RRDDIM *rd_reclaimable = NULL, *rd_unreclaimable = NULL;
354
+
355
+ if(unlikely(!st_mem_slab)) {
356
+ st_mem_slab = rrdset_create_localhost(
357
+ "mem"
358
+ , "slab"
359
+ , NULL
360
+ , "slab"
361
+ , NULL
362
+ , "Reclaimable Kernel Memory"
363
+ , "MB"
364
+ , 6500
365
+ , update_every
366
+ , RRDSET_TYPE_STACKED
367
+ );
368
+
369
+ rrdset_flag_set(st_mem_slab, RRDSET_FLAG_DETAIL);
370
+
371
+ rd_reclaimable = rrddim_add(st_mem_slab, "reclaimable", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
372
+ rd_unreclaimable = rrddim_add(st_mem_slab, "unreclaimable", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
373
}
281
- else rrdset_next(st);
374
+ else rrdset_next(st_mem_slab);
375
+
376
+ rrddim_set_by_pointer(st_mem_slab, rd_reclaimable, SReclaimable);
377
+ rrddim_set_by_pointer(st_mem_slab, rd_unreclaimable, SUnreclaim);
378
283
- rrddim_set(st, "reclaimable", SReclaimable);
284
- rrddim_set(st, "unreclaimable", SUnreclaim);
285
- rrdset_done(st);
379
+ rrdset_done(st_mem_slab);
380
}
381
382
return 0;
src/sys_kernel_mm_ksm.c
+111
-60
@@ -5,18 +5,18 @@ typedef struct ksm_name_value {
5
unsigned long long value;
6
} KSM_NAME_VALUE;
7
8
-#define PAGES_SHARED 0
9
-#define PAGES_SHARING 1
8
+#define PAGES_SHARED 0
9
+#define PAGES_SHARING 1
10
#define PAGES_UNSHARED 2
11
#define PAGES_VOLATILE 3
12
-#define PAGES_TO_SCAN 4
12
+#define PAGES_TO_SCAN 4
13
14
KSM_NAME_VALUE values[] = {
15
- [PAGES_SHARED] = { "/sys/kernel/mm/ksm/pages_shared", 0ULL },
16
- [PAGES_SHARING] = { "/sys/kernel/mm/ksm/pages_sharing", 0ULL },
15
+ [PAGES_SHARED] = { "/sys/kernel/mm/ksm/pages_shared", 0ULL },
16
+ [PAGES_SHARING] = { "/sys/kernel/mm/ksm/pages_sharing", 0ULL },
17
[PAGES_UNSHARED] = { "/sys/kernel/mm/ksm/pages_unshared", 0ULL },
18
[PAGES_VOLATILE] = { "/sys/kernel/mm/ksm/pages_volatile", 0ULL },
19
- [PAGES_TO_SCAN] = { "/sys/kernel/mm/ksm/pages_to_scan", 0ULL },
19
+ [PAGES_TO_SCAN] = { "/sys/kernel/mm/ksm/pages_to_scan", 0ULL },
20
};
21
22
int do_sys_kernel_mm_ksm(int update_every, usec_t dt) {
@@ -24,61 +24,62 @@ int do_sys_kernel_mm_ksm(int update_every, usec_t dt) {
24
static procfile *ff_pages_shared = NULL, *ff_pages_sharing = NULL, *ff_pages_unshared = NULL, *ff_pages_volatile = NULL, *ff_pages_to_scan = NULL;
25
static long page_size = -1;
26
27
- if(page_size == -1)
27
+ if(unlikely(page_size == -1))
28
page_size = sysconf(_SC_PAGESIZE);
29
30
- if(!ff_pages_shared) {
30
+ if(unlikely(!ff_pages_shared)) {
31
snprintfz(values[PAGES_SHARED].filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, "/sys/kernel/mm/ksm/pages_shared");
32
snprintfz(values[PAGES_SHARED].filename, FILENAME_MAX, "%s", config_get("plugin:proc:/sys/kernel/mm/ksm", "/sys/kernel/mm/ksm/pages_shared", values[PAGES_SHARED].filename));
33
ff_pages_shared = procfile_open(values[PAGES_SHARED].filename, " \t:", PROCFILE_FLAG_DEFAULT);
34
}
35
36
- if(!ff_pages_sharing) {
36
+ if(unlikely(!ff_pages_sharing)) {
37
snprintfz(values[PAGES_SHARING].filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, "/sys/kernel/mm/ksm/pages_sharing");
38
snprintfz(values[PAGES_SHARING].filename, FILENAME_MAX, "%s", config_get("plugin:proc:/sys/kernel/mm/ksm", "/sys/kernel/mm/ksm/pages_sharing", values[PAGES_SHARING].filename));
39
ff_pages_sharing = procfile_open(values[PAGES_SHARING].filename, " \t:", PROCFILE_FLAG_DEFAULT);
40
}
41
42
- if(!ff_pages_unshared) {
42
+ if(unlikely(!ff_pages_unshared)) {
43
snprintfz(values[PAGES_UNSHARED].filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, "/sys/kernel/mm/ksm/pages_unshared");
44
snprintfz(values[PAGES_UNSHARED].filename, FILENAME_MAX, "%s", config_get("plugin:proc:/sys/kernel/mm/ksm", "/sys/kernel/mm/ksm/pages_unshared", values[PAGES_UNSHARED].filename));
45
ff_pages_unshared = procfile_open(values[PAGES_UNSHARED].filename, " \t:", PROCFILE_FLAG_DEFAULT);
46
}
47
48
- if(!ff_pages_volatile) {
48
+ if(unlikely(!ff_pages_volatile)) {
49
snprintfz(values[PAGES_VOLATILE].filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, "/sys/kernel/mm/ksm/pages_volatile");
50
snprintfz(values[PAGES_VOLATILE].filename, FILENAME_MAX, "%s", config_get("plugin:proc:/sys/kernel/mm/ksm", "/sys/kernel/mm/ksm/pages_volatile", values[PAGES_VOLATILE].filename));
51
ff_pages_volatile = procfile_open(values[PAGES_VOLATILE].filename, " \t:", PROCFILE_FLAG_DEFAULT);
52
}
53
54
- if(!ff_pages_to_scan) {
54
+ if(unlikely(!ff_pages_to_scan)) {
55
snprintfz(values[PAGES_TO_SCAN].filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, "/sys/kernel/mm/ksm/pages_to_scan");
56
snprintfz(values[PAGES_TO_SCAN].filename, FILENAME_MAX, "%s", config_get("plugin:proc:/sys/kernel/mm/ksm", "/sys/kernel/mm/ksm/pages_to_scan", values[PAGES_TO_SCAN].filename));
57
ff_pages_to_scan = procfile_open(values[PAGES_TO_SCAN].filename, " \t:", PROCFILE_FLAG_DEFAULT);
58
}
59
60
- if(!ff_pages_shared || !ff_pages_sharing || !ff_pages_unshared || !ff_pages_volatile || !ff_pages_to_scan) return 1;
60
+ if(unlikely(!ff_pages_shared || !ff_pages_sharing || !ff_pages_unshared || !ff_pages_volatile || !ff_pages_to_scan))
61
+ return 1;
62
63
unsigned long long pages_shared = 0, pages_sharing = 0, pages_unshared = 0, pages_volatile = 0, pages_to_scan = 0, offered = 0, saved = 0;
64
65
ff_pages_shared = procfile_readall(ff_pages_shared);
65
- if(!ff_pages_shared) return 0; // we return 0, so that we will retry to open it next time
66
+ if(unlikely(!ff_pages_shared)) return 0; // we return 0, so that we will retry to open it next time
67
pages_shared = str2ull(procfile_lineword(ff_pages_shared, 0, 0));
68
69
ff_pages_sharing = procfile_readall(ff_pages_sharing);
69
- if(!ff_pages_sharing) return 0; // we return 0, so that we will retry to open it next time
70
+ if(unlikely(!ff_pages_sharing)) return 0; // we return 0, so that we will retry to open it next time
71
pages_sharing = str2ull(procfile_lineword(ff_pages_sharing, 0, 0));
72
73
ff_pages_unshared = procfile_readall(ff_pages_unshared);
73
- if(!ff_pages_unshared) return 0; // we return 0, so that we will retry to open it next time
74
+ if(unlikely(!ff_pages_unshared)) return 0; // we return 0, so that we will retry to open it next time
75
pages_unshared = str2ull(procfile_lineword(ff_pages_unshared, 0, 0));
76
77
ff_pages_volatile = procfile_readall(ff_pages_volatile);
77
- if(!ff_pages_volatile) return 0; // we return 0, so that we will retry to open it next time
78
+ if(unlikely(!ff_pages_volatile)) return 0; // we return 0, so that we will retry to open it next time
79
pages_volatile = str2ull(procfile_lineword(ff_pages_volatile, 0, 0));
80
81
ff_pages_to_scan = procfile_readall(ff_pages_to_scan);
81
- if(!ff_pages_to_scan) return 0; // we return 0, so that we will retry to open it next time
82
+ if(unlikely(!ff_pages_to_scan)) return 0; // we return 0, so that we will retry to open it next time
83
pages_to_scan = str2ull(procfile_lineword(ff_pages_to_scan, 0, 0));
84
85
offered = pages_sharing + pages_shared + pages_unshared + pages_volatile;
@@ -86,55 +87,105 @@ int do_sys_kernel_mm_ksm(int update_every, usec_t dt) {
87
88
if(!offered || !pages_to_scan) return 0;
89
89
- RRDSET *st;
90
-
90
// --------------------------------------------------------------------
91
93
- st = rrdset_find_localhost("mem.ksm");
94
- if(!st) {
95
- st = rrdset_create_localhost("mem", "ksm", NULL, "ksm", NULL, "Kernel Same Page Merging", "MB", 5000
96
- , update_every, RRDSET_TYPE_AREA);
97
-
98
- rrddim_add(st, "shared", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
99
- rrddim_add(st, "unshared", NULL, -1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
100
- rrddim_add(st, "sharing", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
101
- rrddim_add(st, "volatile", NULL, -1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
102
- rrddim_add(st, "to_scan", "to scan", -1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
92
+ {
93
+ static RRDSET *st_mem_ksm = NULL;
94
+ static RRDDIM *rd_shared = NULL, *rd_unshared = NULL, *rd_sharing = NULL, *rd_volatile = NULL, *rd_to_scan = NULL;
95
+
96
+ if (unlikely(!st_mem_ksm)) {
97
+ st_mem_ksm = rrdset_create_localhost(
98
+ "mem"
99
+ , "ksm"
100
+ , NULL
101
+ , "ksm"
102
+ , NULL
103
+ , "Kernel Same Page Merging"
104
+ , "MB"
105
+ , 5000
106
+ , update_every
107
+ , RRDSET_TYPE_AREA
108
+ );
109
+
110
+ rd_shared = rrddim_add(st_mem_ksm, "shared", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
111
+ rd_unshared = rrddim_add(st_mem_ksm, "unshared", NULL, -1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
112
+ rd_sharing = rrddim_add(st_mem_ksm, "sharing", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
113
+ rd_volatile = rrddim_add(st_mem_ksm, "volatile", NULL, -1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
114
+ rd_to_scan = rrddim_add(st_mem_ksm, "to_scan", "to scan", -1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
115
+ }
116
+ else
117
+ rrdset_next(st_mem_ksm);
118
+
119
+ rrddim_set_by_pointer(st_mem_ksm, rd_shared, pages_shared * page_size);
120
+ rrddim_set_by_pointer(st_mem_ksm, rd_unshared, pages_unshared * page_size);
121
+ rrddim_set_by_pointer(st_mem_ksm, rd_sharing, pages_sharing * page_size);
122
+ rrddim_set_by_pointer(st_mem_ksm, rd_volatile, pages_volatile * page_size);
123
+ rrddim_set_by_pointer(st_mem_ksm, rd_to_scan, pages_to_scan * page_size);
124
+
125
+ rrdset_done(st_mem_ksm);
126
}
104
- else rrdset_next(st);
105
-
106
- rrddim_set(st, "shared", pages_shared * page_size);
107
- rrddim_set(st, "unshared", pages_unshared * page_size);
108
- rrddim_set(st, "sharing", pages_sharing * page_size);
109
- rrddim_set(st, "volatile", pages_volatile * page_size);
110
- rrddim_set(st, "to_scan", pages_to_scan * page_size);
111
- rrdset_done(st);
112
-
113
- st = rrdset_find_localhost("mem.ksm_savings");
114
- if(!st) {
115
- st = rrdset_create_localhost("mem", "ksm_savings", NULL, "ksm", NULL, "Kernel Same Page Merging Savings", "MB"
116
- , 5001, update_every, RRDSET_TYPE_AREA);
117
-
118
- rrddim_add(st, "savings", NULL, -1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
119
- rrddim_add(st, "offered", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
120
- }
121
- else rrdset_next(st);
122
-
123
- rrddim_set(st, "savings", saved * page_size);
124
- rrddim_set(st, "offered", offered * page_size);
125
- rrdset_done(st);
127
127
- st = rrdset_find_localhost("mem.ksm_ratios");
128
- if(!st) {
129
- st = rrdset_create_localhost("mem", "ksm_ratios", NULL, "ksm", NULL, "Kernel Same Page Merging Effectiveness"
130
- , "percentage", 5002, update_every, RRDSET_TYPE_LINE);
128
+ // --------------------------------------------------------------------
129
132
- rrddim_add(st, "savings", NULL, 1, 10000, RRD_ALGORITHM_ABSOLUTE);
130
+ {
131
+ static RRDSET *st_mem_ksm_savings = NULL;
132
+ static RRDDIM *rd_savings = NULL, *rd_offered = NULL;
133
+
134
+ if (unlikely(!st_mem_ksm_savings)) {
135
+ st_mem_ksm_savings = rrdset_create_localhost(
136
+ "mem"
137
+ , "ksm_savings"
138
+ , NULL
139
+ , "ksm"
140
+ , NULL
141
+ , "Kernel Same Page Merging Savings"
142
+ , "MB"
143
+ , 5001
144
+ , update_every
145
+ , RRDSET_TYPE_AREA
146
+ );
147
+
148
+ rd_savings = rrddim_add(st_mem_ksm_savings, "savings", NULL, -1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
149
+ rd_offered = rrddim_add(st_mem_ksm_savings, "offered", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
150
+ }
151
+ else
152
+ rrdset_next(st_mem_ksm_savings);
153
+
154
+ rrddim_set_by_pointer(st_mem_ksm_savings, rd_savings, saved * page_size);
155
+ rrddim_set_by_pointer(st_mem_ksm_savings, rd_offered, offered * page_size);
156
+
157
+ rrdset_done(st_mem_ksm_savings);
158
}
134
- else rrdset_next(st);
159
136
- rrddim_set(st, "savings", (saved * 1000000) / offered);
137
- rrdset_done(st);
160
+ // --------------------------------------------------------------------
161
+
162
+ {
163
+ static RRDSET *st_mem_ksm_ratios = NULL;
164
+ static RRDDIM *rd_savings = NULL;
165
+
166
+ if (unlikely(!st_mem_ksm_ratios)) {
167
+ st_mem_ksm_ratios = rrdset_create_localhost(
168
+ "mem"
169
+ , "ksm_ratios"
170
+ , NULL
171
+ , "ksm"
172
+ , NULL
173
+ , "Kernel Same Page Merging Effectiveness"
174
+ , "percentage"
175
+ , 5002
176
+ , update_every
177
+ , RRDSET_TYPE_LINE
178
+ );
179
+
180
+ rd_savings = rrddim_add(st_mem_ksm_ratios, "savings", NULL, 1, 10000, RRD_ALGORITHM_ABSOLUTE);
181
+ }
182
+ else
183
+ rrdset_next(st_mem_ksm_ratios);
184
+
185
+ rrddim_set_by_pointer(st_mem_ksm_ratios, rd_savings, (saved * 1000000) / offered);
186
+
187
+ rrdset_done(st_mem_ksm_ratios);
188
+ }
189
190
return 0;
191
}