@cryptotaxi247 / netdata-1 / commits / 50183dc5b

add support for monitoring thp, ballooning, zswap, ksm cow (#15000)

* add support for monitoring thp, ballooning, zswap, ksm cow * update proc metrics.csv * updated metrics.csv * Revert "updated metrics.csv" This reverts commit 54b9464be7c0d805220bbcb2144b4b4d7780a9c5. * replaced prog.plugin with proc.plugin --------- Co-authored-by: ilyam8 <ilya@netdata.cloud>

Costa Tsaousis committed May 3, 2023 at 16:35 UTC 50183dc5b1022c94b99fd30b7c9aad5e7e6059fe
3 files changed +580 -61
collectors/all.h
+10
@@ -25,6 +25,7 @@
25 #define NETDATA_CHART_PRIO_SYSTEM_RAM 200
26 #define NETDATA_CHART_PRIO_SYSTEM_SWAP 201
27 #define NETDATA_CHART_PRIO_SYSTEM_SWAPIO 250
28 +#define NETDATA_CHART_PRIO_SYSTEM_ZSWAPIO 300
29 #define NETDATA_CHART_PRIO_SYSTEM_NET 500
30 #define NETDATA_CHART_PRIO_SYSTEM_IPV4 500 // freebsd only
31 #define NETDATA_CHART_PRIO_SYSTEM_IP 501
@@ -80,9 +81,18 @@
81 #define NETDATA_CHART_PRIO_MEM_KERNEL 1100
82 #define NETDATA_CHART_PRIO_MEM_SLAB 1200
83 #define NETDATA_CHART_PRIO_MEM_HUGEPAGES 1250
84 +#define NETDATA_CHART_PRIO_MEM_HUGEPAGES_FAULTS 1251
85 +#define NETDATA_CHART_PRIO_MEM_HUGEPAGES_FILE 1252
86 +#define NETDATA_CHART_PRIO_MEM_HUGEPAGES_ZERO 1253
87 +#define NETDATA_CHART_PRIO_MEM_HUGEPAGES_KHUGEPAGED 1254
88 +#define NETDATA_CHART_PRIO_MEM_HUGEPAGES_SPLITS 1255
89 +#define NETDATA_CHART_PRIO_MEM_HUGEPAGES_SWAPOUT 1256
90 +#define NETDATA_CHART_PRIO_MEM_HUGEPAGES_COMPACT 1257
91 #define NETDATA_CHART_PRIO_MEM_KSM 1300
92 #define NETDATA_CHART_PRIO_MEM_KSM_SAVINGS 1301
93 #define NETDATA_CHART_PRIO_MEM_KSM_RATIOS 1302
94 +#define NETDATA_CHART_PRIO_MEM_KSM_COW 1303
95 +#define NETDATA_CHART_PRIO_MEM_BALLOON 1350
96 #define NETDATA_CHART_PRIO_MEM_NUMA 1400
97 #define NETDATA_CHART_PRIO_MEM_NUMA_NODES 1410
98 #define NETDATA_CHART_PRIO_MEM_PAGEFRAG 1450
collectors/proc.plugin/metrics.csv
+69 -59
@@ -1,19 +1,19 @@
1 metric,scope,dimensions,unit,description,chart_type,labels,plugin,module
2 -system.cpu,,"guest_nice, guest, steal, softirq, irq, user, system, nice, iowait, idle",percentage,Total CPU utilization,stacked,,prog.plugin,/proc/stat
3 -cpu.cpu,cpu core,"guest_nice, guest, steal, softirq, irq, user, system, nice, iowait, idle",percentage,Core utilization,stacked,cpu,prog.plugin,/proc/stat
4 -system.intr,,interrupts,interrupts/s,CPU Interrupts,line,,prog.plugin,/proc/stat
5 -system.ctxt,,switches,context switches/s,CPU Context Switches,line,,prog.plugin,/proc/stat
6 -system.forks,,started,processes/s,Started Processes,line,,prog.plugin,/proc/stat
7 -system.processes,,"running, blocked",processes,System Processes,line,,prog.plugin,/proc/stat
8 -cpu.core_throttling,,a dimension per cpu core,events/s,Core Thermal Throttling Events,line,,prog.plugin,/proc/stat
9 -cpu.package_throttling,,a dimension per package,events/s,Package Thermal Throttling Events,line,,prog.plugin,/proc/stat
10 -cpu.cpufreq,,a dimension per cpu core,MHz,Current CPU Frequency,line,,prog.plugin,/proc/stat
11 -cpuidle.cpu_cstate_residency_time,cpu core,a dimension per c-state,percentage,C-state residency time,stacked,cpu,prog.plugin,/proc/stat
12 -system.entropy,,entropy,entropy,Available Entropy,line,,prog.plugin,/proc/sys/kernel/random/entropy_avail
13 -system.uptime,,uptime,seconds,System Uptime,line,,prog.plugin,/proc/uptime
14 -system.swapio,,"in, out",KiB/s,Swap I/O,area,,prog.plugin,/proc/vmstat
15 -system.pgpgio,,"in, out",KiB/s,Memory Paged from/to disk,area,,prog.plugin,/proc/vmstat
16 -system.pgfaults,,"minor, major",faults/s,Memory Page Faults,line,,prog.plugin,/proc/vmstat
2 +system.cpu,,"guest_nice, guest, steal, softirq, irq, user, system, nice, iowait, idle",percentage,Total CPU utilization,stacked,,proc.plugin,/proc/stat
3 +cpu.cpu,cpu core,"guest_nice, guest, steal, softirq, irq, user, system, nice, iowait, idle",percentage,Core utilization,stacked,cpu,proc.plugin,/proc/stat
4 +system.intr,,interrupts,interrupts/s,CPU Interrupts,line,,proc.plugin,/proc/stat
5 +system.ctxt,,switches,context switches/s,CPU Context Switches,line,,proc.plugin,/proc/stat
6 +system.forks,,started,processes/s,Started Processes,line,,proc.plugin,/proc/stat
7 +system.processes,,"running, blocked",processes,System Processes,line,,proc.plugin,/proc/stat
8 +cpu.core_throttling,,a dimension per cpu core,events/s,Core Thermal Throttling Events,line,,proc.plugin,/proc/stat
9 +cpu.package_throttling,,a dimension per package,events/s,Package Thermal Throttling Events,line,,proc.plugin,/proc/stat
10 +cpu.cpufreq,,a dimension per cpu core,MHz,Current CPU Frequency,line,,proc.plugin,/proc/stat
11 +cpuidle.cpu_cstate_residency_time,cpu core,a dimension per c-state,percentage,C-state residency time,stacked,cpu,proc.plugin,/proc/stat
12 +system.entropy,,entropy,entropy,Available Entropy,line,,proc.plugin,/proc/sys/kernel/random/entropy_avail
13 +system.uptime,,uptime,seconds,System Uptime,line,,proc.plugin,/proc/uptime
14 +system.swapio,,"in, out",KiB/s,Swap I/O,area,,proc.plugin,/proc/vmstat
15 +system.pgpgio,,"in, out",KiB/s,Memory Paged from/to disk,area,,proc.plugin,/proc/vmstat
16 +system.pgfaults,,"minor, major",faults/s,Memory Page Faults,line,,proc.plugin,/proc/vmstat
17 system.interrupts,,a dimension per device,interrupts/s,System interrupts,stacked,,proc.plugin,/proc/interrupts
18 cpu.interrupts,cpu core,a dimension per device,interrupts/s,CPU interrupts,stacked,cpu,proc.plugin,/proc/interrupts
19 system.load,,"load1, load5, load15",load,System Load Average,line,,proc.plugin,/proc/loadavg
@@ -44,52 +44,62 @@ mem.kernel,,"Slab, KernelStack, PageTables, VmallocUsed, Percpu",MiB,Memory Used
44 mem.slab,,"reclaimable, unreclaimable",MiB,Reclaimable Kernel Memory,stacked,,proc.plugin,/proc/meminfo
45 mem.hugepage,,"free, used, surplus, reserved",MiB,Dedicated HugePages Memory,stacked,,proc.plugin,/proc/meminfo
46 mem.transparent_hugepages,,"anonymous, shmem",MiB,Transparent HugePages Memory,stacked,,proc.plugin,/proc/meminfo
47 +mem.balloon,,"inflate, deflate, migrate",KiB/s,Memory Ballooning Operations,line,,proc.plugin,/proc/vmstat
48 +mem.zswapio,,"in, out",KiB/s,ZSwap I/O,area,,proc.plugin,/proc/vmstat
49 +mem.ksm_cow,,"swapin, write",KiB/s,KSM Copy On Write Operations,line,,proc.plugin,/proc/vmstat
50 +mem.thp_faults,,"alloc, fallback, fallback_charge",events/s,Transparent Huge Page Fault Allocations,line,,proc.plugin,/proc/vmstat
51 +mem.thp_file,,"alloc, fallback, mapped, fallback_charge",events/s,Transparent Huge Page File Allocations,line,,proc.plugin,/proc/vmstat
52 +mem.thp_zero,,"alloc, failed",events/s,Transparent Huge Zero Page Allocations,line,,proc.plugin,/proc/vmstat
53 +mem.thp_collapse,,"alloc, failed",events/s,Transparent Huge Pages Collapsed by khugepaged,line,,proc.plugin,/proc/vmstat
54 +mem.thp_split,,"split, failed, split_pmd, split_deferred",events/s,Transparent Huge Page Splits,line,,proc.plugin,/proc/vmstat
55 +mem.thp_swapout,,"swapout, fallback",events/s,Transparent Huge Pages Swap Out,line,,proc.plugin,/proc/vmstat
56 +mem.thp_compact,,"success, fail, stall",events/s,Transparent Huge Pages Compaction,line,,proc.plugin,/proc/vmstat
57 mem.pagetype_global,,a dimension per pagesize,B,System orders available,stacked,,proc.plugin,/proc/pagetypeinfo
58 mem.pagetype,"node, zone, type",a dimension per pagesize,B,"pagetype_Node{node}_{zone}_{type}",stacked,"node_id, node_zone, node_type",proc.plugin,/proc/pagetypeinfo
49 -mem.oom_kill,,kills,kills/s,Out of Memory Kills,line,,prog.plugin,/proc/vmstat
50 -mem.numa,,"local, foreign, interleave, other, pte_updates, huge_pte_updates, hint_faults, hint_faults_local, pages_migrated",events/s,NUMA events,line,,prog.plugin,/proc/vmstat
51 -mem.ecc_ce,,a dimension per mem controller,errors,ECC Memory Correctable Errors,line,,prog.plugin,/sys/devices/system/edac/mc
52 -mem.ecc_ue,,a dimension per mem controller,errors,ECC Memory Uncorrectable Errors,line,,prog.plugin,/sys/devices/system/edac/mc
53 -mem.numa_nodes,numa node,"hit, miss, local, foreign, interleave, other",events/s,NUMA events,line,numa_node,prog.plugin,/sys/devices/system/node
54 -mem.ksm,,"shared, unshared, sharing, volatile",MiB,Kernel Same Page Merging,stacked,,prog.plugin,/sys/kernel/mm/ksm
55 -mem.ksm_savings,,"savings, offered",MiB,Kernel Same Page Merging Savings,area,,prog.plugin,/sys/kernel/mm/ksm
56 -mem.ksm_ratios,,savings,percentage,Kernel Same Page Merging Effectiveness,line,,prog.plugin,/sys/kernel/mm/ksm
57 -mem.zram_usage,zram device,"compressed, metadata",MiB,ZRAM Memory Usage,area,device,prog.plugin,/sys/block/zram
58 -mem.zram_savings,zram device,"savings, original",MiB,ZRAM Memory Savings,area,device,prog.plugin,/sys/block/zram
59 -mem.zram_ratio,zram device,ratio,ratio,ZRAM Compression Ratio (original to compressed),line,device,prog.plugin,/sys/block/zram
60 -mem.zram_efficiency,zram device,percent,percentage,ZRAM Efficiency,line,device,prog.plugin,/sys/block/zram
61 -system.ipc_semaphores,,semaphores,semaphores,IPC Semaphores,area,,prog.plugin,ipc
62 -system.ipc_semaphore_arrays,,arrays,arrays,IPC Semaphore Arrays,area,,prog.plugin,ipc
63 -system.message_queue_message,,a dimension per queue,messages,IPC Message Queue Number of Messages,stacked,,prog.plugin,ipc
64 -system.message_queue_bytes,,a dimension per queue,bytes,IPC Message Queue Used Bytes,stacked,,prog.plugin,ipc
65 -system.shared_memory_segments,,segments,segments,IPC Shared Memory Number of Segments,stacked,,prog.plugin,ipc
66 -system.shared_memory_bytes,,bytes,bytes,IPC Shared Memory Used Bytes,stacked,,prog.plugin,ipc
67 -system.io,,"in, out",KiB/s,Disk I/O,area,,prog.plugin,/proc/diskstats
68 -disk.io,disk,"reads, writes",KiB/s,Disk I/O Bandwidth,area,"device, mount_point, device_type",prog.plugin,/proc/diskstats
69 -disk_ext.io,disk,discards,KiB/s,Amount of Discarded Data,area,"device, mount_point, device_type",prog.plugin,/proc/diskstats
70 -disk.ops,disk,"reads, writes",operations/s,Disk Completed I/O Operations,line,"device, mount_point, device_type",prog.plugin,/proc/diskstats
71 -disk_ext.ops,disk,"discards, flushes",operations/s,Disk Completed Extended I/O Operations,line,"device, mount_point, device_type",prog.plugin,/proc/diskstats
72 -disk.qops,disk,operations,operations,Disk Current I/O Operations,line,"device, mount_point, device_type",prog.plugin,/proc/diskstats
73 -disk.backlog,disk,backlog,milliseconds,Disk Backlog,area,"device, mount_point, device_type",prog.plugin,/proc/diskstats
74 -disk.busy,disk,busy,milliseconds,Disk Busy Time,area,"device, mount_point, device_type",prog.plugin,/proc/diskstats
75 -disk.util,disk,utilization,% of time working,Disk Utilization Time,area,"device, mount_point, device_type",prog.plugin,/proc/diskstats
76 -disk.mops,disk,"reads, writes",merged operations/s,Disk Merged Operations,line,"device, mount_point, device_type",prog.plugin,/proc/diskstats
77 -disk_ext.mops,disk,discards,merged operations/s,Disk Merged Discard Operations,line,"device, mount_point, device_type",prog.plugin,/proc/diskstats
78 -disk.iotime,disk,"reads, writes",milliseconds/s,Disk Total I/O Time,line,"device, mount_point, device_type",prog.plugin,/proc/diskstats
79 -disk_ext.iotime,disk,"discards, flushes",milliseconds/s,Disk Total I/O Time for Extended Operations,line,"device, mount_point, device_type",prog.plugin,/proc/diskstats
80 -disk.await,disk,"reads, writes",milliseconds/operation,Average Completed I/O Operation Time,line,"device, mount_point, device_type",prog.plugin,/proc/diskstats
81 -disk_ext.await,disk,"discards, flushes",milliseconds/operation,Average Completed Extended I/O Operation Time,line,"device, mount_point, device_type",prog.plugin,/proc/diskstats
82 -disk.avgsz,disk,"reads, writes",KiB/operation,Average Completed I/O Operation Bandwidth,area,"device, mount_point, device_type",prog.plugin,/proc/diskstats
83 -disk_ext.avgsz,disk,discards,KiB/operation,Average Amount of Discarded Data,area,"device, mount_point, device_type",prog.plugin,/proc/diskstats
84 -disk.svctm,disk,svctm,milliseconds/operation,Average Service Time,line,"device, mount_point, device_type",prog.plugin,/proc/diskstats
85 -disk.bcache_cache_alloc,disk,"ununsed, dirty, clean, metadata, undefined",percentage,BCache Cache Allocations,stacked,,prog.plugin,/proc/diskstats
86 -disk.bcache_hit_ratio,disk,"5min, 1hour, 1day, ever",percentage,BCache Cache Hit Ratio,line,"device, mount_point, device_type",prog.plugin,/proc/diskstats
87 -disk.bcache_rates,disk,"congested, writeback",KiB/s,BCache Rates,area,"device, mount_point, device_type",prog.plugin,/proc/diskstats
88 -disk.bcache_size,disk,dirty,MiB,BCache Cache Sizes,area,"device, mount_point, device_type",prog.plugin,/proc/diskstats
89 -disk.bcache_usage,disk,avail,percentage,BCache Cache Usage,area,"device, mount_point, device_type",prog.plugin,/proc/diskstats
90 -disk.bcache_cache_read_races,disk,"races, errors",operations/s,BCache Cache Read Races,line,"device, mount_point, device_type",prog.plugin,/proc/diskstats
91 -disk.bcache,disk,"hits, misses, collisions, readaheads",operations/s,BCache Cache I/O Operations,line,"device, mount_point, device_type",prog.plugin,/proc/diskstats
92 -disk.bcache_bypass,disk,"hits, misses",operations/s,BCache Cache Bypass I/O Operations,line,"device, mount_point, device_type",prog.plugin,/proc/diskstats
59 +mem.oom_kill,,kills,kills/s,Out of Memory Kills,line,,proc.plugin,/proc/vmstat
60 +mem.numa,,"local, foreign, interleave, other, pte_updates, huge_pte_updates, hint_faults, hint_faults_local, pages_migrated",events/s,NUMA events,line,,proc.plugin,/proc/vmstat
61 +mem.ecc_ce,,a dimension per mem controller,errors,ECC Memory Correctable Errors,line,,proc.plugin,/sys/devices/system/edac/mc
62 +mem.ecc_ue,,a dimension per mem controller,errors,ECC Memory Uncorrectable Errors,line,,proc.plugin,/sys/devices/system/edac/mc
63 +mem.numa_nodes,numa node,"hit, miss, local, foreign, interleave, other",events/s,NUMA events,line,numa_node,proc.plugin,/sys/devices/system/node
64 +mem.ksm,,"shared, unshared, sharing, volatile",MiB,Kernel Same Page Merging,stacked,,proc.plugin,/sys/kernel/mm/ksm
65 +mem.ksm_savings,,"savings, offered",MiB,Kernel Same Page Merging Savings,area,,proc.plugin,/sys/kernel/mm/ksm
66 +mem.ksm_ratios,,savings,percentage,Kernel Same Page Merging Effectiveness,line,,proc.plugin,/sys/kernel/mm/ksm
67 +mem.zram_usage,zram device,"compressed, metadata",MiB,ZRAM Memory Usage,area,device,proc.plugin,/sys/block/zram
68 +mem.zram_savings,zram device,"savings, original",MiB,ZRAM Memory Savings,area,device,proc.plugin,/sys/block/zram
69 +mem.zram_ratio,zram device,ratio,ratio,ZRAM Compression Ratio (original to compressed),line,device,proc.plugin,/sys/block/zram
70 +mem.zram_efficiency,zram device,percent,percentage,ZRAM Efficiency,line,device,proc.plugin,/sys/block/zram
71 +system.ipc_semaphores,,semaphores,semaphores,IPC Semaphores,area,,proc.plugin,ipc
72 +system.ipc_semaphore_arrays,,arrays,arrays,IPC Semaphore Arrays,area,,proc.plugin,ipc
73 +system.message_queue_message,,a dimension per queue,messages,IPC Message Queue Number of Messages,stacked,,proc.plugin,ipc
74 +system.message_queue_bytes,,a dimension per queue,bytes,IPC Message Queue Used Bytes,stacked,,proc.plugin,ipc
75 +system.shared_memory_segments,,segments,segments,IPC Shared Memory Number of Segments,stacked,,proc.plugin,ipc
76 +system.shared_memory_bytes,,bytes,bytes,IPC Shared Memory Used Bytes,stacked,,proc.plugin,ipc
77 +system.io,,"in, out",KiB/s,Disk I/O,area,,proc.plugin,/proc/diskstats
78 +disk.io,disk,"reads, writes",KiB/s,Disk I/O Bandwidth,area,"device, mount_point, device_type",proc.plugin,/proc/diskstats
79 +disk_ext.io,disk,discards,KiB/s,Amount of Discarded Data,area,"device, mount_point, device_type",proc.plugin,/proc/diskstats
80 +disk.ops,disk,"reads, writes",operations/s,Disk Completed I/O Operations,line,"device, mount_point, device_type",proc.plugin,/proc/diskstats
81 +disk_ext.ops,disk,"discards, flushes",operations/s,Disk Completed Extended I/O Operations,line,"device, mount_point, device_type",proc.plugin,/proc/diskstats
82 +disk.qops,disk,operations,operations,Disk Current I/O Operations,line,"device, mount_point, device_type",proc.plugin,/proc/diskstats
83 +disk.backlog,disk,backlog,milliseconds,Disk Backlog,area,"device, mount_point, device_type",proc.plugin,/proc/diskstats
84 +disk.busy,disk,busy,milliseconds,Disk Busy Time,area,"device, mount_point, device_type",proc.plugin,/proc/diskstats
85 +disk.util,disk,utilization,% of time working,Disk Utilization Time,area,"device, mount_point, device_type",proc.plugin,/proc/diskstats
86 +disk.mops,disk,"reads, writes",merged operations/s,Disk Merged Operations,line,"device, mount_point, device_type",proc.plugin,/proc/diskstats
87 +disk_ext.mops,disk,discards,merged operations/s,Disk Merged Discard Operations,line,"device, mount_point, device_type",proc.plugin,/proc/diskstats
88 +disk.iotime,disk,"reads, writes",milliseconds/s,Disk Total I/O Time,line,"device, mount_point, device_type",proc.plugin,/proc/diskstats
89 +disk_ext.iotime,disk,"discards, flushes",milliseconds/s,Disk Total I/O Time for Extended Operations,line,"device, mount_point, device_type",proc.plugin,/proc/diskstats
90 +disk.await,disk,"reads, writes",milliseconds/operation,Average Completed I/O Operation Time,line,"device, mount_point, device_type",proc.plugin,/proc/diskstats
91 +disk_ext.await,disk,"discards, flushes",milliseconds/operation,Average Completed Extended I/O Operation Time,line,"device, mount_point, device_type",proc.plugin,/proc/diskstats
92 +disk.avgsz,disk,"reads, writes",KiB/operation,Average Completed I/O Operation Bandwidth,area,"device, mount_point, device_type",proc.plugin,/proc/diskstats
93 +disk_ext.avgsz,disk,discards,KiB/operation,Average Amount of Discarded Data,area,"device, mount_point, device_type",proc.plugin,/proc/diskstats
94 +disk.svctm,disk,svctm,milliseconds/operation,Average Service Time,line,"device, mount_point, device_type",proc.plugin,/proc/diskstats
95 +disk.bcache_cache_alloc,disk,"ununsed, dirty, clean, metadata, undefined",percentage,BCache Cache Allocations,stacked,,proc.plugin,/proc/diskstats
96 +disk.bcache_hit_ratio,disk,"5min, 1hour, 1day, ever",percentage,BCache Cache Hit Ratio,line,"device, mount_point, device_type",proc.plugin,/proc/diskstats
97 +disk.bcache_rates,disk,"congested, writeback",KiB/s,BCache Rates,area,"device, mount_point, device_type",proc.plugin,/proc/diskstats
98 +disk.bcache_size,disk,dirty,MiB,BCache Cache Sizes,area,"device, mount_point, device_type",proc.plugin,/proc/diskstats
99 +disk.bcache_usage,disk,avail,percentage,BCache Cache Usage,area,"device, mount_point, device_type",proc.plugin,/proc/diskstats
100 +disk.bcache_cache_read_races,disk,"races, errors",operations/s,BCache Cache Read Races,line,"device, mount_point, device_type",proc.plugin,/proc/diskstats
101 +disk.bcache,disk,"hits, misses, collisions, readaheads",operations/s,BCache Cache I/O Operations,line,"device, mount_point, device_type",proc.plugin,/proc/diskstats
102 +disk.bcache_bypass,disk,"hits, misses",operations/s,BCache Cache Bypass I/O Operations,line,"device, mount_point, device_type",proc.plugin,/proc/diskstats
103 md.health,,a dimension per md array,failed disks,Faulty Devices In MD,line,,proc.plugin,/proc/mdstat
104 md.disks,md array,"inuse, down",disks,Disks Stats,stacked,"device, raid_level",proc.plugin,/proc/mdstat
105 md.mismatch_cnt,md array,count,unsynchronized blocks,Mismatch Count,line,"device, raid_level",proc.plugin,/proc/mdstat
collectors/proc.plugin/proc_vmstat.c
+501 -2
@@ -10,7 +10,7 @@ int do_proc_vmstat(int update_every, usec_t dt) {
10 (void)dt;
11
12 static procfile *ff = NULL;
13 - static int do_swapio = -1, do_io = -1, do_pgfaults = -1, do_oom_kill = -1, do_numa = -1;
13 + static int do_swapio = -1, do_io = -1, do_pgfaults = -1, do_oom_kill = -1, do_numa = -1, do_thp = -1, do_zswapio = -1, do_balloon = -1, do_ksm = -1;
14 static int has_numa = -1;
15
16 static ARL_BASE *arl_base = NULL;
@@ -31,6 +31,103 @@ int do_proc_vmstat(int update_every, usec_t dt) {
31 static unsigned long long pswpout = 0ULL;
32 static unsigned long long oom_kill = 0ULL;
33
34 + // THP page migration
35 +// static unsigned long long pgmigrate_success = 0ULL;
36 +// static unsigned long long pgmigrate_fail = 0ULL;
37 +// static unsigned long long thp_migration_success = 0ULL;
38 +// static unsigned long long thp_migration_fail = 0ULL;
39 +// static unsigned long long thp_migration_split = 0ULL;
40 +
41 + // Compaction cost model
42 + // https://lore.kernel.org/lkml/20121022080525.GB2198@suse.de/
43 +// static unsigned long long compact_migrate_scanned = 0ULL;
44 +// static unsigned long long compact_free_scanned = 0ULL;
45 +// static unsigned long long compact_isolated = 0ULL;
46 +
47 + // THP defragmentation
48 + static unsigned long long compact_stall = 0ULL; // incremented when an application stalls allocating THP
49 + static unsigned long long compact_fail = 0ULL; // defragmentation events that failed
50 + static unsigned long long compact_success = 0ULL; // defragmentation events that succeeded
51 +
52 + // ?
53 +// static unsigned long long compact_daemon_wake = 0ULL;
54 +// static unsigned long long compact_daemon_migrate_scanned = 0ULL;
55 +// static unsigned long long compact_daemon_free_scanned = 0ULL;
56 +
57 + // ?
58 +// static unsigned long long htlb_buddy_alloc_success = 0ULL;
59 +// static unsigned long long htlb_buddy_alloc_fail = 0ULL;
60 +
61 + // ?
62 +// static unsigned long long cma_alloc_success = 0ULL;
63 +// static unsigned long long cma_alloc_fail = 0ULL;
64 +
65 + // ?
66 +// static unsigned long long unevictable_pgs_culled = 0ULL;
67 +// static unsigned long long unevictable_pgs_scanned = 0ULL;
68 +// static unsigned long long unevictable_pgs_rescued = 0ULL;
69 +// static unsigned long long unevictable_pgs_mlocked = 0ULL;
70 +// static unsigned long long unevictable_pgs_munlocked = 0ULL;
71 +// static unsigned long long unevictable_pgs_cleared = 0ULL;
72 +// static unsigned long long unevictable_pgs_stranded = 0ULL;
73 +
74 + // THP handling of page faults
75 + static unsigned long long thp_fault_alloc = 0ULL; // is incremented every time a huge page is successfully allocated to handle a page fault. This applies to both the first time a page is faulted and for COW faults.
76 + static unsigned long long thp_fault_fallback = 0ULL; // is incremented if a page fault fails to allocate a huge page and instead falls back to using small pages.
77 + static unsigned long long thp_fault_fallback_charge = 0ULL; // is incremented if a page fault fails to charge a huge page and instead falls back to using small pages even though the allocation was successful.
78 +
79 + // khugepaged collapsing of small pages into huge pages
80 + static unsigned long long thp_collapse_alloc = 0ULL; // is incremented by khugepaged when it has found a range of pages to collapse into one huge page and has successfully allocated a new huge page to store the data.
81 + static unsigned long long thp_collapse_alloc_failed = 0ULL; // is incremented if khugepaged found a range of pages that should be collapsed into one huge page but failed the allocation.
82 +
83 + // THP handling of file allocations
84 + static unsigned long long thp_file_alloc = 0ULL; // is incremented every time a file huge page is successfully allocated
85 + static unsigned long long thp_file_fallback = 0ULL; // is incremented if a file huge page is attempted to be allocated but fails and instead falls back to using small pages
86 + static unsigned long long thp_file_fallback_charge = 0ULL; // is incremented if a file huge page cannot be charged and instead falls back to using small pages even though the allocation was successful
87 + static unsigned long long thp_file_mapped = 0ULL; // is incremented every time a file huge page is mapped into user address space
88 +
89 + // THP splitting of huge pages into small pages
90 + static unsigned long long thp_split_page = 0ULL;
91 + static unsigned long long thp_split_page_failed = 0ULL;
92 + static unsigned long long thp_deferred_split_page = 0ULL; // is incremented when a huge page is put onto split queue. This happens when a huge page is partially unmapped and splitting it would free up some memory. Pages on split queue are going to be split under memory pressure
93 + static unsigned long long thp_split_pmd = 0ULL; // is incremented every time a PMD split into table of PTEs. This can happen, for instance, when application calls mprotect() or munmap() on part of huge page. It doesn’t split huge page, only page table entry
94 +
95 + // ?
96 +// static unsigned long long thp_scan_exceed_none_pte = 0ULL;
97 +// static unsigned long long thp_scan_exceed_swap_pte = 0ULL;
98 +// static unsigned long long thp_scan_exceed_share_pte = 0ULL;
99 +// static unsigned long long thp_split_pud = 0ULL;
100 +
101 + // THP Zero Huge Page
102 + static unsigned long long thp_zero_page_alloc = 0ULL; // is incremented every time a huge zero page used for thp is successfully allocated. Note, it doesn’t count every map of the huge zero page, only its allocation
103 + static unsigned long long thp_zero_page_alloc_failed = 0ULL; // is incremented if kernel fails to allocate huge zero page and falls back to using small pages
104 +
105 + // THP Swap Out
106 + static unsigned long long thp_swpout = 0ULL; // is incremented every time a huge page is swapout in one piece without splitting
107 + static unsigned long long thp_swpout_fallback = 0ULL; // is incremented if a huge page has to be split before swapout. Usually because failed to allocate some continuous swap space for the huge page
108 +
109 + // memory ballooning
110 + // Current size of balloon is (balloon_inflate - balloon_deflate) pages
111 + static unsigned long long balloon_inflate = 0ULL;
112 + static unsigned long long balloon_deflate = 0ULL;
113 + static unsigned long long balloon_migrate = 0ULL;
114 +
115 + // ?
116 +// static unsigned long long swap_ra = 0ULL;
117 +// static unsigned long long swap_ra_hit = 0ULL;
118 +
119 + static unsigned long long ksm_swpin_copy = 0ULL; // is incremented every time a KSM page is copied when swapping in
120 + static unsigned long long cow_ksm = 0ULL; // is incremented every time a KSM page triggers copy on write (COW) when users try to write to a KSM page, we have to make a copy
121 +
122 + // zswap
123 + static unsigned long long zswpin = 0ULL;
124 + static unsigned long long zswpout = 0ULL;
125 +
126 + // ?
127 +// static unsigned long long direct_map_level2_splits = 0ULL;
128 +// static unsigned long long direct_map_level3_splits = 0ULL;
129 +// static unsigned long long nr_unstable = 0ULL;
130 +
131 if(unlikely(!ff)) {
132 char filename[FILENAME_MAX + 1];
133 snprintfz(filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, "/proc/vmstat");
@@ -49,7 +146,10 @@ int do_proc_vmstat(int update_every, usec_t dt) {
146 do_pgfaults = config_get_boolean("plugin:proc:/proc/vmstat", "memory page faults", CONFIG_BOOLEAN_YES);
147 do_oom_kill = config_get_boolean("plugin:proc:/proc/vmstat", "out of memory kills", CONFIG_BOOLEAN_AUTO);
148 do_numa = config_get_boolean_ondemand("plugin:proc:/proc/vmstat", "system-wide numa metric summary", CONFIG_BOOLEAN_AUTO);
52 -
149 + do_thp = config_get_boolean_ondemand("plugin:proc:/proc/vmstat", "transparent huge pages", CONFIG_BOOLEAN_AUTO);
150 + do_zswapio = config_get_boolean_ondemand("plugin:proc:/proc/vmstat", "zswap i/o", CONFIG_BOOLEAN_AUTO);
151 + do_balloon = config_get_boolean_ondemand("plugin:proc:/proc/vmstat", "memory ballooning", CONFIG_BOOLEAN_AUTO);
152 + do_ksm = config_get_boolean_ondemand("plugin:proc:/proc/vmstat", "kernel same memory", CONFIG_BOOLEAN_AUTO);
153
154 arl_base = arl_create("vmstat", NULL, 60);
155 arl_expect(arl_base, "pgfault", &pgfault);
@@ -94,6 +194,56 @@ int do_proc_vmstat(int update_every, usec_t dt) {
194 has_numa = 0;
195 do_numa = CONFIG_BOOLEAN_NO;
196 }
197 +
198 + if(do_thp == CONFIG_BOOLEAN_YES || do_thp == CONFIG_BOOLEAN_AUTO) {
199 +// arl_expect(arl_base, "pgmigrate_success", &pgmigrate_success);
200 +// arl_expect(arl_base, "pgmigrate_fail", &pgmigrate_fail);
201 +// arl_expect(arl_base, "thp_migration_success", &thp_migration_success);
202 +// arl_expect(arl_base, "thp_migration_fail", &thp_migration_fail);
203 +// arl_expect(arl_base, "thp_migration_split", &thp_migration_split);
204 +// arl_expect(arl_base, "compact_migrate_scanned", &compact_migrate_scanned);
205 +// arl_expect(arl_base, "compact_free_scanned", &compact_free_scanned);
206 +// arl_expect(arl_base, "compact_isolated", &compact_isolated);
207 + arl_expect(arl_base, "compact_stall", &compact_stall);
208 + arl_expect(arl_base, "compact_fail", &compact_fail);
209 + arl_expect(arl_base, "compact_success", &compact_success);
210 +// arl_expect(arl_base, "compact_daemon_wake", &compact_daemon_wake);
211 +// arl_expect(arl_base, "compact_daemon_migrate_scanned", &compact_daemon_migrate_scanned);
212 +// arl_expect(arl_base, "compact_daemon_free_scanned", &compact_daemon_free_scanned);
213 + arl_expect(arl_base, "thp_fault_alloc", &thp_fault_alloc);
214 + arl_expect(arl_base, "thp_fault_fallback", &thp_fault_fallback);
215 + arl_expect(arl_base, "thp_fault_fallback_charge", &thp_fault_fallback_charge);
216 + arl_expect(arl_base, "thp_collapse_alloc", &thp_collapse_alloc);
217 + arl_expect(arl_base, "thp_collapse_alloc_failed", &thp_collapse_alloc_failed);
218 + arl_expect(arl_base, "thp_file_alloc", &thp_file_alloc);
219 + arl_expect(arl_base, "thp_file_fallback", &thp_file_fallback);
220 + arl_expect(arl_base, "thp_file_fallback_charge", &thp_file_fallback_charge);
221 + arl_expect(arl_base, "thp_file_mapped", &thp_file_mapped);
222 + arl_expect(arl_base, "thp_split_page", &thp_split_page);
223 + arl_expect(arl_base, "thp_split_page_failed", &thp_split_page_failed);
224 + arl_expect(arl_base, "thp_deferred_split_page", &thp_deferred_split_page);
225 + arl_expect(arl_base, "thp_split_pmd", &thp_split_pmd);
226 + arl_expect(arl_base, "thp_zero_page_alloc", &thp_zero_page_alloc);
227 + arl_expect(arl_base, "thp_zero_page_alloc_failed", &thp_zero_page_alloc_failed);
228 + arl_expect(arl_base, "thp_swpout", &thp_swpout);
229 + arl_expect(arl_base, "thp_swpout_fallback", &thp_swpout_fallback);
230 + }
231 +
232 + if(do_balloon == CONFIG_BOOLEAN_YES || do_balloon == CONFIG_BOOLEAN_AUTO) {
233 + arl_expect(arl_base, "balloon_inflate", &balloon_inflate);
234 + arl_expect(arl_base, "balloon_deflate", &balloon_deflate);
235 + arl_expect(arl_base, "balloon_migrate", &balloon_migrate);
236 + }
237 +
238 + if(do_ksm == CONFIG_BOOLEAN_YES || do_ksm == CONFIG_BOOLEAN_AUTO) {
239 + arl_expect(arl_base, "ksm_swpin_copy", &ksm_swpin_copy);
240 + arl_expect(arl_base, "cow_ksm", &cow_ksm);
241 + }
242 +
243 + if(do_zswapio == CONFIG_BOOLEAN_YES || do_zswapio == CONFIG_BOOLEAN_AUTO) {
244 + arl_expect(arl_base, "zswpin", &zswpin);
245 + arl_expect(arl_base, "zswpout", &zswpout);
246 + }
247 }
248
249 arl_begin(arl_base);
@@ -306,6 +456,355 @@ int do_proc_vmstat(int update_every, usec_t dt) {
456 rrdset_done(st_numa);
457 }
458
459 + // --------------------------------------------------------------------
460 +
461 + if(do_balloon == CONFIG_BOOLEAN_YES || (do_balloon == CONFIG_BOOLEAN_AUTO && (balloon_inflate || balloon_deflate ||
462 + balloon_migrate || netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES))) {
463 + do_balloon = CONFIG_BOOLEAN_YES;
464 +
465 + static RRDSET *st_balloon = NULL;
466 + static RRDDIM *rd_inflate = NULL, *rd_deflate = NULL, *rd_migrate = NULL;
467 +
468 + if(unlikely(!st_balloon)) {
469 + st_balloon = rrdset_create_localhost(
470 + "mem"
471 + , "balloon"
472 + , NULL
473 + , "balloon"
474 + , NULL
475 + , "Memory Ballooning Operations"
476 + , "KiB/s"
477 + , PLUGIN_PROC_NAME
478 + , PLUGIN_PROC_MODULE_VMSTAT_NAME
479 + , NETDATA_CHART_PRIO_MEM_BALLOON
480 + , update_every
481 + , RRDSET_TYPE_LINE
482 + );
483 +
484 + rd_inflate = rrddim_add(st_balloon, "inflate", NULL, sysconf(_SC_PAGESIZE), 1024, RRD_ALGORITHM_INCREMENTAL);
485 + rd_deflate = rrddim_add(st_balloon, "deflate", NULL, -sysconf(_SC_PAGESIZE), 1024, RRD_ALGORITHM_INCREMENTAL);
486 + rd_migrate = rrddim_add(st_balloon, "migrate", NULL, sysconf(_SC_PAGESIZE), 1024, RRD_ALGORITHM_INCREMENTAL);
487 + }
488 +
489 + rrddim_set_by_pointer(st_balloon, rd_inflate, balloon_inflate);
490 + rrddim_set_by_pointer(st_balloon, rd_deflate, balloon_deflate);
491 + rrddim_set_by_pointer(st_balloon, rd_migrate, balloon_migrate);
492 +
493 + rrdset_done(st_balloon);
494 + }
495 +
496 + // --------------------------------------------------------------------
497 +
498 + if(do_zswapio == CONFIG_BOOLEAN_YES || (do_zswapio == CONFIG_BOOLEAN_AUTO &&
499 + (zswpin || zswpout ||
500 + netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES))) {
501 + do_zswapio = CONFIG_BOOLEAN_YES;
502 +
503 + static RRDSET *st_zswapio = NULL;
504 + static RRDDIM *rd_in = NULL, *rd_out = NULL;
505 +
506 + if(unlikely(!st_zswapio)) {
507 + st_zswapio = rrdset_create_localhost(
508 + "system"
509 + , "zswapio"
510 + , NULL
511 + , "zswap"
512 + , NULL
513 + , "ZSwap I/O"
514 + , "KiB/s"
515 + , PLUGIN_PROC_NAME
516 + , PLUGIN_PROC_MODULE_VMSTAT_NAME
517 + , NETDATA_CHART_PRIO_SYSTEM_ZSWAPIO
518 + , update_every
519 + , RRDSET_TYPE_AREA
520 + );
521 +
522 + rd_in = rrddim_add(st_zswapio, "in", NULL, sysconf(_SC_PAGESIZE), 1024, RRD_ALGORITHM_INCREMENTAL);
523 + rd_out = rrddim_add(st_zswapio, "out", NULL, -sysconf(_SC_PAGESIZE), 1024, RRD_ALGORITHM_INCREMENTAL);
524 + }
525 +
526 + rrddim_set_by_pointer(st_zswapio, rd_in, zswpin);
527 + rrddim_set_by_pointer(st_zswapio, rd_out, zswpout);
528 + rrdset_done(st_zswapio);
529 + }
530 +
531 + // --------------------------------------------------------------------
532 +
533 + if(do_ksm == CONFIG_BOOLEAN_YES || (do_ksm == CONFIG_BOOLEAN_AUTO &&
534 + (cow_ksm || ksm_swpin_copy ||
535 + netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES))) {
536 + do_ksm = CONFIG_BOOLEAN_YES;
537 +
538 + static RRDSET *st_ksm_cow = NULL;
539 + static RRDDIM *rd_swapin = NULL, *rd_write = NULL;
540 +
541 + if(unlikely(!st_ksm_cow)) {
542 + st_ksm_cow = rrdset_create_localhost(
543 + "mem"
544 + , "ksm_cow"
545 + , NULL
546 + , "ksm"
547 + , NULL
548 + , "KSM Copy On Write Operations"
549 + , "KiB/s"
550 + , PLUGIN_PROC_NAME
551 + , PLUGIN_PROC_MODULE_VMSTAT_NAME
552 + , NETDATA_CHART_PRIO_MEM_KSM_COW
553 + , update_every
554 + , RRDSET_TYPE_LINE
555 + );
556 +
557 + rd_swapin = rrddim_add(st_ksm_cow, "swapin", NULL, sysconf(_SC_PAGESIZE), 1024, RRD_ALGORITHM_INCREMENTAL);
558 + rd_write = rrddim_add(st_ksm_cow, "write", NULL, sysconf(_SC_PAGESIZE), 1024, RRD_ALGORITHM_INCREMENTAL);
559 + }
560 +
561 + rrddim_set_by_pointer(st_ksm_cow, rd_swapin, ksm_swpin_copy);
562 + rrddim_set_by_pointer(st_ksm_cow, rd_write, cow_ksm);
563 +
564 + rrdset_done(st_ksm_cow);
565 + }
566 +
567 + // --------------------------------------------------------------------
568 +
569 + if(do_thp == CONFIG_BOOLEAN_YES || do_thp == CONFIG_BOOLEAN_AUTO) {
570 +
571 + if(do_thp == CONFIG_BOOLEAN_YES || (do_thp == CONFIG_BOOLEAN_AUTO &&
572 + (netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES || thp_fault_alloc || thp_fault_fallback || thp_fault_fallback_charge))) {
573 +
574 + static RRDSET *st_thp_fault = NULL;
575 + static RRDDIM *rd_alloc = NULL, *rd_fallback = NULL, *rd_fallback_charge = NULL;
576 +
577 + if(unlikely(!st_thp_fault)) {
578 + st_thp_fault = rrdset_create_localhost(
579 + "mem"
580 + , "thp_faults"
581 + , NULL
582 + , "hugepages"
583 + , NULL
584 + , "Transparent Huge Page Fault Allocations"
585 + , "events/s"
586 + , PLUGIN_PROC_NAME
587 + , PLUGIN_PROC_MODULE_VMSTAT_NAME
588 + , NETDATA_CHART_PRIO_MEM_HUGEPAGES_FAULTS
589 + , update_every
590 + , RRDSET_TYPE_LINE
591 + );
592 +
593 + rd_alloc = rrddim_add(st_thp_fault, "alloc", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
594 + rd_fallback = rrddim_add(st_thp_fault, "fallback", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
595 + rd_fallback_charge = rrddim_add(st_thp_fault, "fallback_charge", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
596 + }
597 +
598 + rrddim_set_by_pointer(st_thp_fault, rd_alloc, thp_fault_alloc);
599 + rrddim_set_by_pointer(st_thp_fault, rd_fallback, thp_fault_fallback);
600 + rrddim_set_by_pointer(st_thp_fault, rd_fallback_charge, thp_fault_fallback_charge);
601 +
602 + rrdset_done(st_thp_fault);
603 + }
604 +
605 + if(do_thp == CONFIG_BOOLEAN_YES || (do_thp == CONFIG_BOOLEAN_AUTO &&
606 + (netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES || thp_fault_alloc || thp_fault_fallback || thp_fault_fallback_charge || thp_file_mapped))) {
607 +
608 + static RRDSET *st_thp_file = NULL;
609 + static RRDDIM *rd_alloc = NULL, *rd_fallback = NULL, *rd_fallback_charge = NULL, *rd_mapped = NULL;
610 +
611 + if(unlikely(!st_thp_file)) {
612 + st_thp_file = rrdset_create_localhost(
613 + "mem"
614 + , "thp_file"
615 + , NULL
616 + , "hugepages"
617 + , NULL
618 + , "Transparent Huge Page File Allocations"
619 + , "events/s"
620 + , PLUGIN_PROC_NAME
621 + , PLUGIN_PROC_MODULE_VMSTAT_NAME
622 + , NETDATA_CHART_PRIO_MEM_HUGEPAGES_FILE
623 + , update_every
624 + , RRDSET_TYPE_LINE
625 + );
626 +
627 + rd_alloc = rrddim_add(st_thp_file, "alloc", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
628 + rd_fallback = rrddim_add(st_thp_file, "fallback", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
629 + rd_mapped = rrddim_add(st_thp_file, "mapped", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
630 + rd_fallback_charge = rrddim_add(st_thp_file, "fallback_charge", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
631 + }
632 +
633 + rrddim_set_by_pointer(st_thp_file, rd_alloc, thp_file_alloc);
634 + rrddim_set_by_pointer(st_thp_file, rd_fallback, thp_file_fallback);
635 + rrddim_set_by_pointer(st_thp_file, rd_mapped, thp_file_fallback_charge);
636 + rrddim_set_by_pointer(st_thp_file, rd_fallback_charge, thp_file_fallback_charge);
637 +
638 + rrdset_done(st_thp_file);
639 + }
640 +
641 + if(do_thp == CONFIG_BOOLEAN_YES || (do_thp == CONFIG_BOOLEAN_AUTO &&
642 + (netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES || thp_zero_page_alloc || thp_zero_page_alloc_failed))) {
643 +
644 + static RRDSET *st_thp_zero = NULL;
645 + static RRDDIM *rd_alloc = NULL, *rd_failed = NULL;
646 +
647 + if(unlikely(!st_thp_zero)) {
648 + st_thp_zero = rrdset_create_localhost(
649 + "mem"
650 + , "thp_zero"
651 + , NULL
652 + , "hugepages"
653 + , NULL
654 + , "Transparent Huge Zero Page Allocations"
655 + , "events/s"
656 + , PLUGIN_PROC_NAME
657 + , PLUGIN_PROC_MODULE_VMSTAT_NAME
658 + , NETDATA_CHART_PRIO_MEM_HUGEPAGES_ZERO
659 + , update_every
660 + , RRDSET_TYPE_LINE
661 + );
662 +
663 + rd_alloc = rrddim_add(st_thp_zero, "alloc", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
664 + rd_failed = rrddim_add(st_thp_zero, "failed", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
665 + }
666 +
667 + rrddim_set_by_pointer(st_thp_zero, rd_alloc, thp_zero_page_alloc);
668 + rrddim_set_by_pointer(st_thp_zero, rd_failed, thp_zero_page_alloc_failed);
669 +
670 + rrdset_done(st_thp_zero);
671 + }
672 +
673 + if(do_thp == CONFIG_BOOLEAN_YES || (do_thp == CONFIG_BOOLEAN_AUTO &&
674 + (netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES || thp_collapse_alloc || thp_collapse_alloc_failed))) {
675 +
676 + static RRDSET *st_khugepaged = NULL;
677 + static RRDDIM *rd_alloc = NULL, *rd_failed = NULL;
678 +
679 + if(unlikely(!st_khugepaged)) {
680 + st_khugepaged = rrdset_create_localhost(
681 + "mem"
682 + , "thp_collapse"
683 + , NULL
684 + , "hugepages"
685 + , NULL
686 + , "Transparent Huge Pages Collapsed by khugepaged"
687 + , "events/s"
688 + , PLUGIN_PROC_NAME
689 + , PLUGIN_PROC_MODULE_VMSTAT_NAME
690 + , NETDATA_CHART_PRIO_MEM_HUGEPAGES_KHUGEPAGED
691 + , update_every
692 + , RRDSET_TYPE_LINE
693 + );
694 +
695 + rd_alloc = rrddim_add(st_khugepaged, "alloc", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
696 + rd_failed = rrddim_add(st_khugepaged, "failed", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
697 + }
698 +
699 + rrddim_set_by_pointer(st_khugepaged, rd_alloc, thp_collapse_alloc);
700 + rrddim_set_by_pointer(st_khugepaged, rd_failed, thp_collapse_alloc_failed);
701 +
702 + rrdset_done(st_khugepaged);
703 + }
704 +
705 + if(do_thp == CONFIG_BOOLEAN_YES || (do_thp == CONFIG_BOOLEAN_AUTO &&
706 + (netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES || thp_split_page || thp_split_page_failed || thp_deferred_split_page || thp_split_pmd))) {
707 +
708 + static RRDSET *st_thp_split = NULL;
709 + static RRDDIM *rd_split = NULL, *rd_failed = NULL, *rd_deferred_split = NULL, *rd_split_pmd = NULL;
710 +
711 + if(unlikely(!st_thp_split)) {
712 + st_thp_split = rrdset_create_localhost(
713 + "mem"
714 + , "thp_split"
715 + , NULL
716 + , "hugepages"
717 + , NULL
718 + , "Transparent Huge Page Splits"
719 + , "events/s"
720 + , PLUGIN_PROC_NAME
721 + , PLUGIN_PROC_MODULE_VMSTAT_NAME
722 + , NETDATA_CHART_PRIO_MEM_HUGEPAGES_SPLITS
723 + , update_every
724 + , RRDSET_TYPE_LINE
725 + );
726 +
727 + rd_split = rrddim_add(st_thp_split, "split", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
728 + rd_failed = rrddim_add(st_thp_split, "failed", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
729 + rd_split_pmd = rrddim_add(st_thp_split, "split_pmd", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
730 + rd_deferred_split = rrddim_add(st_thp_split, "split_deferred", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
731 + }
732 +
733 + rrddim_set_by_pointer(st_thp_split, rd_split, thp_split_page);
734 + rrddim_set_by_pointer(st_thp_split, rd_failed, thp_split_page_failed);
735 + rrddim_set_by_pointer(st_thp_split, rd_split_pmd, thp_split_pmd);
736 + rrddim_set_by_pointer(st_thp_split, rd_deferred_split, thp_deferred_split_page);
737 +
738 + rrdset_done(st_thp_split);
739 + }
740 +
741 + if(do_thp == CONFIG_BOOLEAN_YES || (do_thp == CONFIG_BOOLEAN_AUTO &&
742 + (netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES || thp_swpout || thp_swpout_fallback))) {
743 +
744 + static RRDSET *st_tmp_swapout = NULL;
745 + static RRDDIM *rd_swapout = NULL, *rd_fallback = NULL;
746 +
747 + if(unlikely(!st_tmp_swapout)) {
748 + st_tmp_swapout = rrdset_create_localhost(
749 + "mem"
750 + , "thp_swapout"
751 + , NULL
752 + , "hugepages"
753 + , NULL
754 + , "Transparent Huge Pages Swap Out"
755 + , "events/s"
756 + , PLUGIN_PROC_NAME
757 + , PLUGIN_PROC_MODULE_VMSTAT_NAME
758 + , NETDATA_CHART_PRIO_MEM_HUGEPAGES_SWAPOUT
759 + , update_every
760 + , RRDSET_TYPE_LINE
761 + );
762 +
763 + rd_swapout = rrddim_add(st_tmp_swapout, "swapout", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
764 + rd_fallback = rrddim_add(st_tmp_swapout, "fallback", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
765 + }
766 +
767 + rrddim_set_by_pointer(st_tmp_swapout, rd_swapout, thp_swpout);
768 + rrddim_set_by_pointer(st_tmp_swapout, rd_fallback, thp_swpout_fallback);
769 +
770 + rrdset_done(st_tmp_swapout);
771 + }
772 +
773 + if(do_thp == CONFIG_BOOLEAN_YES || (do_thp == CONFIG_BOOLEAN_AUTO &&
774 + (netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES || compact_stall || compact_fail || compact_success))) {
775 +
776 + static RRDSET *st_thp_compact = NULL;
777 + static RRDDIM *rd_success = NULL, *rd_fail = NULL, *rd_stall = NULL;
778 +
779 + if(unlikely(!st_thp_compact)) {
780 + st_thp_compact = rrdset_create_localhost(
781 + "mem"
782 + , "thp_compact"
783 + , NULL
784 + , "hugepages"
785 + , NULL
786 + , "Transparent Huge Pages Compaction"
787 + , "events/s"
788 + , PLUGIN_PROC_NAME
789 + , PLUGIN_PROC_MODULE_VMSTAT_NAME
790 + , NETDATA_CHART_PRIO_MEM_HUGEPAGES_COMPACT
791 + , update_every
792 + , RRDSET_TYPE_LINE
793 + );
794 +
795 + rd_success = rrddim_add(st_thp_compact, "success", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
796 + rd_fail = rrddim_add(st_thp_compact, "fail", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
797 + rd_stall = rrddim_add(st_thp_compact, "stall", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
798 + }
799 +
800 + rrddim_set_by_pointer(st_thp_compact, rd_success, compact_success);
801 + rrddim_set_by_pointer(st_thp_compact, rd_fail, compact_fail);
802 + rrddim_set_by_pointer(st_thp_compact, rd_stall, compact_stall);
803 +
804 + rrdset_done(st_thp_compact);
805 + }
806 + }
807 +
808 return 0;
809 }
810