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
});