@cryptotaxi247 / netdata-1 / commits / 0449150e3

added MemAvailable from /proc/meminfo; fixes #3241

Costa Tsaousis (ktsaou) committed Jan 7, 2018 at 03:32 UTC 0449150e3bbe4fd38a228725f3ec0950a8e81973
5 files changed +86 -36
conf.d/health.d/ram.conf
+14 -1
@@ -20,5 +20,18 @@
20 warn: $this > (($status >= $WARNING) ? (80) : (90))
21 crit: $this > (($status == $CRITICAL) ? (90) : (98))
22 delay: down 15m multiplier 1.5 max 1h
23 - info: system RAM usage
23 + info: system RAM used
24 + to: sysadmin
25 +
26 + alarm: ram_available
27 + on: mem.available
28 + os: linux
29 + hosts: *
30 + calc: ($avail + $used_ram_to_ignore) * 100 / ($system.ram.used - $used_ram_to_ignore + $system.ram.cached + $system.ram.free)
31 + units: %
32 + every: 10s
33 + warn: $this < (($status >= $WARNING) ? ( 5) : (10))
34 + crit: $this < (($status == $CRITICAL) ? (10) : ( 5))
35 + delay: down 15m multiplier 1.5 max 1h
36 + info: estimated amount of RAM available for processes
37 to: sysadmin
src/proc_meminfo.c
+66 -33
@@ -7,11 +7,12 @@ int do_proc_meminfo(int update_every, usec_t dt) {
7 static int do_ram = -1, do_swap = -1, do_hwcorrupt = -1, do_committed = -1, do_writeback = -1, do_kernel = -1, do_slab = -1;
8
9 static ARL_BASE *arl_base = NULL;
10 - static ARL_ENTRY *arl_hwcorrupted = NULL;
10 + static ARL_ENTRY *arl_hwcorrupted = NULL, *arl_memavailable = NULL;
11
12 static unsigned long long
13 MemTotal = 0,
14 MemFree = 0,
15 + MemAvailable = 0,
16 Buffers = 0,
17 Cached = 0,
18 //SwapCached = 0,
@@ -65,6 +66,7 @@ int do_proc_meminfo(int update_every, usec_t dt) {
66 arl_base = arl_create("meminfo", NULL, 60);
67 arl_expect(arl_base, "MemTotal", &MemTotal);
68 arl_expect(arl_base, "MemFree", &MemFree);
69 + arl_memavailable = arl_expect(arl_base, "MemAvailable", &MemAvailable);
70 arl_expect(arl_base, "Buffers", &Buffers);
71 arl_expect(arl_base, "Cached", &Cached);
72 //arl_expect(arl_base, "SwapCached", &SwapCached);
@@ -138,38 +140,69 @@ int do_proc_meminfo(int update_every, usec_t dt) {
140 unsigned long long MemUsed = MemTotal - MemFree - Cached - Buffers;
141
142 if(do_ram) {
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 - , "proc"
154 - , "meminfo"
155 - , 200
156 - , update_every
157 - , RRDSET_TYPE_STACKED
158 - );
159 -
160 - rd_free = rrddim_add(st_system_ram, "free", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
161 - rd_used = rrddim_add(st_system_ram, "used", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
162 - rd_cached = rrddim_add(st_system_ram, "cached", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
163 - rd_buffers = rrddim_add(st_system_ram, "buffers", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
143 + {
144 + static RRDSET *st_system_ram = NULL;
145 + static RRDDIM *rd_free = NULL, *rd_used = NULL, *rd_cached = NULL, *rd_buffers = NULL;
146 +
147 + if(unlikely(!st_system_ram)) {
148 + st_system_ram = rrdset_create_localhost(
149 + "system"
150 + , "ram"
151 + , NULL
152 + , "ram"
153 + , NULL
154 + , "System RAM"
155 + , "MB"
156 + , "proc"
157 + , "meminfo"
158 + , 200
159 + , update_every
160 + , RRDSET_TYPE_STACKED
161 + );
162 +
163 + rd_free = rrddim_add(st_system_ram, "free", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
164 + rd_used = rrddim_add(st_system_ram, "used", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
165 + rd_cached = rrddim_add(st_system_ram, "cached", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
166 + rd_buffers = rrddim_add(st_system_ram, "buffers", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
167 + }
168 + else rrdset_next(st_system_ram);
169 +
170 + rrddim_set_by_pointer(st_system_ram, rd_free, MemFree);
171 + rrddim_set_by_pointer(st_system_ram, rd_used, MemUsed);
172 + rrddim_set_by_pointer(st_system_ram, rd_cached, Cached);
173 + rrddim_set_by_pointer(st_system_ram, rd_buffers, Buffers);
174 +
175 + rrdset_done(st_system_ram);
176 }
165 - else rrdset_next(st_system_ram);
166 -
167 - rrddim_set_by_pointer(st_system_ram, rd_free, MemFree);
168 - rrddim_set_by_pointer(st_system_ram, rd_used, MemUsed);
169 - rrddim_set_by_pointer(st_system_ram, rd_cached, Cached);
170 - rrddim_set_by_pointer(st_system_ram, rd_buffers, Buffers);
177
172 - rrdset_done(st_system_ram);
178 + if(arl_memavailable->flags & ARL_ENTRY_FLAG_FOUND) {
179 + static RRDSET *st_mem_available = NULL;
180 + static RRDDIM *rd_avail = NULL;
181 +
182 + if(unlikely(!st_mem_available)) {
183 + st_mem_available = rrdset_create_localhost(
184 + "mem"
185 + , "available"
186 + , NULL
187 + , "system"
188 + , NULL
189 + , "Available RAM for applications"
190 + , "MB"
191 + , "proc"
192 + , "meminfo"
193 + , 4000
194 + , update_every
195 + , RRDSET_TYPE_AREA
196 + );
197 +
198 + rd_avail = rrddim_add(st_mem_available, "MemAvailable", "avail", 1, 1024, RRD_ALGORITHM_ABSOLUTE);
199 + }
200 + else rrdset_next(st_mem_available);
201 +
202 + rrddim_set_by_pointer(st_mem_available, rd_avail, MemAvailable);
203 +
204 + rrdset_done(st_mem_available);
205 + }
206 }
207
208 // --------------------------------------------------------------------
@@ -263,7 +296,7 @@ int do_proc_meminfo(int update_every, usec_t dt) {
296 , "MB"
297 , "proc"
298 , "meminfo"
266 - , 5000
299 + , 4005
300 , update_every
301 , RRDSET_TYPE_AREA
302 );
@@ -296,7 +329,7 @@ int do_proc_meminfo(int update_every, usec_t dt) {
329 , "MB"
330 , "proc"
331 , "meminfo"
299 - , 4000
332 + , 5000
333 , update_every
334 , RRDSET_TYPE_LINE
335 );
src/proc_vmstat.c
+1 -1
@@ -168,7 +168,7 @@ int do_proc_vmstat(int update_every, usec_t dt) {
168 , "page faults/s"
169 , "proc"
170 , "vmstat"
171 - , 500
171 + , 4010
172 , update_every
173 , RRDSET_TYPE_LINE
174 );
web/dashboard_info.js
+4
@@ -659,6 +659,10 @@ netdataDashboard.context = {
659 info: 'Committed Memory, is the sum of all memory which has been allocated by processes.'
660 },
661
662 + 'mem.available': {
663 + info: 'Available Memory is estimated by the kernel, as the amount of RAM that can be used by userspace processes, without causing swapping.'
664 + },
665 +
666 'mem.writeback': {
667 info: '<b>Dirty</b> is the amount of memory waiting to be written to disk. <b>Writeback</b> is how much memory is actively being written to disk.'
668 },
web/index.html
+1 -1
@@ -4344,7 +4344,7 @@
4344 });
4345
4346 NETDATA.requiredJs.push({
4347 - url: NETDATA.serverStatic + 'dashboard_info.js?v20180106-3',
4347 + url: NETDATA.serverStatic + 'dashboard_info.js?v20180106-4',
4348 async: false,
4349 isAlreadyLoaded: function() { return false; }
4350 });