detect low ram conditions more aggresively (#19938)
* detect low ram conditions more aggresively * added free memory percent to posted status file
Costa Tsaousis committed
Mar 22, 2025 at 19:34 UTC
eeb88c9532db62d4d7d77c93a048b1d7336601ba
4 files changed
+32
-1
src/daemon/daemon-status-file.c
+1
@@ -1000,6 +1000,7 @@ void post_status_file(struct post_status_file_thread_data *d) {
1000
buffer_json_member_add_string(wb, "agent_version_now", NETDATA_VERSION);
1001
buffer_json_member_add_boolean(wb, "host_memory_critical",
1002
OS_SYSTEM_MEMORY_OK(d->status->memory) && d->status->memory.ram_available_bytes <= d->status->oom_protection);
1003
+ buffer_json_member_add_uint64(wb, "host_memory_free_percent", (uint64_t)round(os_system_memory_available_percent(d->status->memory)));
1004
daemon_status_file_to_json(wb, d->status);
1005
buffer_json_finalize(wb);
1006
src/daemon/signal-handler.c
+22
-1
@@ -252,14 +252,35 @@ static void process_triggered_signals(void) {
252
} while(found);
253
}
254
255
+static inline bool threshold_trigger_smaller(bool *last, double threshold, double hysteresis, double free_mem) {
256
+ bool triggered = *last;
257
+
258
+ if (free_mem < threshold)
259
+ *last = true;
260
+
261
+ if (free_mem >= (threshold + hysteresis))
262
+ *last = false;
263
+
264
+ return !triggered && *last;
265
+}
266
+
267
void nd_process_signals(void) {
268
posix_unmask_my_signals();
269
const usec_t save_every_ut = 15 * 60 * USEC_PER_SEC;
270
usec_t last_update_mt = now_monotonic_usec();
271
+ bool triggered1 = false, triggered5 = false, triggered10 = false;
272
273
while (true) {
274
+ bool save_again = false;
275
+ double free_mem = os_system_memory_available_percent(os_system_memory(false));
276
+
277
+ save_again =
278
+ threshold_trigger_smaller(&triggered1, 1.0, 1.0, free_mem) ||
279
+ threshold_trigger_smaller(&triggered5, 5.0, 1.0, free_mem) ||
280
+ threshold_trigger_smaller(&triggered10, 10.0, 1.0, free_mem);
281
+
282
usec_t mt = now_monotonic_usec();
262
- if ((mt - last_update_mt) >= save_every_ut) {
283
+ if ((mt - last_update_mt) >= save_every_ut || save_again) {
284
daemon_status_file_update_status(DAEMON_STATUS_NONE);
285
last_update_mt += save_every_ut;
286
}
src/libnetdata/os/system_memory.c
+7
@@ -321,3 +321,10 @@ OS_SYSTEM_MEMORY os_system_memory(bool query_total_ram) {
321
return os_system_memory_last;
322
}
323
#endif
324
+
325
+double os_system_memory_available_percent(OS_SYSTEM_MEMORY mem) {
326
+ if (!OS_SYSTEM_MEMORY_OK(mem))
327
+ return 100.0;
328
+
329
+ return 100.0 * (double)mem.ram_available_bytes / (double)mem.ram_total_bytes;
330
+}
src/libnetdata/os/system_memory.h
+2
@@ -29,4 +29,6 @@ OS_SYSTEM_MEMORY os_system_memory(bool query_total_ram);
29
// Returns the last successfully reported os_system_memory() value.
30
OS_SYSTEM_MEMORY os_last_reported_system_memory(void);
31
32
+double os_system_memory_available_percent(OS_SYSTEM_MEMORY mem);
33
+
34
#endif //NETDATA_OS_MEM_AVAILABLE_H