@cryptotaxi247 / netdata-1 / commits / eeb88c953

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