From d784a8d474a7e9c421a7b44530612e91c8764627 Mon Sep 17 00:00:00 2001 From: Oleg Solovyov Date: Tue, 2 Aug 2022 10:10:54 +0300 Subject: [PATCH] oomd: notify via dbus what have been killed --- man/org.freedesktop.oom1.xml | 31 ++++++++++++++++++++++++++++++- src/oom/oomd-manager-bus.c | 5 +++++ src/oom/oomd-manager.c | 24 ++++++++++++++++++++++-- 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/man/org.freedesktop.oom1.xml b/man/org.freedesktop.oom1.xml index 838eb6738d..c6b8c7fb3d 100644 --- a/man/org.freedesktop.oom1.xml +++ b/man/org.freedesktop.oom1.xml @@ -39,6 +39,9 @@ node /org/freedesktop/oom1 { interface org.freedesktop.oom1.Manager { methods: DumpByFileDescriptor(out h fd); + signals: + Killed(s cgroup, + s reason); }; interface org.freedesktop.DBus.Peer { ... }; interface org.freedesktop.DBus.Introspectable { ... }; @@ -56,12 +59,38 @@ node /org/freedesktop/oom1 { + + Methods - ... + Killed signal is sent when any cgroup is killed by oomd. + Note that more reasons will be added in the future, and the table below will be expanded accordingly. + + Killing reasons + + + + + + Reason + Description + + + + + memory-used + Application took too much memory and swap. + + + memory-pressure + Application took enough memory and swap to cause sufficient slowdown of other applications. + + + +
diff --git a/src/oom/oomd-manager-bus.c b/src/oom/oomd-manager-bus.c index b41e366309..f4c196ee10 100644 --- a/src/oom/oomd-manager-bus.c +++ b/src/oom/oomd-manager-bus.c @@ -38,6 +38,11 @@ static const sd_bus_vtable manager_vtable[] = { SD_BUS_PARAM(fd), bus_method_dump_by_fd, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_SIGNAL_WITH_NAMES("Killed", + "ss", + SD_BUS_PARAM(cgroup) + SD_BUS_PARAM(reason), + 0), SD_BUS_VTABLE_END }; diff --git a/src/oom/oomd-manager.c b/src/oom/oomd-manager.c index e49eef6577..d9574fa97b 100644 --- a/src/oom/oomd-manager.c +++ b/src/oom/oomd-manager.c @@ -410,7 +410,7 @@ static int monitor_swap_contexts_handler(sd_event_source *s, uint64_t usec, void if (r < 0) log_notice_errno(r, "Failed to kill any cgroup(s) based on swap: %m"); else { - if (selected && r > 0) + if (selected && r > 0) { log_notice("Killed %s due to memory used (%"PRIu64") / total (%"PRIu64") and " "swap used (%"PRIu64") / total (%"PRIu64") being more than " PERMYRIAD_AS_PERCENT_FORMAT_STR, @@ -418,6 +418,16 @@ static int monitor_swap_contexts_handler(sd_event_source *s, uint64_t usec, void m->system_context.mem_used, m->system_context.mem_total, m->system_context.swap_used, m->system_context.swap_total, PERMYRIAD_AS_PERCENT_FORMAT_VAL(m->swap_used_limit_permyriad)); + + /* send dbus signal */ + (void) sd_bus_emit_signal(m->bus, + "/org/freedesktop/oom1", + "org.freedesktop.oom1.Manager", + "Killed", + "ss", + selected, + "memory-used"); + } return 0; } } @@ -524,13 +534,23 @@ static int monitor_memory_pressure_contexts_handler(sd_event_source *s, uint64_t * it. In either case, go through the event loop again and select a new candidate if * pressure is still high. */ m->mem_pressure_post_action_delay_start = usec_now; - if (selected && r > 0) + if (selected && r > 0) { log_notice("Killed %s due to memory pressure for %s being %lu.%02lu%% > %lu.%02lu%%" " for > %s with reclaim activity", selected, t->path, LOADAVG_INT_SIDE(t->memory_pressure.avg10), LOADAVG_DECIMAL_SIDE(t->memory_pressure.avg10), LOADAVG_INT_SIDE(t->mem_pressure_limit), LOADAVG_DECIMAL_SIDE(t->mem_pressure_limit), FORMAT_TIMESPAN(m->default_mem_pressure_duration_usec, USEC_PER_SEC)); + + /* send dbus signal */ + (void) sd_bus_emit_signal(m->bus, + "/org/freedesktop/oom1", + "org.freedesktop.oom1.Manager", + "Killed", + "ss", + selected, + "memory-pressure"); + } return 0; } }