@cryptotaxi247 / netdata-1 / commits / 71d403647

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 }