proc_meminfo.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "plugin_proc.h"
  3. #define PLUGIN_PROC_MODULE_MEMINFO_NAME "/proc/meminfo"
  4. #define CONFIG_SECTION_PLUGIN_PROC_MEMINFO "plugin:" PLUGIN_PROC_CONFIG_NAME ":" PLUGIN_PROC_MODULE_MEMINFO_NAME
  5. int do_proc_meminfo(int update_every, usec_t dt) {
  6. (void)dt;
  7. static procfile *ff = NULL;
  8. 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;
  9. static int do_percpu = 0;
  10. static ARL_BASE *arl_base = NULL;
  11. static ARL_ENTRY *arl_hwcorrupted = NULL, *arl_memavailable = NULL;
  12. static unsigned long long
  13. MemTotal = 0,
  14. MemFree = 0,
  15. MemAvailable = 0,
  16. Buffers = 0,
  17. Cached = 0,
  18. //SwapCached = 0,
  19. //Active = 0,
  20. //Inactive = 0,
  21. //ActiveAnon = 0,
  22. //InactiveAnon = 0,
  23. //ActiveFile = 0,
  24. //InactiveFile = 0,
  25. //Unevictable = 0,
  26. //Mlocked = 0,
  27. SwapTotal = 0,
  28. SwapFree = 0,
  29. Dirty = 0,
  30. Writeback = 0,
  31. //AnonPages = 0,
  32. //Mapped = 0,
  33. Shmem = 0,
  34. Slab = 0,
  35. SReclaimable = 0,
  36. SUnreclaim = 0,
  37. KernelStack = 0,
  38. PageTables = 0,
  39. NFS_Unstable = 0,
  40. Bounce = 0,
  41. WritebackTmp = 0,
  42. //CommitLimit = 0,
  43. Committed_AS = 0,
  44. //VmallocTotal = 0,
  45. VmallocUsed = 0,
  46. //VmallocChunk = 0,
  47. Percpu = 0,
  48. AnonHugePages = 0,
  49. ShmemHugePages = 0,
  50. HugePages_Total = 0,
  51. HugePages_Free = 0,
  52. HugePages_Rsvd = 0,
  53. HugePages_Surp = 0,
  54. Hugepagesize = 0,
  55. //DirectMap4k = 0,
  56. //DirectMap2M = 0,
  57. HardwareCorrupted = 0;
  58. if(unlikely(!arl_base)) {
  59. do_ram = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "system ram", 1);
  60. do_swap = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "system swap", CONFIG_BOOLEAN_AUTO);
  61. do_hwcorrupt = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "hardware corrupted ECC", CONFIG_BOOLEAN_AUTO);
  62. do_committed = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "committed memory", 1);
  63. do_writeback = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "writeback memory", 1);
  64. do_kernel = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "kernel memory", 1);
  65. do_slab = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "slab memory", 1);
  66. do_hugepages = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "hugepages", CONFIG_BOOLEAN_AUTO);
  67. do_transparent_hugepages = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "transparent hugepages", CONFIG_BOOLEAN_AUTO);
  68. arl_base = arl_create("meminfo", NULL, 60);
  69. arl_expect(arl_base, "MemTotal", &MemTotal);
  70. arl_expect(arl_base, "MemFree", &MemFree);
  71. arl_memavailable = arl_expect(arl_base, "MemAvailable", &MemAvailable);
  72. arl_expect(arl_base, "Buffers", &Buffers);
  73. arl_expect(arl_base, "Cached", &Cached);
  74. //arl_expect(arl_base, "SwapCached", &SwapCached);
  75. //arl_expect(arl_base, "Active", &Active);
  76. //arl_expect(arl_base, "Inactive", &Inactive);
  77. //arl_expect(arl_base, "ActiveAnon", &ActiveAnon);
  78. //arl_expect(arl_base, "InactiveAnon", &InactiveAnon);
  79. //arl_expect(arl_base, "ActiveFile", &ActiveFile);
  80. //arl_expect(arl_base, "InactiveFile", &InactiveFile);
  81. //arl_expect(arl_base, "Unevictable", &Unevictable);
  82. //arl_expect(arl_base, "Mlocked", &Mlocked);
  83. arl_expect(arl_base, "SwapTotal", &SwapTotal);
  84. arl_expect(arl_base, "SwapFree", &SwapFree);
  85. arl_expect(arl_base, "Dirty", &Dirty);
  86. arl_expect(arl_base, "Writeback", &Writeback);
  87. //arl_expect(arl_base, "AnonPages", &AnonPages);
  88. //arl_expect(arl_base, "Mapped", &Mapped);
  89. arl_expect(arl_base, "Shmem", &Shmem);
  90. arl_expect(arl_base, "Slab", &Slab);
  91. arl_expect(arl_base, "SReclaimable", &SReclaimable);
  92. arl_expect(arl_base, "SUnreclaim", &SUnreclaim);
  93. arl_expect(arl_base, "KernelStack", &KernelStack);
  94. arl_expect(arl_base, "PageTables", &PageTables);
  95. arl_expect(arl_base, "NFS_Unstable", &NFS_Unstable);
  96. arl_expect(arl_base, "Bounce", &Bounce);
  97. arl_expect(arl_base, "WritebackTmp", &WritebackTmp);
  98. //arl_expect(arl_base, "CommitLimit", &CommitLimit);
  99. arl_expect(arl_base, "Committed_AS", &Committed_AS);
  100. //arl_expect(arl_base, "VmallocTotal", &VmallocTotal);
  101. arl_expect(arl_base, "VmallocUsed", &VmallocUsed);
  102. //arl_expect(arl_base, "VmallocChunk", &VmallocChunk);
  103. arl_expect(arl_base, "Percpu", &Percpu);
  104. arl_hwcorrupted = arl_expect(arl_base, "HardwareCorrupted", &HardwareCorrupted);
  105. arl_expect(arl_base, "AnonHugePages", &AnonHugePages);
  106. arl_expect(arl_base, "ShmemHugePages", &ShmemHugePages);
  107. arl_expect(arl_base, "HugePages_Total", &HugePages_Total);
  108. arl_expect(arl_base, "HugePages_Free", &HugePages_Free);
  109. arl_expect(arl_base, "HugePages_Rsvd", &HugePages_Rsvd);
  110. arl_expect(arl_base, "HugePages_Surp", &HugePages_Surp);
  111. arl_expect(arl_base, "Hugepagesize", &Hugepagesize);
  112. //arl_expect(arl_base, "DirectMap4k", &DirectMap4k);
  113. //arl_expect(arl_base, "DirectMap2M", &DirectMap2M);
  114. }
  115. if(unlikely(!ff)) {
  116. char filename[FILENAME_MAX + 1];
  117. snprintfz(filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, "/proc/meminfo");
  118. ff = procfile_open(config_get(CONFIG_SECTION_PLUGIN_PROC_MEMINFO, "filename to monitor", filename), " \t:", PROCFILE_FLAG_DEFAULT);
  119. if(unlikely(!ff))
  120. return 1;
  121. }
  122. ff = procfile_readall(ff);
  123. if(unlikely(!ff))
  124. return 0; // we return 0, so that we will retry to open it next time
  125. size_t lines = procfile_lines(ff), l;
  126. arl_begin(arl_base);
  127. static int first_ff_read = 1;
  128. for(l = 0; l < lines ;l++) {
  129. size_t words = procfile_linewords(ff, l);
  130. if(unlikely(words < 2)) continue;
  131. if (first_ff_read && !strcmp(procfile_lineword(ff, l, 0), "Percpu"))
  132. do_percpu = 1;
  133. if(unlikely(arl_check(arl_base,
  134. procfile_lineword(ff, l, 0),
  135. procfile_lineword(ff, l, 1)))) break;
  136. }
  137. if (first_ff_read)
  138. first_ff_read = 0;
  139. // http://calimeroteknik.free.fr/blag/?article20/really-used-memory-on-gnu-linux
  140. unsigned long long MemCached = Cached + SReclaimable - Shmem;
  141. unsigned long long MemUsed = MemTotal - MemFree - MemCached - Buffers;
  142. // The Linux kernel doesn't report ZFS ARC usage as cache memory (the ARC is included in the total used system memory)
  143. if (!inside_lxc_container) {
  144. MemCached += (zfs_arcstats_shrinkable_cache_size_bytes / 1024);
  145. MemUsed -= (zfs_arcstats_shrinkable_cache_size_bytes / 1024);
  146. MemAvailable += (zfs_arcstats_shrinkable_cache_size_bytes / 1024);
  147. }
  148. if(do_ram) {
  149. {
  150. static RRDSET *st_system_ram = NULL;
  151. static RRDDIM *rd_free = NULL, *rd_used = NULL, *rd_cached = NULL, *rd_buffers = NULL;
  152. if(unlikely(!st_system_ram)) {
  153. st_system_ram = rrdset_create_localhost(
  154. "system"
  155. , "ram"
  156. , NULL
  157. , "ram"
  158. , NULL
  159. , "System RAM"
  160. , "MiB"
  161. , PLUGIN_PROC_NAME
  162. , PLUGIN_PROC_MODULE_MEMINFO_NAME
  163. , NETDATA_CHART_PRIO_SYSTEM_RAM
  164. , update_every
  165. , RRDSET_TYPE_STACKED
  166. );
  167. rd_free = rrddim_add(st_system_ram, "free", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  168. rd_used = rrddim_add(st_system_ram, "used", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  169. rd_cached = rrddim_add(st_system_ram, "cached", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  170. rd_buffers = rrddim_add(st_system_ram, "buffers", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  171. }
  172. rrddim_set_by_pointer(st_system_ram, rd_free, MemFree);
  173. rrddim_set_by_pointer(st_system_ram, rd_used, MemUsed);
  174. rrddim_set_by_pointer(st_system_ram, rd_cached, MemCached);
  175. rrddim_set_by_pointer(st_system_ram, rd_buffers, Buffers);
  176. rrdset_done(st_system_ram);
  177. }
  178. if(arl_memavailable->flags & ARL_ENTRY_FLAG_FOUND) {
  179. static RRDSET *st_mem_available = NULL;
  180. static RRDDIM *rd_avail = NULL;
  181. if(unlikely(!st_mem_available)) {
  182. st_mem_available = rrdset_create_localhost(
  183. "mem"
  184. , "available"
  185. , NULL
  186. , "system"
  187. , NULL
  188. , "Available RAM for applications"
  189. , "MiB"
  190. , PLUGIN_PROC_NAME
  191. , PLUGIN_PROC_MODULE_MEMINFO_NAME
  192. , NETDATA_CHART_PRIO_MEM_SYSTEM_AVAILABLE
  193. , update_every
  194. , RRDSET_TYPE_AREA
  195. );
  196. rd_avail = rrddim_add(st_mem_available, "MemAvailable", "avail", 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  197. }
  198. rrddim_set_by_pointer(st_mem_available, rd_avail, MemAvailable);
  199. rrdset_done(st_mem_available);
  200. }
  201. }
  202. unsigned long long SwapUsed = SwapTotal - SwapFree;
  203. if(do_swap == CONFIG_BOOLEAN_YES || (do_swap == CONFIG_BOOLEAN_AUTO &&
  204. (SwapTotal || SwapUsed || SwapFree ||
  205. netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES))) {
  206. do_swap = CONFIG_BOOLEAN_YES;
  207. static RRDSET *st_system_swap = NULL;
  208. static RRDDIM *rd_free = NULL, *rd_used = NULL;
  209. if(unlikely(!st_system_swap)) {
  210. st_system_swap = rrdset_create_localhost(
  211. "system"
  212. , "swap"
  213. , NULL
  214. , "swap"
  215. , NULL
  216. , "System Swap"
  217. , "MiB"
  218. , PLUGIN_PROC_NAME
  219. , PLUGIN_PROC_MODULE_MEMINFO_NAME
  220. , NETDATA_CHART_PRIO_SYSTEM_SWAP
  221. , update_every
  222. , RRDSET_TYPE_STACKED
  223. );
  224. rrdset_flag_set(st_system_swap, RRDSET_FLAG_DETAIL);
  225. rd_free = rrddim_add(st_system_swap, "free", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  226. rd_used = rrddim_add(st_system_swap, "used", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  227. }
  228. rrddim_set_by_pointer(st_system_swap, rd_used, SwapUsed);
  229. rrddim_set_by_pointer(st_system_swap, rd_free, SwapFree);
  230. rrdset_done(st_system_swap);
  231. }
  232. if(arl_hwcorrupted->flags & ARL_ENTRY_FLAG_FOUND &&
  233. (do_hwcorrupt == CONFIG_BOOLEAN_YES || (do_hwcorrupt == CONFIG_BOOLEAN_AUTO &&
  234. (HardwareCorrupted > 0 ||
  235. netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES)))) {
  236. do_hwcorrupt = CONFIG_BOOLEAN_YES;
  237. static RRDSET *st_mem_hwcorrupt = NULL;
  238. static RRDDIM *rd_corrupted = NULL;
  239. if(unlikely(!st_mem_hwcorrupt)) {
  240. st_mem_hwcorrupt = rrdset_create_localhost(
  241. "mem"
  242. , "hwcorrupt"
  243. , NULL
  244. , "ecc"
  245. , NULL
  246. , "Corrupted Memory, detected by ECC"
  247. , "MiB"
  248. , PLUGIN_PROC_NAME
  249. , PLUGIN_PROC_MODULE_MEMINFO_NAME
  250. , NETDATA_CHART_PRIO_MEM_HW
  251. , update_every
  252. , RRDSET_TYPE_LINE
  253. );
  254. rrdset_flag_set(st_mem_hwcorrupt, RRDSET_FLAG_DETAIL);
  255. rd_corrupted = rrddim_add(st_mem_hwcorrupt, "HardwareCorrupted", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  256. }
  257. rrddim_set_by_pointer(st_mem_hwcorrupt, rd_corrupted, HardwareCorrupted);
  258. rrdset_done(st_mem_hwcorrupt);
  259. }
  260. if(do_committed) {
  261. static RRDSET *st_mem_committed = NULL;
  262. static RRDDIM *rd_committed = NULL;
  263. if(unlikely(!st_mem_committed)) {
  264. st_mem_committed = rrdset_create_localhost(
  265. "mem"
  266. , "committed"
  267. , NULL
  268. , "system"
  269. , NULL
  270. , "Committed (Allocated) Memory"
  271. , "MiB"
  272. , PLUGIN_PROC_NAME
  273. , PLUGIN_PROC_MODULE_MEMINFO_NAME
  274. , NETDATA_CHART_PRIO_MEM_SYSTEM_COMMITTED
  275. , update_every
  276. , RRDSET_TYPE_AREA
  277. );
  278. rrdset_flag_set(st_mem_committed, RRDSET_FLAG_DETAIL);
  279. rd_committed = rrddim_add(st_mem_committed, "Committed_AS", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  280. }
  281. rrddim_set_by_pointer(st_mem_committed, rd_committed, Committed_AS);
  282. rrdset_done(st_mem_committed);
  283. }
  284. if(do_writeback) {
  285. static RRDSET *st_mem_writeback = NULL;
  286. static RRDDIM *rd_dirty = NULL, *rd_writeback = NULL, *rd_fusewriteback = NULL, *rd_nfs_writeback = NULL, *rd_bounce = NULL;
  287. if(unlikely(!st_mem_writeback)) {
  288. st_mem_writeback = rrdset_create_localhost(
  289. "mem"
  290. , "writeback"
  291. , NULL
  292. , "kernel"
  293. , NULL
  294. , "Writeback Memory"
  295. , "MiB"
  296. , PLUGIN_PROC_NAME
  297. , PLUGIN_PROC_MODULE_MEMINFO_NAME
  298. , NETDATA_CHART_PRIO_MEM_KERNEL
  299. , update_every
  300. , RRDSET_TYPE_LINE
  301. );
  302. rrdset_flag_set(st_mem_writeback, RRDSET_FLAG_DETAIL);
  303. rd_dirty = rrddim_add(st_mem_writeback, "Dirty", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  304. rd_writeback = rrddim_add(st_mem_writeback, "Writeback", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  305. rd_fusewriteback = rrddim_add(st_mem_writeback, "FuseWriteback", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  306. rd_nfs_writeback = rrddim_add(st_mem_writeback, "NfsWriteback", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  307. rd_bounce = rrddim_add(st_mem_writeback, "Bounce", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  308. }
  309. rrddim_set_by_pointer(st_mem_writeback, rd_dirty, Dirty);
  310. rrddim_set_by_pointer(st_mem_writeback, rd_writeback, Writeback);
  311. rrddim_set_by_pointer(st_mem_writeback, rd_fusewriteback, WritebackTmp);
  312. rrddim_set_by_pointer(st_mem_writeback, rd_nfs_writeback, NFS_Unstable);
  313. rrddim_set_by_pointer(st_mem_writeback, rd_bounce, Bounce);
  314. rrdset_done(st_mem_writeback);
  315. }
  316. // --------------------------------------------------------------------
  317. if(do_kernel) {
  318. static RRDSET *st_mem_kernel = NULL;
  319. static RRDDIM *rd_slab = NULL, *rd_kernelstack = NULL, *rd_pagetables = NULL, *rd_vmallocused = NULL,
  320. *rd_percpu = NULL;
  321. if(unlikely(!st_mem_kernel)) {
  322. st_mem_kernel = rrdset_create_localhost(
  323. "mem"
  324. , "kernel"
  325. , NULL
  326. , "kernel"
  327. , NULL
  328. , "Memory Used by Kernel"
  329. , "MiB"
  330. , PLUGIN_PROC_NAME
  331. , PLUGIN_PROC_MODULE_MEMINFO_NAME
  332. , NETDATA_CHART_PRIO_MEM_KERNEL + 1
  333. , update_every
  334. , RRDSET_TYPE_STACKED
  335. );
  336. rrdset_flag_set(st_mem_kernel, RRDSET_FLAG_DETAIL);
  337. rd_slab = rrddim_add(st_mem_kernel, "Slab", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  338. rd_kernelstack = rrddim_add(st_mem_kernel, "KernelStack", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  339. rd_pagetables = rrddim_add(st_mem_kernel, "PageTables", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  340. rd_vmallocused = rrddim_add(st_mem_kernel, "VmallocUsed", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  341. if (do_percpu)
  342. rd_percpu = rrddim_add(st_mem_kernel, "Percpu", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  343. }
  344. rrddim_set_by_pointer(st_mem_kernel, rd_slab, Slab);
  345. rrddim_set_by_pointer(st_mem_kernel, rd_kernelstack, KernelStack);
  346. rrddim_set_by_pointer(st_mem_kernel, rd_pagetables, PageTables);
  347. rrddim_set_by_pointer(st_mem_kernel, rd_vmallocused, VmallocUsed);
  348. if (do_percpu)
  349. rrddim_set_by_pointer(st_mem_kernel, rd_percpu, Percpu);
  350. rrdset_done(st_mem_kernel);
  351. }
  352. if(do_slab) {
  353. static RRDSET *st_mem_slab = NULL;
  354. static RRDDIM *rd_reclaimable = NULL, *rd_unreclaimable = NULL;
  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. , "MiB"
  364. , PLUGIN_PROC_NAME
  365. , PLUGIN_PROC_MODULE_MEMINFO_NAME
  366. , NETDATA_CHART_PRIO_MEM_SLAB
  367. , update_every
  368. , RRDSET_TYPE_STACKED
  369. );
  370. rrdset_flag_set(st_mem_slab, RRDSET_FLAG_DETAIL);
  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. }
  374. rrddim_set_by_pointer(st_mem_slab, rd_reclaimable, SReclaimable);
  375. rrddim_set_by_pointer(st_mem_slab, rd_unreclaimable, SUnreclaim);
  376. rrdset_done(st_mem_slab);
  377. }
  378. if(do_hugepages == CONFIG_BOOLEAN_YES || (do_hugepages == CONFIG_BOOLEAN_AUTO &&
  379. ((Hugepagesize && HugePages_Total) ||
  380. netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES))) {
  381. do_hugepages = CONFIG_BOOLEAN_YES;
  382. static RRDSET *st_mem_hugepages = NULL;
  383. static RRDDIM *rd_used = NULL, *rd_free = NULL, *rd_rsvd = NULL, *rd_surp = NULL;
  384. if(unlikely(!st_mem_hugepages)) {
  385. st_mem_hugepages = rrdset_create_localhost(
  386. "mem"
  387. , "hugepages"
  388. , NULL
  389. , "hugepages"
  390. , NULL
  391. , "Dedicated HugePages Memory"
  392. , "MiB"
  393. , PLUGIN_PROC_NAME
  394. , PLUGIN_PROC_MODULE_MEMINFO_NAME
  395. , NETDATA_CHART_PRIO_MEM_HUGEPAGES + 1
  396. , update_every
  397. , RRDSET_TYPE_STACKED
  398. );
  399. rrdset_flag_set(st_mem_hugepages, RRDSET_FLAG_DETAIL);
  400. rd_free = rrddim_add(st_mem_hugepages, "free", NULL, Hugepagesize, 1024, RRD_ALGORITHM_ABSOLUTE);
  401. rd_used = rrddim_add(st_mem_hugepages, "used", NULL, Hugepagesize, 1024, RRD_ALGORITHM_ABSOLUTE);
  402. rd_surp = rrddim_add(st_mem_hugepages, "surplus", NULL, Hugepagesize, 1024, RRD_ALGORITHM_ABSOLUTE);
  403. rd_rsvd = rrddim_add(st_mem_hugepages, "reserved", NULL, Hugepagesize, 1024, RRD_ALGORITHM_ABSOLUTE);
  404. }
  405. rrddim_set_by_pointer(st_mem_hugepages, rd_used, HugePages_Total - HugePages_Free - HugePages_Rsvd);
  406. rrddim_set_by_pointer(st_mem_hugepages, rd_free, HugePages_Free);
  407. rrddim_set_by_pointer(st_mem_hugepages, rd_rsvd, HugePages_Rsvd);
  408. rrddim_set_by_pointer(st_mem_hugepages, rd_surp, HugePages_Surp);
  409. rrdset_done(st_mem_hugepages);
  410. }
  411. if(do_transparent_hugepages == CONFIG_BOOLEAN_YES || (do_transparent_hugepages == CONFIG_BOOLEAN_AUTO &&
  412. (AnonHugePages ||
  413. ShmemHugePages ||
  414. netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES))) {
  415. do_transparent_hugepages = CONFIG_BOOLEAN_YES;
  416. static RRDSET *st_mem_transparent_hugepages = NULL;
  417. static RRDDIM *rd_anonymous = NULL, *rd_shared = NULL;
  418. if(unlikely(!st_mem_transparent_hugepages)) {
  419. st_mem_transparent_hugepages = rrdset_create_localhost(
  420. "mem"
  421. , "transparent_hugepages"
  422. , NULL
  423. , "hugepages"
  424. , NULL
  425. , "Transparent HugePages Memory"
  426. , "MiB"
  427. , PLUGIN_PROC_NAME
  428. , PLUGIN_PROC_MODULE_MEMINFO_NAME
  429. , NETDATA_CHART_PRIO_MEM_HUGEPAGES
  430. , update_every
  431. , RRDSET_TYPE_STACKED
  432. );
  433. rrdset_flag_set(st_mem_transparent_hugepages, RRDSET_FLAG_DETAIL);
  434. rd_anonymous = rrddim_add(st_mem_transparent_hugepages, "anonymous", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  435. rd_shared = rrddim_add(st_mem_transparent_hugepages, "shmem", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  436. }
  437. rrddim_set_by_pointer(st_mem_transparent_hugepages, rd_anonymous, AnonHugePages);
  438. rrddim_set_by_pointer(st_mem_transparent_hugepages, rd_shared, ShmemHugePages);
  439. rrdset_done(st_mem_transparent_hugepages);
  440. }
  441. return 0;
  442. }