Bump to 247.3-2 for systemd-oomd finishes and systemd-oomd-defaults subpackage
Changes for https://fedoraproject.org/wiki/Changes/EnableSystemdOomd. Backports primarily PR #18361, #18444, and #18401 (#18401 is not merged at the time of writing this commit) + some minor PRs to handle conflicts. Creates systemd-oomd-defaults subpackage to install unit drop-ins that will configure systemd-oomd to monitor and act.
This commit is contained in:
parent
d1321e2ba9
commit
834f04c00b
2
10-oomd-defaults.conf
Normal file
2
10-oomd-defaults.conf
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[OOM]
|
||||||
|
DefaultMemoryPressureDurationSec=10s
|
2
10-oomd-root-slice-defaults.conf
Normal file
2
10-oomd-root-slice-defaults.conf
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[Slice]
|
||||||
|
ManagedOOMSwap=kill
|
3
10-oomd-user-service-defaults.conf
Normal file
3
10-oomd-user-service-defaults.conf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[Service]
|
||||||
|
ManagedOOMMemoryPressure=kill
|
||||||
|
ManagedOOMMemoryPressureLimit=4%
|
60
17829.patch
Normal file
60
17829.patch
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
From 14d044da23d6f2fa03066aedcc2600a479c1f731 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anita Zhang <the.anitazha@gmail.com>
|
||||||
|
Date: Wed, 2 Dec 2020 14:41:38 -0800
|
||||||
|
Subject: [PATCH] test: fix TEST-56-OOMD thresholds for linux 5.9 changes
|
||||||
|
|
||||||
|
Fixes #17533
|
||||||
|
|
||||||
|
The memory pressure values of the units in TEST-56-OOMD seemed to be a
|
||||||
|
lot lower after updating to linux 5.9. This is likely due to a fix from
|
||||||
|
https://github.com/torvalds/linux/commit/e22c6ed90aa91abc08f107344428ebb8c2629e98.
|
||||||
|
|
||||||
|
To account for this, I lowered memory.high on testbloat.service to
|
||||||
|
throttle it even more. This was enough to generate the 50%+ value to trigger
|
||||||
|
oomd for the test, but as an extra precaution I also lowered the oomd
|
||||||
|
threshold to 1% so it's certain to try and kill testbloat.service.
|
||||||
|
---
|
||||||
|
test/units/testsuite-56-testbloat.service | 6 +++---
|
||||||
|
test/units/testsuite-56-workload.slice | 2 +-
|
||||||
|
test/units/testsuite-56.sh | 2 +-
|
||||||
|
3 files changed, 5 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/test/units/testsuite-56-testbloat.service b/test/units/testsuite-56-testbloat.service
|
||||||
|
index 40cf5a9f36f..6163aae1dba 100644
|
||||||
|
--- a/test/units/testsuite-56-testbloat.service
|
||||||
|
+++ b/test/units/testsuite-56-testbloat.service
|
||||||
|
@@ -2,8 +2,8 @@
|
||||||
|
Description=Create a lot of memory pressure
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
-# A very small memory.high will cause the script (trying to use a lot of memory)
|
||||||
|
-# to throttle and be put under heavy pressure
|
||||||
|
-MemoryHigh=2M
|
||||||
|
+# A VERY small memory.high will cause the script (trying to use a lot of memory)
|
||||||
|
+# to throttle and be put under heavy pressure.
|
||||||
|
+MemoryHigh=1M
|
||||||
|
Slice=testsuite-56-workload.slice
|
||||||
|
ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-56-slowgrowth.sh
|
||||||
|
diff --git a/test/units/testsuite-56-workload.slice b/test/units/testsuite-56-workload.slice
|
||||||
|
index 3d542ec2bae..45b04914c63 100644
|
||||||
|
--- a/test/units/testsuite-56-workload.slice
|
||||||
|
+++ b/test/units/testsuite-56-workload.slice
|
||||||
|
@@ -7,4 +7,4 @@ MemoryAccounting=true
|
||||||
|
IOAccounting=true
|
||||||
|
TasksAccounting=true
|
||||||
|
ManagedOOMMemoryPressure=kill
|
||||||
|
-ManagedOOMMemoryPressureLimitPercent=50%
|
||||||
|
+ManagedOOMMemoryPressureLimitPercent=1%
|
||||||
|
diff --git a/test/units/testsuite-56.sh b/test/units/testsuite-56.sh
|
||||||
|
index 37d62d943c0..1846248855b 100755
|
||||||
|
--- a/test/units/testsuite-56.sh
|
||||||
|
+++ b/test/units/testsuite-56.sh
|
||||||
|
@@ -19,7 +19,7 @@ systemctl start testsuite-56-testchill.service
|
||||||
|
|
||||||
|
# Verify systemd-oomd is monitoring the expected units
|
||||||
|
oomctl | grep "/testsuite-56-workload.slice"
|
||||||
|
-oomctl | grep "50%"
|
||||||
|
+oomctl | grep "1%"
|
||||||
|
|
||||||
|
# systemd-oomd watches for elevated pressure for 30 seconds before acting.
|
||||||
|
# It can take time to build up pressure so either wait 5 minutes or for the service to fail.
|
403
18361.patch
Normal file
403
18361.patch
Normal file
@ -0,0 +1,403 @@
|
|||||||
|
From c20aa7b17166b9f331da33ad9288f9ede75c72db Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anita Zhang <the.anitazha@gmail.com>
|
||||||
|
Date: Sun, 24 Jan 2021 00:16:19 -0800
|
||||||
|
Subject: [PATCH 1/4] oom: make memory pressure duration configurable through
|
||||||
|
oomd.conf
|
||||||
|
|
||||||
|
---
|
||||||
|
man/oomd.conf.xml | 12 +++++++++++-
|
||||||
|
src/oom/oomd-manager.c | 13 +++++++++----
|
||||||
|
src/oom/oomd-manager.h | 5 +++--
|
||||||
|
src/oom/oomd-util.h | 1 +
|
||||||
|
src/oom/oomd.c | 4 +++-
|
||||||
|
src/oom/oomd.conf | 1 +
|
||||||
|
test/units/testsuite-56.sh | 3 +++
|
||||||
|
7 files changed, 31 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/man/oomd.conf.xml b/man/oomd.conf.xml
|
||||||
|
index 35a0686bc50..bb5da87c548 100644
|
||||||
|
--- a/man/oomd.conf.xml
|
||||||
|
+++ b/man/oomd.conf.xml
|
||||||
|
@@ -65,13 +65,23 @@
|
||||||
|
will take action. A unit can override this value with <varname>ManagedOOMMemoryPressureLimitPercent=</varname>.
|
||||||
|
The memory pressure for this property represents the fraction of time in a 10 second window in which all tasks
|
||||||
|
in the cgroup were delayed. For each monitored cgroup, if the memory pressure on that cgroup exceeds the
|
||||||
|
- limit set for more than 30 seconds, <command>systemd-oomd</command> will act on eligible descendant cgroups,
|
||||||
|
+ limit set for longer than the duration set by <varname>DefaultMemoryPressureDurationSec=</varname>,
|
||||||
|
+ <command>systemd-oomd</command> will act on eligible descendant cgroups,
|
||||||
|
starting from the ones with the most reclaim activity to the least reclaim activity. Which cgroups are
|
||||||
|
monitored and what action gets taken depends on what the unit has configured for
|
||||||
|
<varname>ManagedOOMMemoryPressure=</varname>. Takes a percentage value between 0% and 100%, inclusive.
|
||||||
|
Defaults to 60%.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
+ <varlistentry>
|
||||||
|
+ <term><varname>DefaultMemoryPressureDurationSec=</varname></term>
|
||||||
|
+
|
||||||
|
+ <listitem><para>Sets the amount of time a unit's cgroup needs to have exceeded memory pressure limits before
|
||||||
|
+ <command>systemd-oomd</command> will take action. Memory pressure limits are defined by
|
||||||
|
+ <varname>DefaultMemoryPressureLimitPercent=</varname> and <varname>ManagedOOMMemoryPressureLimitPercent=</varname>.
|
||||||
|
+ Defaults to 30 seconds when this property is unset or set to 0.</para></listitem>
|
||||||
|
+ </varlistentry>
|
||||||
|
+
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
diff --git a/src/oom/oomd-manager.c b/src/oom/oomd-manager.c
|
||||||
|
index fec96519e01..e8ed6a52739 100644
|
||||||
|
--- a/src/oom/oomd-manager.c
|
||||||
|
+++ b/src/oom/oomd-manager.c
|
||||||
|
@@ -306,7 +306,7 @@ static int monitor_cgroup_contexts_handler(sd_event_source *s, uint64_t usec, vo
|
||||||
|
m->post_action_delay_start = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- r = oomd_pressure_above(m->monitored_mem_pressure_cgroup_contexts, PRESSURE_DURATION_USEC, &targets);
|
||||||
|
+ r = oomd_pressure_above(m->monitored_mem_pressure_cgroup_contexts, m->default_mem_pressure_duration_usec, &targets);
|
||||||
|
if (r == -ENOMEM)
|
||||||
|
return log_error_errno(r, "Failed to check if memory pressure exceeded limits");
|
||||||
|
else if (r == 1) {
|
||||||
|
@@ -325,7 +325,7 @@ static int monitor_cgroup_contexts_handler(sd_event_source *s, uint64_t usec, vo
|
||||||
|
|
||||||
|
SET_FOREACH(t, targets) {
|
||||||
|
log_notice("Memory pressure for %s is greater than %lu for more than %"PRIu64" seconds and there was reclaim activity",
|
||||||
|
- t->path, LOAD_INT(t->mem_pressure_limit), PRESSURE_DURATION_USEC / USEC_PER_SEC);
|
||||||
|
+ t->path, LOAD_INT(t->mem_pressure_limit), m->default_mem_pressure_duration_usec / USEC_PER_SEC);
|
||||||
|
|
||||||
|
r = oomd_kill_by_pgscan(candidates, t->path, m->dry_run);
|
||||||
|
if (r == -ENOMEM)
|
||||||
|
@@ -471,7 +471,7 @@ static int manager_connect_bus(Manager *m) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int manager_start(Manager *m, bool dry_run, int swap_used_limit, int mem_pressure_limit) {
|
||||||
|
+int manager_start(Manager *m, bool dry_run, int swap_used_limit, int mem_pressure_limit, usec_t mem_pressure_usec) {
|
||||||
|
unsigned long l;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
@@ -487,6 +487,8 @@ int manager_start(Manager *m, bool dry_run, int swap_used_limit, int mem_pressur
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
+ m->default_mem_pressure_duration_usec = mem_pressure_usec ?: DEFAULT_MEM_PRESSURE_DURATION_USEC;
|
||||||
|
+
|
||||||
|
r = manager_connect_bus(m);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
@@ -505,6 +507,7 @@ int manager_start(Manager *m, bool dry_run, int swap_used_limit, int mem_pressur
|
||||||
|
int manager_get_dump_string(Manager *m, char **ret) {
|
||||||
|
_cleanup_free_ char *dump = NULL;
|
||||||
|
_cleanup_fclose_ FILE *f = NULL;
|
||||||
|
+ char buf[FORMAT_TIMESPAN_MAX];
|
||||||
|
OomdCGroupContext *c;
|
||||||
|
size_t size;
|
||||||
|
char *key;
|
||||||
|
@@ -521,10 +524,12 @@ int manager_get_dump_string(Manager *m, char **ret) {
|
||||||
|
"Dry Run: %s\n"
|
||||||
|
"Swap Used Limit: %u%%\n"
|
||||||
|
"Default Memory Pressure Limit: %lu%%\n"
|
||||||
|
+ "Default Memory Pressure Duration: %s\n"
|
||||||
|
"System Context:\n",
|
||||||
|
yes_no(m->dry_run),
|
||||||
|
m->swap_used_limit,
|
||||||
|
- LOAD_INT(m->default_mem_pressure_limit));
|
||||||
|
+ LOAD_INT(m->default_mem_pressure_limit),
|
||||||
|
+ format_timespan(buf, sizeof(buf), m->default_mem_pressure_duration_usec, USEC_PER_SEC));
|
||||||
|
oomd_dump_system_context(&m->system_context, f, "\t");
|
||||||
|
|
||||||
|
fprintf(f, "Swap Monitored CGroups:\n");
|
||||||
|
diff --git a/src/oom/oomd-manager.h b/src/oom/oomd-manager.h
|
||||||
|
index 3f3eb5aa4b6..ede9903e5a6 100644
|
||||||
|
--- a/src/oom/oomd-manager.h
|
||||||
|
+++ b/src/oom/oomd-manager.h
|
||||||
|
@@ -16,7 +16,7 @@
|
||||||
|
* percentage of time all tasks were delayed (i.e. unproductive).
|
||||||
|
* Generally 60 or higher might be acceptable for something like system.slice with no memory.high set; processes in
|
||||||
|
* system.slice are assumed to be less latency sensitive. */
|
||||||
|
-#define PRESSURE_DURATION_USEC (30 * USEC_PER_SEC)
|
||||||
|
+#define DEFAULT_MEM_PRESSURE_DURATION_USEC (30 * USEC_PER_SEC)
|
||||||
|
#define DEFAULT_MEM_PRESSURE_LIMIT 60
|
||||||
|
#define DEFAULT_SWAP_USED_LIMIT 90
|
||||||
|
|
||||||
|
@@ -33,6 +33,7 @@ struct Manager {
|
||||||
|
bool dry_run;
|
||||||
|
unsigned swap_used_limit;
|
||||||
|
loadavg_t default_mem_pressure_limit;
|
||||||
|
+ usec_t default_mem_pressure_duration_usec;
|
||||||
|
|
||||||
|
/* k: cgroup paths -> v: OomdCGroupContext
|
||||||
|
* Used to detect when to take action. */
|
||||||
|
@@ -53,7 +54,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
|
||||||
|
|
||||||
|
int manager_new(Manager **ret);
|
||||||
|
|
||||||
|
-int manager_start(Manager *m, bool dry_run, int swap_used_limit, int mem_pressure_limit);
|
||||||
|
+int manager_start(Manager *m, bool dry_run, int swap_used_limit, int mem_pressure_limit, usec_t mem_pressure_usec);
|
||||||
|
|
||||||
|
int manager_get_dump_string(Manager *m, char **ret);
|
||||||
|
|
||||||
|
diff --git a/src/oom/oomd-util.h b/src/oom/oomd-util.h
|
||||||
|
index 0834cbf09d7..d7a9890e7a2 100644
|
||||||
|
--- a/src/oom/oomd-util.h
|
||||||
|
+++ b/src/oom/oomd-util.h
|
||||||
|
@@ -31,6 +31,7 @@ struct OomdCGroupContext {
|
||||||
|
|
||||||
|
/* These are only used by oomd_pressure_above for acting on high memory pressure. */
|
||||||
|
loadavg_t mem_pressure_limit;
|
||||||
|
+ usec_t mem_pressure_duration_usec;
|
||||||
|
usec_t last_hit_mem_pressure_limit;
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/src/oom/oomd.c b/src/oom/oomd.c
|
||||||
|
index 8cf776ec0f5..1b0f8ff6c40 100644
|
||||||
|
--- a/src/oom/oomd.c
|
||||||
|
+++ b/src/oom/oomd.c
|
||||||
|
@@ -19,11 +19,13 @@
|
||||||
|
static bool arg_dry_run = false;
|
||||||
|
static int arg_swap_used_limit = -1;
|
||||||
|
static int arg_mem_pressure_limit = -1;
|
||||||
|
+static usec_t arg_mem_pressure_usec = 0;
|
||||||
|
|
||||||
|
static int parse_config(void) {
|
||||||
|
static const ConfigTableItem items[] = {
|
||||||
|
{ "OOM", "SwapUsedLimitPercent", config_parse_percent, 0, &arg_swap_used_limit },
|
||||||
|
{ "OOM", "DefaultMemoryPressureLimitPercent", config_parse_percent, 0, &arg_mem_pressure_limit },
|
||||||
|
+ { "OOM", "DefaultMemoryPressureDurationSec", config_parse_sec, 0, &arg_mem_pressure_usec },
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -160,7 +162,7 @@ static int run(int argc, char *argv[]) {
|
||||||
|
if (r < 0)
|
||||||
|
return log_error_errno(r, "Failed to create manager: %m");
|
||||||
|
|
||||||
|
- r = manager_start(m, arg_dry_run, arg_swap_used_limit, arg_mem_pressure_limit);
|
||||||
|
+ r = manager_start(m, arg_dry_run, arg_swap_used_limit, arg_mem_pressure_limit, arg_mem_pressure_usec);
|
||||||
|
if (r < 0)
|
||||||
|
return log_error_errno(r, "Failed to start up daemon: %m");
|
||||||
|
|
||||||
|
diff --git a/src/oom/oomd.conf b/src/oom/oomd.conf
|
||||||
|
index 8ac97169610..766cb1717f7 100644
|
||||||
|
--- a/src/oom/oomd.conf
|
||||||
|
+++ b/src/oom/oomd.conf
|
||||||
|
@@ -14,3 +14,4 @@
|
||||||
|
[OOM]
|
||||||
|
#SwapUsedLimitPercent=90%
|
||||||
|
#DefaultMemoryPressureLimitPercent=60%
|
||||||
|
+#DefaultMemoryPressureDurationSec=30s
|
||||||
|
diff --git a/test/units/testsuite-56.sh b/test/units/testsuite-56.sh
|
||||||
|
index 1846248855b..6e7941a57fc 100755
|
||||||
|
--- a/test/units/testsuite-56.sh
|
||||||
|
+++ b/test/units/testsuite-56.sh
|
||||||
|
@@ -14,12 +14,15 @@ if [[ "$cgroup_type" != *"cgroup2"* ]] && [[ "$cgroup_type" != *"0x63677270"* ]]
|
||||||
|
fi
|
||||||
|
[[ -e /skipped ]] && exit 0 || true
|
||||||
|
|
||||||
|
+echo "DefaultMemoryPressureDurationSec=5s" >> /etc/systemd/oomd.conf
|
||||||
|
+
|
||||||
|
systemctl start testsuite-56-testbloat.service
|
||||||
|
systemctl start testsuite-56-testchill.service
|
||||||
|
|
||||||
|
# Verify systemd-oomd is monitoring the expected units
|
||||||
|
oomctl | grep "/testsuite-56-workload.slice"
|
||||||
|
oomctl | grep "1%"
|
||||||
|
+oomctl | grep "Default Memory Pressure Duration: 5s"
|
||||||
|
|
||||||
|
# systemd-oomd watches for elevated pressure for 30 seconds before acting.
|
||||||
|
# It can take time to build up pressure so either wait 5 minutes or for the service to fail.
|
||||||
|
|
||||||
|
From 408a3bbd76326793ea5d1cf4e0a9444a4c252d86 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anita Zhang <the.anitazha@gmail.com>
|
||||||
|
Date: Sat, 23 Jan 2021 22:10:42 -0800
|
||||||
|
Subject: [PATCH 2/4] oom: make swap a soft requirement
|
||||||
|
|
||||||
|
---
|
||||||
|
man/systemd-oomd.service.xml | 4 ++--
|
||||||
|
src/oom/oomd-manager.c | 8 ++++++--
|
||||||
|
src/oom/oomd.c | 6 ++----
|
||||||
|
src/oom/test-oomd-util.c | 11 +++++++++++
|
||||||
|
4 files changed, 21 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/man/systemd-oomd.service.xml b/man/systemd-oomd.service.xml
|
||||||
|
index 9cb9c6076a9..ebd2467ee23 100644
|
||||||
|
--- a/man/systemd-oomd.service.xml
|
||||||
|
+++ b/man/systemd-oomd.service.xml
|
||||||
|
@@ -56,8 +56,8 @@
|
||||||
|
|
||||||
|
<para>You will need a kernel compiled with PSI support. This is available in Linux 4.20 and above.</para>
|
||||||
|
|
||||||
|
- <para>The system must also have swap enabled for <command>systemd-oomd</command> to function correctly. With swap
|
||||||
|
- enabled, the system spends enough time swapping pages to let <command>systemd-oomd</command> react.
|
||||||
|
+ <para>It is highly recommended for the system to have swap enabled for <command>systemd-oomd</command> to function
|
||||||
|
+ optimally. With swap enabled, the system spends enough time swapping pages to let <command>systemd-oomd</command> react.
|
||||||
|
Without swap, the system enters a livelocked state much more quickly and may prevent <command>systemd-oomd</command>
|
||||||
|
from responding in a reasonable amount of time. See
|
||||||
|
<ulink url="https://chrisdown.name/2018/01/02/in-defence-of-swap.html">"In defence of swap: common misconceptions"</ulink>
|
||||||
|
diff --git a/src/oom/oomd-manager.c b/src/oom/oomd-manager.c
|
||||||
|
index e8ed6a52739..814fda51f31 100644
|
||||||
|
--- a/src/oom/oomd-manager.c
|
||||||
|
+++ b/src/oom/oomd-manager.c
|
||||||
|
@@ -6,6 +6,7 @@
|
||||||
|
#include "cgroup-util.h"
|
||||||
|
#include "fd-util.h"
|
||||||
|
#include "fileio.h"
|
||||||
|
+#include "memory-util.h"
|
||||||
|
#include "oomd-manager-bus.h"
|
||||||
|
#include "oomd-manager.h"
|
||||||
|
#include "path-util.h"
|
||||||
|
@@ -294,9 +295,12 @@ static int monitor_cgroup_contexts_handler(sd_event_source *s, uint64_t usec, vo
|
||||||
|
return log_error_errno(r, "Failed to update monitored memory pressure cgroup contexts");
|
||||||
|
|
||||||
|
r = oomd_system_context_acquire("/proc/swaps", &m->system_context);
|
||||||
|
- /* If there aren't units depending on swap actions, the only error we exit on is ENOMEM */
|
||||||
|
- if (r == -ENOMEM || (r < 0 && !hashmap_isempty(m->monitored_swap_cgroup_contexts)))
|
||||||
|
+ /* If there aren't units depending on swap actions, the only error we exit on is ENOMEM.
|
||||||
|
+ * Allow ENOENT in the event that swap is disabled on the system. */
|
||||||
|
+ if (r == -ENOMEM || (r < 0 && r != -ENOENT && !hashmap_isempty(m->monitored_swap_cgroup_contexts)))
|
||||||
|
return log_error_errno(r, "Failed to acquire system context");
|
||||||
|
+ else if (r == -ENOENT)
|
||||||
|
+ zero(m->system_context);
|
||||||
|
|
||||||
|
/* If we're still recovering from a kill, don't try to kill again yet */
|
||||||
|
if (m->post_action_delay_start > 0) {
|
||||||
|
diff --git a/src/oom/oomd.c b/src/oom/oomd.c
|
||||||
|
index 1b0f8ff6c40..1fbcf41492d 100644
|
||||||
|
--- a/src/oom/oomd.c
|
||||||
|
+++ b/src/oom/oomd.c
|
||||||
|
@@ -142,10 +142,8 @@ static int run(int argc, char *argv[]) {
|
||||||
|
return log_error_errno(r, "Failed to get SwapTotal from /proc/meminfo: %m");
|
||||||
|
|
||||||
|
r = safe_atollu(swap, &s);
|
||||||
|
- if (r < 0)
|
||||||
|
- return log_error_errno(r, "Failed to parse SwapTotal from /proc/meminfo: %s: %m", swap);
|
||||||
|
- if (s == 0)
|
||||||
|
- return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Requires swap to operate");
|
||||||
|
+ if (r < 0 || s == 0)
|
||||||
|
+ log_warning("Swap is currently not detected; memory pressure usage will be degraded");
|
||||||
|
|
||||||
|
if (!is_pressure_supported())
|
||||||
|
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Pressure Stall Information (PSI) is not supported");
|
||||||
|
diff --git a/src/oom/test-oomd-util.c b/src/oom/test-oomd-util.c
|
||||||
|
index 8143408902b..54fe2a03d14 100644
|
||||||
|
--- a/src/oom/test-oomd-util.c
|
||||||
|
+++ b/src/oom/test-oomd-util.c
|
||||||
|
@@ -159,6 +159,11 @@ static void test_oomd_system_context_acquire(void) {
|
||||||
|
assert_se(ctx.swap_total == 0);
|
||||||
|
assert_se(ctx.swap_used == 0);
|
||||||
|
|
||||||
|
+ assert_se(write_string_file(path, "Filename Type Size Used Priority", WRITE_STRING_FILE_CREATE) == 0);
|
||||||
|
+ assert_se(oomd_system_context_acquire(path, &ctx) == 0);
|
||||||
|
+ assert_se(ctx.swap_total == 0);
|
||||||
|
+ assert_se(ctx.swap_used == 0);
|
||||||
|
+
|
||||||
|
assert_se(write_string_file(path, "Filename Type Size Used Priority\n"
|
||||||
|
"/swapvol/swapfile file 18971644 0 -3\n"
|
||||||
|
"/dev/vda2 partition 1999868 993780 -2", WRITE_STRING_FILE_CREATE) == 0);
|
||||||
|
@@ -268,6 +273,12 @@ static void test_oomd_swap_free_below(void) {
|
||||||
|
.swap_used = 3310136 * 1024U,
|
||||||
|
};
|
||||||
|
assert_se(oomd_swap_free_below(&ctx, 20) == false);
|
||||||
|
+
|
||||||
|
+ ctx = (OomdSystemContext) {
|
||||||
|
+ .swap_total = 0,
|
||||||
|
+ .swap_used = 0,
|
||||||
|
+ };
|
||||||
|
+ assert_se(oomd_swap_free_below(&ctx, 20) == false);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_oomd_sort_cgroups(void) {
|
||||||
|
|
||||||
|
From 924c89e9fe95d47b6ad94544bfdd5f087646daea Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anita Zhang <the.anitazha@gmail.com>
|
||||||
|
Date: Sun, 24 Jan 2021 01:22:51 -0800
|
||||||
|
Subject: [PATCH 3/4] oom: fix reclaim activity detection
|
||||||
|
|
||||||
|
This should have been checking for any reclaim activity within a larger interval
|
||||||
|
of time rather than within the past second. On systems with swap this
|
||||||
|
doesn't seem to have mattered too much as reclaim would always increase when
|
||||||
|
memory pressure was elevated. But testing in the no swap case having
|
||||||
|
this larger interval made a difference between oomd killing or not.
|
||||||
|
---
|
||||||
|
src/oom/oomd-manager.c | 7 +++++--
|
||||||
|
src/oom/oomd-manager.h | 2 ++
|
||||||
|
2 files changed, 7 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/oom/oomd-manager.c b/src/oom/oomd-manager.c
|
||||||
|
index 814fda51f31..3efa629002e 100644
|
||||||
|
--- a/src/oom/oomd-manager.c
|
||||||
|
+++ b/src/oom/oomd-manager.c
|
||||||
|
@@ -302,6 +302,9 @@ static int monitor_cgroup_contexts_handler(sd_event_source *s, uint64_t usec, vo
|
||||||
|
else if (r == -ENOENT)
|
||||||
|
zero(m->system_context);
|
||||||
|
|
||||||
|
+ if (oomd_memory_reclaim(m->monitored_mem_pressure_cgroup_contexts))
|
||||||
|
+ m->last_reclaim_at = usec_now;
|
||||||
|
+
|
||||||
|
/* If we're still recovering from a kill, don't try to kill again yet */
|
||||||
|
if (m->post_action_delay_start > 0) {
|
||||||
|
if (m->post_action_delay_start + POST_ACTION_DELAY_USEC > usec_now)
|
||||||
|
@@ -314,12 +317,12 @@ static int monitor_cgroup_contexts_handler(sd_event_source *s, uint64_t usec, vo
|
||||||
|
if (r == -ENOMEM)
|
||||||
|
return log_error_errno(r, "Failed to check if memory pressure exceeded limits");
|
||||||
|
else if (r == 1) {
|
||||||
|
- /* Check if there was reclaim activity in the last interval. The concern is the following case:
|
||||||
|
+ /* Check if there was reclaim activity in the given interval. The concern is the following case:
|
||||||
|
* Pressure climbed, a lot of high-frequency pages were reclaimed, and we killed the offending
|
||||||
|
* cgroup. Even after this, well-behaved processes will fault in recently resident pages and
|
||||||
|
* this will cause pressure to remain high. Thus if there isn't any reclaim pressure, no need
|
||||||
|
* to kill something (it won't help anyways). */
|
||||||
|
- if (oomd_memory_reclaim(m->monitored_mem_pressure_cgroup_contexts)) {
|
||||||
|
+ if ((usec_now - m->last_reclaim_at) <= RECLAIM_DURATION_USEC) {
|
||||||
|
_cleanup_hashmap_free_ Hashmap *candidates = NULL;
|
||||||
|
OomdCGroupContext *t;
|
||||||
|
|
||||||
|
diff --git a/src/oom/oomd-manager.h b/src/oom/oomd-manager.h
|
||||||
|
index ede9903e5a6..ee17abced26 100644
|
||||||
|
--- a/src/oom/oomd-manager.h
|
||||||
|
+++ b/src/oom/oomd-manager.h
|
||||||
|
@@ -20,6 +20,7 @@
|
||||||
|
#define DEFAULT_MEM_PRESSURE_LIMIT 60
|
||||||
|
#define DEFAULT_SWAP_USED_LIMIT 90
|
||||||
|
|
||||||
|
+#define RECLAIM_DURATION_USEC (30 * USEC_PER_SEC)
|
||||||
|
#define POST_ACTION_DELAY_USEC (15 * USEC_PER_SEC)
|
||||||
|
|
||||||
|
typedef struct Manager Manager;
|
||||||
|
@@ -42,6 +43,7 @@ struct Manager {
|
||||||
|
|
||||||
|
OomdSystemContext system_context;
|
||||||
|
|
||||||
|
+ usec_t last_reclaim_at;
|
||||||
|
usec_t post_action_delay_start;
|
||||||
|
|
||||||
|
sd_event_source *cgroup_context_event_source;
|
||||||
|
|
||||||
|
From 2e744a2cd89fc0ea67cf78cfba617b5105a26215 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anita Zhang <the.anitazha@gmail.com>
|
||||||
|
Date: Sun, 24 Jan 2021 01:34:23 -0800
|
||||||
|
Subject: [PATCH 4/4] oom: update extended test to remove swap gating
|
||||||
|
|
||||||
|
---
|
||||||
|
test/units/testsuite-56.sh | 3 +--
|
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/test/units/testsuite-56.sh b/test/units/testsuite-56.sh
|
||||||
|
index 6e7941a57fc..4dc9d8c7a86 100755
|
||||||
|
--- a/test/units/testsuite-56.sh
|
||||||
|
+++ b/test/units/testsuite-56.sh
|
||||||
|
@@ -6,7 +6,6 @@ systemd-analyze log-level debug
|
||||||
|
systemd-analyze log-target console
|
||||||
|
|
||||||
|
# Loose checks to ensure the environment has the necessary features for systemd-oomd
|
||||||
|
-[[ "$( awk '/SwapTotal/ { print $2 }' /proc/meminfo )" != "0" ]] || echo "no swap" >> /skipped
|
||||||
|
[[ -e /proc/pressure ]] || echo "no PSI" >> /skipped
|
||||||
|
cgroup_type=$(stat -fc %T /sys/fs/cgroup/)
|
||||||
|
if [[ "$cgroup_type" != *"cgroup2"* ]] && [[ "$cgroup_type" != *"0x63677270"* ]]; then
|
||||||
|
@@ -16,8 +15,8 @@ fi
|
||||||
|
|
||||||
|
echo "DefaultMemoryPressureDurationSec=5s" >> /etc/systemd/oomd.conf
|
||||||
|
|
||||||
|
-systemctl start testsuite-56-testbloat.service
|
||||||
|
systemctl start testsuite-56-testchill.service
|
||||||
|
+systemctl start testsuite-56-testbloat.service
|
||||||
|
|
||||||
|
# Verify systemd-oomd is monitoring the expected units
|
||||||
|
oomctl | grep "/testsuite-56-workload.slice"
|
1201
18401.patch
Normal file
1201
18401.patch
Normal file
File diff suppressed because it is too large
Load Diff
987
18444.patch
Normal file
987
18444.patch
Normal file
@ -0,0 +1,987 @@
|
|||||||
|
From a9b1927c15fce3c9945ac249d8e8ddc42028a057 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anita Zhang <the.anitazha@gmail.com>
|
||||||
|
Date: Tue, 2 Feb 2021 01:47:08 -0800
|
||||||
|
Subject: [PATCH 1/2] parse-util: add permyriad parsing
|
||||||
|
|
||||||
|
---
|
||||||
|
src/basic/parse-util.c | 137 ++++++++++++++++++++++++++-----------
|
||||||
|
src/basic/parse-util.h | 3 +
|
||||||
|
src/test/test-parse-util.c | 68 ++++++++++++++++++
|
||||||
|
3 files changed, 169 insertions(+), 39 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/basic/parse-util.c b/src/basic/parse-util.c
|
||||||
|
index 5d4dafe3a5..a0fb2c9d17 100644
|
||||||
|
--- a/src/basic/parse-util.c
|
||||||
|
+++ b/src/basic/parse-util.c
|
||||||
|
@@ -671,11 +671,11 @@ int parse_fractional_part_u(const char **p, size_t digits, unsigned *res) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int parse_percent_unbounded(const char *p) {
|
||||||
|
+static int parse_parts_value_whole(const char *p, const char *symbol) {
|
||||||
|
const char *pc, *n;
|
||||||
|
int r, v;
|
||||||
|
|
||||||
|
- pc = endswith(p, "%");
|
||||||
|
+ pc = endswith(p, symbol);
|
||||||
|
if (!pc)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
@@ -689,6 +689,74 @@ int parse_percent_unbounded(const char *p) {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int parse_parts_value_with_tenths_place(const char *p, const char *symbol) {
|
||||||
|
+ const char *pc, *dot, *n;
|
||||||
|
+ int r, q, v;
|
||||||
|
+
|
||||||
|
+ pc = endswith(p, symbol);
|
||||||
|
+ if (!pc)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ dot = memchr(p, '.', pc - p);
|
||||||
|
+ if (dot) {
|
||||||
|
+ if (dot + 2 != pc)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ if (dot[1] < '0' || dot[1] > '9')
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ q = dot[1] - '0';
|
||||||
|
+ n = strndupa(p, dot - p);
|
||||||
|
+ } else {
|
||||||
|
+ q = 0;
|
||||||
|
+ n = strndupa(p, pc - p);
|
||||||
|
+ }
|
||||||
|
+ r = safe_atoi(n, &v);
|
||||||
|
+ if (r < 0)
|
||||||
|
+ return r;
|
||||||
|
+ if (v < 0)
|
||||||
|
+ return -ERANGE;
|
||||||
|
+ if (v > (INT_MAX - q) / 10)
|
||||||
|
+ return -ERANGE;
|
||||||
|
+
|
||||||
|
+ v = v * 10 + q;
|
||||||
|
+ return v;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int parse_parts_value_with_hundredths_place(const char *p, const char *symbol) {
|
||||||
|
+ const char *pc, *dot, *n;
|
||||||
|
+ int r, q, v;
|
||||||
|
+
|
||||||
|
+ pc = endswith(p, symbol);
|
||||||
|
+ if (!pc)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ dot = memchr(p, '.', pc - p);
|
||||||
|
+ if (dot) {
|
||||||
|
+ if (dot + 3 != pc)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ if (dot[1] < '0' || dot[1] > '9' || dot[2] < '0' || dot[2] > '9')
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ q = (dot[1] - '0') * 10 + (dot[2] - '0');
|
||||||
|
+ n = strndupa(p, dot - p);
|
||||||
|
+ } else {
|
||||||
|
+ q = 0;
|
||||||
|
+ n = strndupa(p, pc - p);
|
||||||
|
+ }
|
||||||
|
+ r = safe_atoi(n, &v);
|
||||||
|
+ if (r < 0)
|
||||||
|
+ return r;
|
||||||
|
+ if (v < 0)
|
||||||
|
+ return -ERANGE;
|
||||||
|
+ if (v > (INT_MAX - q) / 100)
|
||||||
|
+ return -ERANGE;
|
||||||
|
+
|
||||||
|
+ v = v * 100 + q;
|
||||||
|
+ return v;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int parse_percent_unbounded(const char *p) {
|
||||||
|
+ return parse_parts_value_whole(p, "%");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int parse_percent(const char *p) {
|
||||||
|
int v;
|
||||||
|
|
||||||
|
@@ -700,46 +768,13 @@ int parse_percent(const char *p) {
|
||||||
|
}
|
||||||
|
|
||||||
|
int parse_permille_unbounded(const char *p) {
|
||||||
|
- const char *pc, *pm, *dot, *n;
|
||||||
|
- int r, q, v;
|
||||||
|
+ const char *pm;
|
||||||
|
|
||||||
|
pm = endswith(p, "‰");
|
||||||
|
- if (pm) {
|
||||||
|
- n = strndupa(p, pm - p);
|
||||||
|
- r = safe_atoi(n, &v);
|
||||||
|
- if (r < 0)
|
||||||
|
- return r;
|
||||||
|
- if (v < 0)
|
||||||
|
- return -ERANGE;
|
||||||
|
- } else {
|
||||||
|
- pc = endswith(p, "%");
|
||||||
|
- if (!pc)
|
||||||
|
- return -EINVAL;
|
||||||
|
-
|
||||||
|
- dot = memchr(p, '.', pc - p);
|
||||||
|
- if (dot) {
|
||||||
|
- if (dot + 2 != pc)
|
||||||
|
- return -EINVAL;
|
||||||
|
- if (dot[1] < '0' || dot[1] > '9')
|
||||||
|
- return -EINVAL;
|
||||||
|
- q = dot[1] - '0';
|
||||||
|
- n = strndupa(p, dot - p);
|
||||||
|
- } else {
|
||||||
|
- q = 0;
|
||||||
|
- n = strndupa(p, pc - p);
|
||||||
|
- }
|
||||||
|
- r = safe_atoi(n, &v);
|
||||||
|
- if (r < 0)
|
||||||
|
- return r;
|
||||||
|
- if (v < 0)
|
||||||
|
- return -ERANGE;
|
||||||
|
- if (v > (INT_MAX - q) / 10)
|
||||||
|
- return -ERANGE;
|
||||||
|
+ if (pm)
|
||||||
|
+ return parse_parts_value_whole(p, "‰");
|
||||||
|
|
||||||
|
- v = v * 10 + q;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- return v;
|
||||||
|
+ return parse_parts_value_with_tenths_place(p, "%");
|
||||||
|
}
|
||||||
|
|
||||||
|
int parse_permille(const char *p) {
|
||||||
|
@@ -752,6 +787,30 @@ int parse_permille(const char *p) {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int parse_permyriad_unbounded(const char *p) {
|
||||||
|
+ const char *pm;
|
||||||
|
+
|
||||||
|
+ pm = endswith(p, "‱");
|
||||||
|
+ if (pm)
|
||||||
|
+ return parse_parts_value_whole(p, "‱");
|
||||||
|
+
|
||||||
|
+ pm = endswith(p, "‰");
|
||||||
|
+ if (pm)
|
||||||
|
+ return parse_parts_value_with_tenths_place(p, "‰");
|
||||||
|
+
|
||||||
|
+ return parse_parts_value_with_hundredths_place(p, "%");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int parse_permyriad(const char *p) {
|
||||||
|
+ int v;
|
||||||
|
+
|
||||||
|
+ v = parse_permyriad_unbounded(p);
|
||||||
|
+ if (v > 10000)
|
||||||
|
+ return -ERANGE;
|
||||||
|
+
|
||||||
|
+ return v;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int parse_nice(const char *p, int *ret) {
|
||||||
|
int n, r;
|
||||||
|
|
||||||
|
diff --git a/src/basic/parse-util.h b/src/basic/parse-util.h
|
||||||
|
index 81478ed059..3e29291f26 100644
|
||||||
|
--- a/src/basic/parse-util.h
|
||||||
|
+++ b/src/basic/parse-util.h
|
||||||
|
@@ -136,6 +136,9 @@ int parse_percent(const char *p);
|
||||||
|
int parse_permille_unbounded(const char *p);
|
||||||
|
int parse_permille(const char *p);
|
||||||
|
|
||||||
|
+int parse_permyriad_unbounded(const char *p);
|
||||||
|
+int parse_permyriad(const char *p);
|
||||||
|
+
|
||||||
|
int parse_nice(const char *p, int *ret);
|
||||||
|
|
||||||
|
int parse_ip_port(const char *s, uint16_t *ret);
|
||||||
|
diff --git a/src/test/test-parse-util.c b/src/test/test-parse-util.c
|
||||||
|
index 1c969091ef..6e23efe134 100644
|
||||||
|
--- a/src/test/test-parse-util.c
|
||||||
|
+++ b/src/test/test-parse-util.c
|
||||||
|
@@ -790,6 +790,72 @@ static void test_parse_permille_unbounded(void) {
|
||||||
|
assert_se(parse_permille_unbounded("429496729.6%") == -ERANGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void test_parse_permyriad(void) {
|
||||||
|
+ assert_se(parse_permyriad("") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("foo") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("0") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("50") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("100") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("-1") == -EINVAL);
|
||||||
|
+
|
||||||
|
+ assert_se(parse_permyriad("0‱") == 0);
|
||||||
|
+ assert_se(parse_permyriad("555‱") == 555);
|
||||||
|
+ assert_se(parse_permyriad("1000‱") == 1000);
|
||||||
|
+ assert_se(parse_permyriad("-7‱") == -ERANGE);
|
||||||
|
+ assert_se(parse_permyriad("10007‱") == -ERANGE);
|
||||||
|
+ assert_se(parse_permyriad("‱") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("‱‱") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("‱1") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("1‱‱") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("3.2‱") == -EINVAL);
|
||||||
|
+
|
||||||
|
+ assert_se(parse_permyriad("0‰") == 0);
|
||||||
|
+ assert_se(parse_permyriad("555.5‰") == 5555);
|
||||||
|
+ assert_se(parse_permyriad("1000.0‰") == 10000);
|
||||||
|
+ assert_se(parse_permyriad("-7‰") == -ERANGE);
|
||||||
|
+ assert_se(parse_permyriad("1007‰") == -ERANGE);
|
||||||
|
+ assert_se(parse_permyriad("‰") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("‰‰") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("‰1") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("1‰‰") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("3.22‰") == -EINVAL);
|
||||||
|
+
|
||||||
|
+ assert_se(parse_permyriad("0%") == 0);
|
||||||
|
+ assert_se(parse_permyriad("55%") == 5500);
|
||||||
|
+ assert_se(parse_permyriad("55.53%") == 5553);
|
||||||
|
+ assert_se(parse_permyriad("100%") == 10000);
|
||||||
|
+ assert_se(parse_permyriad("-7%") == -ERANGE);
|
||||||
|
+ assert_se(parse_permyriad("107%") == -ERANGE);
|
||||||
|
+ assert_se(parse_permyriad("%") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("%%") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("%1") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("1%%") == -EINVAL);
|
||||||
|
+ assert_se(parse_permyriad("3.212%") == -EINVAL);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void test_parse_permyriad_unbounded(void) {
|
||||||
|
+ assert_se(parse_permyriad_unbounded("1001‱") == 1001);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("4000‱") == 4000);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("2147483647‱") == 2147483647);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("2147483648‱") == -ERANGE);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("4294967295‱") == -ERANGE);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("4294967296‱") == -ERANGE);
|
||||||
|
+
|
||||||
|
+ assert_se(parse_permyriad_unbounded("101‰") == 1010);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("400‰") == 4000);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("214748364.7‰") == 2147483647);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("214748364.8‰") == -ERANGE);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("429496729.5‰") == -ERANGE);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("429496729.6‰") == -ERANGE);
|
||||||
|
+
|
||||||
|
+ assert_se(parse_permyriad_unbounded("99%") == 9900);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("40%") == 4000);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("21474836.47%") == 2147483647);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("21474836.48%") == -ERANGE);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("42949672.95%") == -ERANGE);
|
||||||
|
+ assert_se(parse_permyriad_unbounded("42949672.96%") == -ERANGE);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void test_parse_nice(void) {
|
||||||
|
int n;
|
||||||
|
|
||||||
|
@@ -987,6 +1053,8 @@ int main(int argc, char *argv[]) {
|
||||||
|
test_parse_percent_unbounded();
|
||||||
|
test_parse_permille();
|
||||||
|
test_parse_permille_unbounded();
|
||||||
|
+ test_parse_permyriad();
|
||||||
|
+ test_parse_permyriad_unbounded();
|
||||||
|
test_parse_nice();
|
||||||
|
test_parse_dev();
|
||||||
|
test_parse_errno();
|
||||||
|
--
|
||||||
|
2.29.2
|
||||||
|
|
||||||
|
|
||||||
|
From 5fdc5d3384f81888704a0a19db3cb33bce2d8bdb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anita Zhang <the.anitazha@gmail.com>
|
||||||
|
Date: Tue, 2 Feb 2021 14:16:03 -0800
|
||||||
|
Subject: [PATCH 2/2] oom: rework *MemoryPressureLimit= properties to have
|
||||||
|
1/10000 precision
|
||||||
|
|
||||||
|
Requested in
|
||||||
|
https://github.com/systemd/systemd/pull/15206#discussion_r505506657,
|
||||||
|
preserve the full granularity for memory pressure limits (permyriad)
|
||||||
|
instead of capping out at percent.
|
||||||
|
---
|
||||||
|
docs/TRANSIENT-SETTINGS.md | 2 +-
|
||||||
|
man/oomd.conf.xml | 6 ++---
|
||||||
|
man/org.freedesktop.systemd1.xml | 36 +++++++++++++-------------
|
||||||
|
man/systemd.resource-control.xml | 2 +-
|
||||||
|
src/core/cgroup.c | 4 +--
|
||||||
|
src/core/cgroup.h | 2 +-
|
||||||
|
src/core/core-varlink.c | 2 +-
|
||||||
|
src/core/dbus-cgroup.c | 16 +++++++++---
|
||||||
|
src/core/dbus-util.c | 29 ---------------------
|
||||||
|
src/core/dbus-util.h | 1 -
|
||||||
|
src/core/load-fragment-gperf.gperf.m4 | 2 +-
|
||||||
|
src/core/load-fragment.c | 6 ++---
|
||||||
|
src/oom/oomd-manager.c | 24 +++++++++++------
|
||||||
|
src/oom/oomd-manager.h | 4 +--
|
||||||
|
src/oom/oomd-util.c | 4 +--
|
||||||
|
src/oom/oomd.c | 10 +++----
|
||||||
|
src/oom/oomd.conf | 2 +-
|
||||||
|
src/shared/bus-get-properties.c | 17 ------------
|
||||||
|
src/shared/bus-get-properties.h | 1 -
|
||||||
|
src/shared/bus-unit-util.c | 19 ++++++++++++--
|
||||||
|
src/shared/conf-parser.c | 1 +
|
||||||
|
src/shared/conf-parser.h | 1 +
|
||||||
|
test/units/testsuite-56-workload.slice | 2 +-
|
||||||
|
test/units/testsuite-56.sh | 2 +-
|
||||||
|
24 files changed, 91 insertions(+), 104 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/docs/TRANSIENT-SETTINGS.md b/docs/TRANSIENT-SETTINGS.md
|
||||||
|
index 50b9a42fa1..5037060254 100644
|
||||||
|
--- a/docs/TRANSIENT-SETTINGS.md
|
||||||
|
+++ b/docs/TRANSIENT-SETTINGS.md
|
||||||
|
@@ -272,7 +272,7 @@ All cgroup/resource control settings are available for transient units
|
||||||
|
✓ IPAddressDeny=
|
||||||
|
✓ ManagedOOMSwap=
|
||||||
|
✓ ManagedOOMMemoryPressure=
|
||||||
|
-✓ ManagedOOMMemoryPressureLimitPercent=
|
||||||
|
+✓ ManagedOOMMemoryPressureLimit=
|
||||||
|
```
|
||||||
|
|
||||||
|
## Process Killing Settings
|
||||||
|
diff --git a/man/oomd.conf.xml b/man/oomd.conf.xml
|
||||||
|
index bb5da87c54..2a12be8cad 100644
|
||||||
|
--- a/man/oomd.conf.xml
|
||||||
|
+++ b/man/oomd.conf.xml
|
||||||
|
@@ -59,10 +59,10 @@
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
- <term><varname>DefaultMemoryPressureLimitPercent=</varname></term>
|
||||||
|
+ <term><varname>DefaultMemoryPressureLimit=</varname></term>
|
||||||
|
|
||||||
|
<listitem><para>Sets the limit for memory pressure on the unit's cgroup before <command>systemd-oomd</command>
|
||||||
|
- will take action. A unit can override this value with <varname>ManagedOOMMemoryPressureLimitPercent=</varname>.
|
||||||
|
+ will take action. A unit can override this value with <varname>ManagedOOMMemoryPressureLimit=</varname>.
|
||||||
|
The memory pressure for this property represents the fraction of time in a 10 second window in which all tasks
|
||||||
|
in the cgroup were delayed. For each monitored cgroup, if the memory pressure on that cgroup exceeds the
|
||||||
|
limit set for longer than the duration set by <varname>DefaultMemoryPressureDurationSec=</varname>,
|
||||||
|
@@ -78,7 +78,7 @@
|
||||||
|
|
||||||
|
<listitem><para>Sets the amount of time a unit's cgroup needs to have exceeded memory pressure limits before
|
||||||
|
<command>systemd-oomd</command> will take action. Memory pressure limits are defined by
|
||||||
|
- <varname>DefaultMemoryPressureLimitPercent=</varname> and <varname>ManagedOOMMemoryPressureLimitPercent=</varname>.
|
||||||
|
+ <varname>DefaultMemoryPressureLimit=</varname> and <varname>ManagedOOMMemoryPressureLimit=</varname>.
|
||||||
|
Defaults to 30 seconds when this property is unset or set to 0.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
diff --git a/man/org.freedesktop.systemd1.xml b/man/org.freedesktop.systemd1.xml
|
||||||
|
index 78fd0b3378..7809b65062 100644
|
||||||
|
--- a/man/org.freedesktop.systemd1.xml
|
||||||
|
+++ b/man/org.freedesktop.systemd1.xml
|
||||||
|
@@ -2419,7 +2419,7 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
||||||
|
readonly s ManagedOOMMemoryPressure = '...';
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
||||||
|
- readonly s ManagedOOMMemoryPressureLimitPercent = '...';
|
||||||
|
+ readonly u ManagedOOMMemoryPressureLimitPermyriad = ...;
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
|
readonly as Environment = ['...', ...];
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
|
@@ -2938,7 +2938,7 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
||||||
|
|
||||||
|
<!--property ManagedOOMMemoryPressure is not documented!-->
|
||||||
|
|
||||||
|
- <!--property ManagedOOMMemoryPressureLimitPercent is not documented!-->
|
||||||
|
+ <!--property ManagedOOMMemoryPressureLimitPermyriad is not documented!-->
|
||||||
|
|
||||||
|
<!--property EnvironmentFiles is not documented!-->
|
||||||
|
|
||||||
|
@@ -3494,7 +3494,7 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressure"/>
|
||||||
|
|
||||||
|
- <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPercent"/>
|
||||||
|
+ <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPermyriad"/>
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="Environment"/>
|
||||||
|
|
||||||
|
@@ -4146,7 +4146,7 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
||||||
|
readonly s ManagedOOMMemoryPressure = '...';
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
||||||
|
- readonly s ManagedOOMMemoryPressureLimitPercent = '...';
|
||||||
|
+ readonly u ManagedOOMMemoryPressureLimitPermyriad = ...;
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
|
readonly as Environment = ['...', ...];
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
|
@@ -4693,7 +4693,7 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
|
||||||
|
|
||||||
|
<!--property ManagedOOMMemoryPressure is not documented!-->
|
||||||
|
|
||||||
|
- <!--property ManagedOOMMemoryPressureLimitPercent is not documented!-->
|
||||||
|
+ <!--property ManagedOOMMemoryPressureLimitPermyriad is not documented!-->
|
||||||
|
|
||||||
|
<!--property EnvironmentFiles is not documented!-->
|
||||||
|
|
||||||
|
@@ -5251,7 +5251,7 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressure"/>
|
||||||
|
|
||||||
|
- <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPercent"/>
|
||||||
|
+ <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPermyriad"/>
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="Environment"/>
|
||||||
|
|
||||||
|
@@ -5827,7 +5827,7 @@ node /org/freedesktop/systemd1/unit/home_2emount {
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
||||||
|
readonly s ManagedOOMMemoryPressure = '...';
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
||||||
|
- readonly s ManagedOOMMemoryPressureLimitPercent = '...';
|
||||||
|
+ readonly u ManagedOOMMemoryPressureLimitPermyriad = ...;
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
|
readonly as Environment = ['...', ...];
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
|
@@ -6302,7 +6302,7 @@ node /org/freedesktop/systemd1/unit/home_2emount {
|
||||||
|
|
||||||
|
<!--property ManagedOOMMemoryPressure is not documented!-->
|
||||||
|
|
||||||
|
- <!--property ManagedOOMMemoryPressureLimitPercent is not documented!-->
|
||||||
|
+ <!--property ManagedOOMMemoryPressureLimitPermyriad is not documented!-->
|
||||||
|
|
||||||
|
<!--property EnvironmentFiles is not documented!-->
|
||||||
|
|
||||||
|
@@ -6778,7 +6778,7 @@ node /org/freedesktop/systemd1/unit/home_2emount {
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressure"/>
|
||||||
|
|
||||||
|
- <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPercent"/>
|
||||||
|
+ <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPermyriad"/>
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="Environment"/>
|
||||||
|
|
||||||
|
@@ -7475,7 +7475,7 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
||||||
|
readonly s ManagedOOMMemoryPressure = '...';
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
||||||
|
- readonly s ManagedOOMMemoryPressureLimitPercent = '...';
|
||||||
|
+ readonly u ManagedOOMMemoryPressureLimitPermyriad = ...;
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
|
readonly as Environment = ['...', ...];
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
|
@@ -7936,7 +7936,7 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
|
||||||
|
|
||||||
|
<!--property ManagedOOMMemoryPressure is not documented!-->
|
||||||
|
|
||||||
|
- <!--property ManagedOOMMemoryPressureLimitPercent is not documented!-->
|
||||||
|
+ <!--property ManagedOOMMemoryPressureLimitPermyriad is not documented!-->
|
||||||
|
|
||||||
|
<!--property EnvironmentFiles is not documented!-->
|
||||||
|
|
||||||
|
@@ -8398,7 +8398,7 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressure"/>
|
||||||
|
|
||||||
|
- <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPercent"/>
|
||||||
|
+ <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPermyriad"/>
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="Environment"/>
|
||||||
|
|
||||||
|
@@ -8948,7 +8948,7 @@ node /org/freedesktop/systemd1/unit/system_2eslice {
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
||||||
|
readonly s ManagedOOMMemoryPressure = '...';
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
||||||
|
- readonly s ManagedOOMMemoryPressureLimitPercent = '...';
|
||||||
|
+ readonly u ManagedOOMMemoryPressureLimitPermyriad = ...;
|
||||||
|
};
|
||||||
|
interface org.freedesktop.DBus.Peer { ... };
|
||||||
|
interface org.freedesktop.DBus.Introspectable { ... };
|
||||||
|
@@ -9083,7 +9083,7 @@ node /org/freedesktop/systemd1/unit/system_2eslice {
|
||||||
|
|
||||||
|
<!--property ManagedOOMMemoryPressure is not documented!-->
|
||||||
|
|
||||||
|
- <!--property ManagedOOMMemoryPressureLimitPercent is not documented!-->
|
||||||
|
+ <!--property ManagedOOMMemoryPressureLimitPermyriad is not documented!-->
|
||||||
|
|
||||||
|
<!--Autogenerated cross-references for systemd.directives, do not edit-->
|
||||||
|
|
||||||
|
@@ -9223,7 +9223,7 @@ node /org/freedesktop/systemd1/unit/system_2eslice {
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressure"/>
|
||||||
|
|
||||||
|
- <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPercent"/>
|
||||||
|
+ <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPermyriad"/>
|
||||||
|
|
||||||
|
<!--End of Autogenerated section-->
|
||||||
|
|
||||||
|
@@ -9383,7 +9383,7 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope {
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
||||||
|
readonly s ManagedOOMMemoryPressure = '...';
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
||||||
|
- readonly s ManagedOOMMemoryPressureLimitPercent = '...';
|
||||||
|
+ readonly u ManagedOOMMemoryPressureLimitPermyriad = ...;
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
|
readonly s KillMode = '...';
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
|
@@ -9534,7 +9534,7 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope {
|
||||||
|
|
||||||
|
<!--property ManagedOOMMemoryPressure is not documented!-->
|
||||||
|
|
||||||
|
- <!--property ManagedOOMMemoryPressureLimitPercent is not documented!-->
|
||||||
|
+ <!--property ManagedOOMMemoryPressureLimitPermyriad is not documented!-->
|
||||||
|
|
||||||
|
<!--property KillMode is not documented!-->
|
||||||
|
|
||||||
|
@@ -9700,7 +9700,7 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope {
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressure"/>
|
||||||
|
|
||||||
|
- <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPercent"/>
|
||||||
|
+ <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPermyriad"/>
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="KillMode"/>
|
||||||
|
|
||||||
|
diff --git a/man/systemd.resource-control.xml b/man/systemd.resource-control.xml
|
||||||
|
index 26dedda3fd..4381c4e1b7 100644
|
||||||
|
--- a/man/systemd.resource-control.xml
|
||||||
|
+++ b/man/systemd.resource-control.xml
|
||||||
|
@@ -901,7 +901,7 @@ DeviceAllow=/dev/loop-control
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
- <term><varname>ManagedOOMMemoryPressureLimitPercent=</varname></term>
|
||||||
|
+ <term><varname>ManagedOOMMemoryPressureLimit=</varname></term>
|
||||||
|
|
||||||
|
<listitem>
|
||||||
|
<para>Overrides the default memory pressure limit set by
|
||||||
|
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
|
||||||
|
index 7dc6c20bb7..e2ed0e546e 100644
|
||||||
|
--- a/src/core/cgroup.c
|
||||||
|
+++ b/src/core/cgroup.c
|
||||||
|
@@ -417,7 +417,7 @@ void cgroup_context_dump(Unit *u, FILE* f, const char *prefix) {
|
||||||
|
"%sDelegate: %s\n"
|
||||||
|
"%sManagedOOMSwap: %s\n"
|
||||||
|
"%sManagedOOMMemoryPressure: %s\n"
|
||||||
|
- "%sManagedOOMMemoryPressureLimitPercent: %d%%\n",
|
||||||
|
+ "%sManagedOOMMemoryPressureLimit: %" PRIu32 ".%02" PRIu32 "%%\n",
|
||||||
|
prefix, yes_no(c->cpu_accounting),
|
||||||
|
prefix, yes_no(c->io_accounting),
|
||||||
|
prefix, yes_no(c->blockio_accounting),
|
||||||
|
@@ -450,7 +450,7 @@ void cgroup_context_dump(Unit *u, FILE* f, const char *prefix) {
|
||||||
|
prefix, yes_no(c->delegate),
|
||||||
|
prefix, managed_oom_mode_to_string(c->moom_swap),
|
||||||
|
prefix, managed_oom_mode_to_string(c->moom_mem_pressure),
|
||||||
|
- prefix, c->moom_mem_pressure_limit);
|
||||||
|
+ prefix, c->moom_mem_pressure_limit_permyriad / 100, c->moom_mem_pressure_limit_permyriad % 100);
|
||||||
|
|
||||||
|
if (c->delegate) {
|
||||||
|
_cleanup_free_ char *t = NULL;
|
||||||
|
diff --git a/src/core/cgroup.h b/src/core/cgroup.h
|
||||||
|
index 66f3a63b82..9fbfabbb7e 100644
|
||||||
|
--- a/src/core/cgroup.h
|
||||||
|
+++ b/src/core/cgroup.h
|
||||||
|
@@ -163,7 +163,7 @@ struct CGroupContext {
|
||||||
|
/* Settings for systemd-oomd */
|
||||||
|
ManagedOOMMode moom_swap;
|
||||||
|
ManagedOOMMode moom_mem_pressure;
|
||||||
|
- int moom_mem_pressure_limit;
|
||||||
|
+ uint32_t moom_mem_pressure_limit_permyriad;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Used when querying IP accounting data */
|
||||||
|
diff --git a/src/core/core-varlink.c b/src/core/core-varlink.c
|
||||||
|
index dd6c11ab4d..17fb9bc83f 100644
|
||||||
|
--- a/src/core/core-varlink.c
|
||||||
|
+++ b/src/core/core-varlink.c
|
||||||
|
@@ -83,7 +83,7 @@ static int build_managed_oom_json_array_element(Unit *u, const char *property, J
|
||||||
|
JSON_BUILD_PAIR("mode", JSON_BUILD_STRING(mode)),
|
||||||
|
JSON_BUILD_PAIR("path", JSON_BUILD_STRING(u->cgroup_path)),
|
||||||
|
JSON_BUILD_PAIR("property", JSON_BUILD_STRING(property)),
|
||||||
|
- JSON_BUILD_PAIR_CONDITION(use_limit, "limit", JSON_BUILD_UNSIGNED(c->moom_mem_pressure_limit))));
|
||||||
|
+ JSON_BUILD_PAIR_CONDITION(use_limit, "limit", JSON_BUILD_UNSIGNED(c->moom_mem_pressure_limit_permyriad))));
|
||||||
|
}
|
||||||
|
|
||||||
|
int manager_varlink_send_managed_oom_update(Unit *u) {
|
||||||
|
diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c
|
||||||
|
index 37c581fb22..df35ec114d 100644
|
||||||
|
--- a/src/core/dbus-cgroup.c
|
||||||
|
+++ b/src/core/dbus-cgroup.c
|
||||||
|
@@ -395,7 +395,7 @@ const sd_bus_vtable bus_cgroup_vtable[] = {
|
||||||
|
SD_BUS_PROPERTY("DisableControllers", "as", property_get_cgroup_mask, offsetof(CGroupContext, disable_controllers), 0),
|
||||||
|
SD_BUS_PROPERTY("ManagedOOMSwap", "s", property_get_managed_oom_mode, offsetof(CGroupContext, moom_swap), 0),
|
||||||
|
SD_BUS_PROPERTY("ManagedOOMMemoryPressure", "s", property_get_managed_oom_mode, offsetof(CGroupContext, moom_mem_pressure), 0),
|
||||||
|
- SD_BUS_PROPERTY("ManagedOOMMemoryPressureLimitPercent", "s", bus_property_get_percent, offsetof(CGroupContext, moom_mem_pressure_limit), 0),
|
||||||
|
+ SD_BUS_PROPERTY("ManagedOOMMemoryPressureLimitPermyriad", "u", NULL, offsetof(CGroupContext, moom_mem_pressure_limit_permyriad), 0),
|
||||||
|
SD_BUS_VTABLE_END
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -1697,14 +1697,24 @@ int bus_cgroup_set_property(
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (streq(name, "ManagedOOMMemoryPressureLimitPercent")) {
|
||||||
|
+ if (streq(name, "ManagedOOMMemoryPressureLimitPermyriad")) {
|
||||||
|
+ uint32_t v;
|
||||||
|
+
|
||||||
|
if (!UNIT_VTABLE(u)->can_set_managed_oom)
|
||||||
|
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Cannot set %s for this unit type", name);
|
||||||
|
|
||||||
|
- r = bus_set_transient_percent(u, name, &c->moom_mem_pressure_limit, message, flags, error);
|
||||||
|
+ r = sd_bus_message_read(message, "u", &v);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
+ if (v > 10000)
|
||||||
|
+ return -ERANGE;
|
||||||
|
+
|
||||||
|
+ if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
|
||||||
|
+ c->moom_mem_pressure_limit_permyriad = v;
|
||||||
|
+ unit_write_settingf(u, flags, name, "ManagedOOMMemoryPressureLimit=%" PRIu32 ".%02" PRIu32 "%%", v / 100, v % 100);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (c->moom_mem_pressure == MANAGED_OOM_KILL)
|
||||||
|
(void) manager_varlink_send_managed_oom_update(u);
|
||||||
|
|
||||||
|
diff --git a/src/core/dbus-util.c b/src/core/dbus-util.c
|
||||||
|
index d6223db305..eb03d30cf7 100644
|
||||||
|
--- a/src/core/dbus-util.c
|
||||||
|
+++ b/src/core/dbus-util.c
|
||||||
|
@@ -91,35 +91,6 @@ int bus_set_transient_bool(
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int bus_set_transient_percent(
|
||||||
|
- Unit *u,
|
||||||
|
- const char *name,
|
||||||
|
- int *p,
|
||||||
|
- sd_bus_message *message,
|
||||||
|
- UnitWriteFlags flags,
|
||||||
|
- sd_bus_error *error) {
|
||||||
|
-
|
||||||
|
- const char *v;
|
||||||
|
- int r;
|
||||||
|
-
|
||||||
|
- assert(p);
|
||||||
|
-
|
||||||
|
- r = sd_bus_message_read(message, "s", &v);
|
||||||
|
- if (r < 0)
|
||||||
|
- return r;
|
||||||
|
-
|
||||||
|
- r = parse_percent(v);
|
||||||
|
- if (r < 0)
|
||||||
|
- return r;
|
||||||
|
-
|
||||||
|
- if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
|
||||||
|
- *p = r;
|
||||||
|
- unit_write_settingf(u, flags, name, "%s=%d%%", name, r);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- return 1;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
int bus_set_transient_usec_internal(
|
||||||
|
Unit *u,
|
||||||
|
const char *name,
|
||||||
|
diff --git a/src/core/dbus-util.h b/src/core/dbus-util.h
|
||||||
|
index 4e7c68e843..b68ec38ada 100644
|
||||||
|
--- a/src/core/dbus-util.h
|
||||||
|
+++ b/src/core/dbus-util.h
|
||||||
|
@@ -240,7 +240,6 @@ int bus_set_transient_user_relaxed(Unit *u, const char *name, char **p, sd_bus_m
|
||||||
|
int bus_set_transient_path(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
|
||||||
|
int bus_set_transient_string(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
|
||||||
|
int bus_set_transient_bool(Unit *u, const char *name, bool *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
|
||||||
|
-int bus_set_transient_percent(Unit *u, const char *name, int *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
|
||||||
|
int bus_set_transient_usec_internal(Unit *u, const char *name, usec_t *p, bool fix_0, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
|
||||||
|
static inline int bus_set_transient_usec(Unit *u, const char *name, usec_t *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error) {
|
||||||
|
return bus_set_transient_usec_internal(u, name, p, false, message, flags, error);
|
||||||
|
diff --git a/src/core/load-fragment-gperf.gperf.m4 b/src/core/load-fragment-gperf.gperf.m4
|
||||||
|
index 946862c398..db2a4e28a8 100644
|
||||||
|
--- a/src/core/load-fragment-gperf.gperf.m4
|
||||||
|
+++ b/src/core/load-fragment-gperf.gperf.m4
|
||||||
|
@@ -226,7 +226,7 @@ $1.IPIngressFilterPath, config_parse_ip_filter_bpf_progs,
|
||||||
|
$1.IPEgressFilterPath, config_parse_ip_filter_bpf_progs, 0, offsetof($1, cgroup_context.ip_filters_egress)
|
||||||
|
$1.ManagedOOMSwap, config_parse_managed_oom_mode, 0, offsetof($1, cgroup_context.moom_swap)
|
||||||
|
$1.ManagedOOMMemoryPressure, config_parse_managed_oom_mode, 0, offsetof($1, cgroup_context.moom_mem_pressure)
|
||||||
|
-$1.ManagedOOMMemoryPressureLimitPercent, config_parse_managed_oom_mem_pressure_limit, 0, offsetof($1, cgroup_context.moom_mem_pressure_limit)
|
||||||
|
+$1.ManagedOOMMemoryPressureLimit, config_parse_managed_oom_mem_pressure_limit, 0, offsetof($1, cgroup_context.moom_mem_pressure_limit_permyriad)
|
||||||
|
$1.NetClass, config_parse_warn_compat, DISABLED_LEGACY, 0'
|
||||||
|
)m4_dnl
|
||||||
|
Unit.Description, config_parse_unit_string_printf, 0, offsetof(Unit, description)
|
||||||
|
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
|
||||||
|
index 4964249bf2..e0e9920e06 100644
|
||||||
|
--- a/src/core/load-fragment.c
|
||||||
|
+++ b/src/core/load-fragment.c
|
||||||
|
@@ -3859,7 +3859,7 @@ int config_parse_managed_oom_mem_pressure_limit(
|
||||||
|
const char *rvalue,
|
||||||
|
void *data,
|
||||||
|
void *userdata) {
|
||||||
|
- int *limit = data;
|
||||||
|
+ uint32_t *limit = data;
|
||||||
|
UnitType t;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
@@ -3874,9 +3874,9 @@ int config_parse_managed_oom_mem_pressure_limit(
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- r = parse_percent(rvalue);
|
||||||
|
+ r = parse_permyriad(rvalue);
|
||||||
|
if (r < 0) {
|
||||||
|
- log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to parse limit percent value, ignoring: %s", rvalue);
|
||||||
|
+ log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to parse memory pressure limit value, ignoring: %s", rvalue);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/oom/oomd-manager.c b/src/oom/oomd-manager.c
|
||||||
|
index 3efa629002..338935b3ec 100644
|
||||||
|
--- a/src/oom/oomd-manager.c
|
||||||
|
+++ b/src/oom/oomd-manager.c
|
||||||
|
@@ -100,10 +100,10 @@ static int process_managed_oom_reply(
|
||||||
|
limit = m->default_mem_pressure_limit;
|
||||||
|
|
||||||
|
if (streq(reply.property, "ManagedOOMMemoryPressure")) {
|
||||||
|
- if (reply.limit > 100)
|
||||||
|
+ if (reply.limit > 10000)
|
||||||
|
continue;
|
||||||
|
else if (reply.limit != 0) {
|
||||||
|
- ret = store_loadavg_fixed_point((unsigned long) reply.limit, 0, &limit);
|
||||||
|
+ ret = store_loadavg_fixed_point((unsigned long) reply.limit / 100, (unsigned long) reply.limit % 100, &limit);
|
||||||
|
if (ret < 0)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
@@ -478,8 +478,8 @@ static int manager_connect_bus(Manager *m) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int manager_start(Manager *m, bool dry_run, int swap_used_limit, int mem_pressure_limit, usec_t mem_pressure_usec) {
|
||||||
|
- unsigned long l;
|
||||||
|
+int manager_start(Manager *m, bool dry_run, int swap_used_limit, int mem_pressure_limit_permyriad, usec_t mem_pressure_usec) {
|
||||||
|
+ unsigned long l, f;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(m);
|
||||||
|
@@ -489,8 +489,16 @@ int manager_start(Manager *m, bool dry_run, int swap_used_limit, int mem_pressur
|
||||||
|
m->swap_used_limit = swap_used_limit != -1 ? swap_used_limit : DEFAULT_SWAP_USED_LIMIT;
|
||||||
|
assert(m->swap_used_limit <= 100);
|
||||||
|
|
||||||
|
- l = mem_pressure_limit != -1 ? mem_pressure_limit : DEFAULT_MEM_PRESSURE_LIMIT;
|
||||||
|
- r = store_loadavg_fixed_point(l, 0, &m->default_mem_pressure_limit);
|
||||||
|
+ if (mem_pressure_limit_permyriad != -1) {
|
||||||
|
+ assert(mem_pressure_limit_permyriad <= 10000);
|
||||||
|
+
|
||||||
|
+ l = mem_pressure_limit_permyriad / 100;
|
||||||
|
+ f = mem_pressure_limit_permyriad % 100;
|
||||||
|
+ } else {
|
||||||
|
+ l = DEFAULT_MEM_PRESSURE_LIMIT_PERCENT;
|
||||||
|
+ f = 0;
|
||||||
|
+ }
|
||||||
|
+ r = store_loadavg_fixed_point(l, f, &m->default_mem_pressure_limit);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
@@ -530,12 +538,12 @@ int manager_get_dump_string(Manager *m, char **ret) {
|
||||||
|
fprintf(f,
|
||||||
|
"Dry Run: %s\n"
|
||||||
|
"Swap Used Limit: %u%%\n"
|
||||||
|
- "Default Memory Pressure Limit: %lu%%\n"
|
||||||
|
+ "Default Memory Pressure Limit: %lu.%02lu%%\n"
|
||||||
|
"Default Memory Pressure Duration: %s\n"
|
||||||
|
"System Context:\n",
|
||||||
|
yes_no(m->dry_run),
|
||||||
|
m->swap_used_limit,
|
||||||
|
- LOAD_INT(m->default_mem_pressure_limit),
|
||||||
|
+ LOAD_INT(m->default_mem_pressure_limit), LOAD_FRAC(m->default_mem_pressure_limit),
|
||||||
|
format_timespan(buf, sizeof(buf), m->default_mem_pressure_duration_usec, USEC_PER_SEC));
|
||||||
|
oomd_dump_system_context(&m->system_context, f, "\t");
|
||||||
|
|
||||||
|
diff --git a/src/oom/oomd-manager.h b/src/oom/oomd-manager.h
|
||||||
|
index ee17abced2..521665e0a8 100644
|
||||||
|
--- a/src/oom/oomd-manager.h
|
||||||
|
+++ b/src/oom/oomd-manager.h
|
||||||
|
@@ -17,7 +17,7 @@
|
||||||
|
* Generally 60 or higher might be acceptable for something like system.slice with no memory.high set; processes in
|
||||||
|
* system.slice are assumed to be less latency sensitive. */
|
||||||
|
#define DEFAULT_MEM_PRESSURE_DURATION_USEC (30 * USEC_PER_SEC)
|
||||||
|
-#define DEFAULT_MEM_PRESSURE_LIMIT 60
|
||||||
|
+#define DEFAULT_MEM_PRESSURE_LIMIT_PERCENT 60
|
||||||
|
#define DEFAULT_SWAP_USED_LIMIT 90
|
||||||
|
|
||||||
|
#define RECLAIM_DURATION_USEC (30 * USEC_PER_SEC)
|
||||||
|
@@ -56,7 +56,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
|
||||||
|
|
||||||
|
int manager_new(Manager **ret);
|
||||||
|
|
||||||
|
-int manager_start(Manager *m, bool dry_run, int swap_used_limit, int mem_pressure_limit, usec_t mem_pressure_usec);
|
||||||
|
+int manager_start(Manager *m, bool dry_run, int swap_used_limit, int mem_pressure_limit_permyriad, usec_t mem_pressure_usec);
|
||||||
|
|
||||||
|
int manager_get_dump_string(Manager *m, char **ret);
|
||||||
|
|
||||||
|
diff --git a/src/oom/oomd-util.c b/src/oom/oomd-util.c
|
||||||
|
index cec656f6fa..fcccddb92e 100644
|
||||||
|
--- a/src/oom/oomd-util.c
|
||||||
|
+++ b/src/oom/oomd-util.c
|
||||||
|
@@ -415,11 +415,11 @@ void oomd_dump_memory_pressure_cgroup_context(const OomdCGroupContext *ctx, FILE
|
||||||
|
|
||||||
|
fprintf(f,
|
||||||
|
"%sPath: %s\n"
|
||||||
|
- "%s\tMemory Pressure Limit: %lu%%\n"
|
||||||
|
+ "%s\tMemory Pressure Limit: %lu.%02lu%%\n"
|
||||||
|
"%s\tPressure: Avg10: %lu.%02lu Avg60: %lu.%02lu Avg300: %lu.%02lu Total: %s\n"
|
||||||
|
"%s\tCurrent Memory Usage: %s\n",
|
||||||
|
strempty(prefix), ctx->path,
|
||||||
|
- strempty(prefix), LOAD_INT(ctx->mem_pressure_limit),
|
||||||
|
+ strempty(prefix), LOAD_INT(ctx->mem_pressure_limit), LOAD_FRAC(ctx->mem_pressure_limit),
|
||||||
|
strempty(prefix),
|
||||||
|
LOAD_INT(ctx->memory_pressure.avg10), LOAD_FRAC(ctx->memory_pressure.avg10),
|
||||||
|
LOAD_INT(ctx->memory_pressure.avg60), LOAD_FRAC(ctx->memory_pressure.avg60),
|
||||||
|
diff --git a/src/oom/oomd.c b/src/oom/oomd.c
|
||||||
|
index 1fbcf41492..811d211b58 100644
|
||||||
|
--- a/src/oom/oomd.c
|
||||||
|
+++ b/src/oom/oomd.c
|
||||||
|
@@ -18,14 +18,14 @@
|
||||||
|
|
||||||
|
static bool arg_dry_run = false;
|
||||||
|
static int arg_swap_used_limit = -1;
|
||||||
|
-static int arg_mem_pressure_limit = -1;
|
||||||
|
+static int arg_mem_pressure_limit_permyriad = -1;
|
||||||
|
static usec_t arg_mem_pressure_usec = 0;
|
||||||
|
|
||||||
|
static int parse_config(void) {
|
||||||
|
static const ConfigTableItem items[] = {
|
||||||
|
- { "OOM", "SwapUsedLimitPercent", config_parse_percent, 0, &arg_swap_used_limit },
|
||||||
|
- { "OOM", "DefaultMemoryPressureLimitPercent", config_parse_percent, 0, &arg_mem_pressure_limit },
|
||||||
|
- { "OOM", "DefaultMemoryPressureDurationSec", config_parse_sec, 0, &arg_mem_pressure_usec },
|
||||||
|
+ { "OOM", "SwapUsedLimitPercent", config_parse_percent, 0, &arg_swap_used_limit },
|
||||||
|
+ { "OOM", "DefaultMemoryPressureLimit", config_parse_permyriad, 0, &arg_mem_pressure_limit_permyriad },
|
||||||
|
+ { "OOM", "DefaultMemoryPressureDurationSec", config_parse_sec, 0, &arg_mem_pressure_usec },
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -160,7 +160,7 @@ static int run(int argc, char *argv[]) {
|
||||||
|
if (r < 0)
|
||||||
|
return log_error_errno(r, "Failed to create manager: %m");
|
||||||
|
|
||||||
|
- r = manager_start(m, arg_dry_run, arg_swap_used_limit, arg_mem_pressure_limit, arg_mem_pressure_usec);
|
||||||
|
+ r = manager_start(m, arg_dry_run, arg_swap_used_limit, arg_mem_pressure_limit_permyriad, arg_mem_pressure_usec);
|
||||||
|
if (r < 0)
|
||||||
|
return log_error_errno(r, "Failed to start up daemon: %m");
|
||||||
|
|
||||||
|
diff --git a/src/oom/oomd.conf b/src/oom/oomd.conf
|
||||||
|
index 766cb1717f..bd6a9391c6 100644
|
||||||
|
--- a/src/oom/oomd.conf
|
||||||
|
+++ b/src/oom/oomd.conf
|
||||||
|
@@ -13,5 +13,5 @@
|
||||||
|
|
||||||
|
[OOM]
|
||||||
|
#SwapUsedLimitPercent=90%
|
||||||
|
-#DefaultMemoryPressureLimitPercent=60%
|
||||||
|
+#DefaultMemoryPressureLimit=60%
|
||||||
|
#DefaultMemoryPressureDurationSec=30s
|
||||||
|
diff --git a/src/shared/bus-get-properties.c b/src/shared/bus-get-properties.c
|
||||||
|
index 32f68d5e6a..a5ce7ef17f 100644
|
||||||
|
--- a/src/shared/bus-get-properties.c
|
||||||
|
+++ b/src/shared/bus-get-properties.c
|
||||||
|
@@ -55,23 +55,6 @@ int bus_property_get_id128(
|
||||||
|
return sd_bus_message_append_array(reply, 'y', id->bytes, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
-int bus_property_get_percent(
|
||||||
|
- sd_bus *bus,
|
||||||
|
- const char *path,
|
||||||
|
- const char *interface,
|
||||||
|
- const char *property,
|
||||||
|
- sd_bus_message *reply,
|
||||||
|
- void *userdata,
|
||||||
|
- sd_bus_error *error) {
|
||||||
|
-
|
||||||
|
- char pstr[DECIMAL_STR_MAX(int) + 2];
|
||||||
|
- int p = *(int*) userdata;
|
||||||
|
-
|
||||||
|
- xsprintf(pstr, "%d%%", p);
|
||||||
|
-
|
||||||
|
- return sd_bus_message_append_basic(reply, 's', pstr);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
#if __SIZEOF_SIZE_T__ != 8
|
||||||
|
int bus_property_get_size(
|
||||||
|
sd_bus *bus,
|
||||||
|
diff --git a/src/shared/bus-get-properties.h b/src/shared/bus-get-properties.h
|
||||||
|
index 9832c0d067..26f3e8588c 100644
|
||||||
|
--- a/src/shared/bus-get-properties.h
|
||||||
|
+++ b/src/shared/bus-get-properties.h
|
||||||
|
@@ -8,7 +8,6 @@
|
||||||
|
int bus_property_get_bool(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
|
||||||
|
int bus_property_set_bool(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *value, void *userdata, sd_bus_error *error);
|
||||||
|
int bus_property_get_id128(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
|
||||||
|
-int bus_property_get_percent(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
|
||||||
|
|
||||||
|
#define bus_property_get_usec ((sd_bus_property_get_t) NULL)
|
||||||
|
#define bus_property_set_usec ((sd_bus_property_set_t) NULL)
|
||||||
|
diff --git a/src/shared/bus-unit-util.c b/src/shared/bus-unit-util.c
|
||||||
|
index 2bab2299fb..f96059c699 100644
|
||||||
|
--- a/src/shared/bus-unit-util.c
|
||||||
|
+++ b/src/shared/bus-unit-util.c
|
||||||
|
@@ -435,10 +435,25 @@ static int bus_append_cgroup_property(sd_bus_message *m, const char *field, cons
|
||||||
|
if (STR_IN_SET(field, "DevicePolicy",
|
||||||
|
"Slice",
|
||||||
|
"ManagedOOMSwap",
|
||||||
|
- "ManagedOOMMemoryPressure",
|
||||||
|
- "ManagedOOMMemoryPressureLimitPercent"))
|
||||||
|
+ "ManagedOOMMemoryPressure"))
|
||||||
|
return bus_append_string(m, field, eq);
|
||||||
|
|
||||||
|
+ if (STR_IN_SET(field, "ManagedOOMMemoryPressureLimit")) {
|
||||||
|
+ char *n;
|
||||||
|
+
|
||||||
|
+ r = parse_permyriad(eq);
|
||||||
|
+ if (r < 0)
|
||||||
|
+ return log_error_errno(r, "Failed to parse %s value: %s", field, eq);
|
||||||
|
+
|
||||||
|
+ n = strjoina(field, "Permyriad");
|
||||||
|
+
|
||||||
|
+ r = sd_bus_message_append(m, "(sv)", n, "u", (uint32_t) r);
|
||||||
|
+ if (r < 0)
|
||||||
|
+ return bus_log_create_error(r);
|
||||||
|
+
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (STR_IN_SET(field, "CPUAccounting",
|
||||||
|
"MemoryAccounting",
|
||||||
|
"IOAccounting",
|
||||||
|
diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c
|
||||||
|
index 35d301d9db..c8c253d603 100644
|
||||||
|
--- a/src/shared/conf-parser.c
|
||||||
|
+++ b/src/shared/conf-parser.c
|
||||||
|
@@ -1245,3 +1245,4 @@ int config_parse_vlanprotocol(const char* unit,
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFINE_CONFIG_PARSE(config_parse_percent, parse_percent, "Failed to parse percent value");
|
||||||
|
+DEFINE_CONFIG_PARSE(config_parse_permyriad, parse_permyriad, "Failed to parse permyriad value");
|
||||||
|
diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h
|
||||||
|
index f115cb23af..988d81e43a 100644
|
||||||
|
--- a/src/shared/conf-parser.h
|
||||||
|
+++ b/src/shared/conf-parser.h
|
||||||
|
@@ -148,6 +148,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_mtu);
|
||||||
|
CONFIG_PARSER_PROTOTYPE(config_parse_rlimit);
|
||||||
|
CONFIG_PARSER_PROTOTYPE(config_parse_vlanprotocol);
|
||||||
|
CONFIG_PARSER_PROTOTYPE(config_parse_percent);
|
||||||
|
+CONFIG_PARSER_PROTOTYPE(config_parse_permyriad);
|
||||||
|
|
||||||
|
typedef enum Disabled {
|
||||||
|
DISABLED_CONFIGURATION,
|
||||||
|
diff --git a/test/units/testsuite-56-workload.slice b/test/units/testsuite-56-workload.slice
|
||||||
|
index 45b04914c6..8c32b28094 100644
|
||||||
|
--- a/test/units/testsuite-56-workload.slice
|
||||||
|
+++ b/test/units/testsuite-56-workload.slice
|
||||||
|
@@ -7,4 +7,4 @@ MemoryAccounting=true
|
||||||
|
IOAccounting=true
|
||||||
|
TasksAccounting=true
|
||||||
|
ManagedOOMMemoryPressure=kill
|
||||||
|
-ManagedOOMMemoryPressureLimitPercent=1%
|
||||||
|
+ManagedOOMMemoryPressureLimit=1%
|
||||||
|
diff --git a/test/units/testsuite-56.sh b/test/units/testsuite-56.sh
|
||||||
|
index 4dc9d8c7a8..8b01fe37ed 100755
|
||||||
|
--- a/test/units/testsuite-56.sh
|
||||||
|
+++ b/test/units/testsuite-56.sh
|
||||||
|
@@ -20,7 +20,7 @@ systemctl start testsuite-56-testbloat.service
|
||||||
|
|
||||||
|
# Verify systemd-oomd is monitoring the expected units
|
||||||
|
oomctl | grep "/testsuite-56-workload.slice"
|
||||||
|
-oomctl | grep "1%"
|
||||||
|
+oomctl | grep "1.00%"
|
||||||
|
oomctl | grep "Default Memory Pressure Duration: 5s"
|
||||||
|
|
||||||
|
# systemd-oomd watches for elevated pressure for 30 seconds before acting.
|
||||||
|
--
|
||||||
|
2.29.2
|
||||||
|
|
40
95ca39f04efa278ac93881e6e364a6ae520b03e7.patch
Normal file
40
95ca39f04efa278ac93881e6e364a6ae520b03e7.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
From 95ca39f04efa278ac93881e6e364a6ae520b03e7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Yu Watanabe <watanabe.yu+github@gmail.com>
|
||||||
|
Date: Fri, 27 Nov 2020 08:29:20 +0900
|
||||||
|
Subject: [PATCH] oom: use CMP() macro
|
||||||
|
|
||||||
|
---
|
||||||
|
src/oom/oomd-util.h | 14 ++------------
|
||||||
|
1 file changed, 2 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/oom/oomd-util.h b/src/oom/oomd-util.h
|
||||||
|
index 87ecda80fbc..0834cbf09d7 100644
|
||||||
|
--- a/src/oom/oomd-util.h
|
||||||
|
+++ b/src/oom/oomd-util.h
|
||||||
|
@@ -64,24 +64,14 @@ static inline int compare_pgscan(OomdCGroupContext * const *c1, OomdCGroupContex
|
||||||
|
assert(c1);
|
||||||
|
assert(c2);
|
||||||
|
|
||||||
|
- if ((*c1)->pgscan > (*c2)->pgscan)
|
||||||
|
- return -1;
|
||||||
|
- else if ((*c1)->pgscan < (*c2)->pgscan)
|
||||||
|
- return 1;
|
||||||
|
- else
|
||||||
|
- return 0;
|
||||||
|
+ return CMP((*c2)->pgscan, (*c1)->pgscan);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int compare_swap_usage(OomdCGroupContext * const *c1, OomdCGroupContext * const *c2) {
|
||||||
|
assert(c1);
|
||||||
|
assert(c2);
|
||||||
|
|
||||||
|
- if ((*c1)->swap_usage > (*c2)->swap_usage)
|
||||||
|
- return -1;
|
||||||
|
- else if ((*c1)->swap_usage < (*c2)->swap_usage)
|
||||||
|
- return 1;
|
||||||
|
- else
|
||||||
|
- return 0;
|
||||||
|
+ return CMP((*c2)->swap_usage, (*c1)->swap_usage);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get an array of OomdCGroupContexts from `h`, qsorted from largest to smallest values according to `compare_func`.
|
@ -22,6 +22,7 @@ o_rpm_macros = open('.file-list-rpm-macros', 'w')
|
|||||||
o_devel = open('.file-list-devel', 'w')
|
o_devel = open('.file-list-devel', 'w')
|
||||||
o_container = open('.file-list-container', 'w')
|
o_container = open('.file-list-container', 'w')
|
||||||
o_networkd = open('.file-list-networkd', 'w')
|
o_networkd = open('.file-list-networkd', 'w')
|
||||||
|
o_oomd_defaults = open('.file-list-oomd-defaults', 'w')
|
||||||
o_remote = open('.file-list-remote', 'w')
|
o_remote = open('.file-list-remote', 'w')
|
||||||
o_tests = open('.file-list-tests', 'w')
|
o_tests = open('.file-list-tests', 'w')
|
||||||
o_standalone_tmpfiles = open('.file-list-standalone-tmpfiles', 'w')
|
o_standalone_tmpfiles = open('.file-list-standalone-tmpfiles', 'w')
|
||||||
@ -117,6 +118,8 @@ for file in files(buildroot):
|
|||||||
/modprobe.d
|
/modprobe.d
|
||||||
''', n, re.X):
|
''', n, re.X):
|
||||||
o = o_udev
|
o = o_udev
|
||||||
|
elif re.search(r'10-oomd-.*defaults.conf|lib/systemd/oomd.conf.d', n, re.X):
|
||||||
|
o = o_oomd_defaults
|
||||||
elif n.endswith('.standalone'):
|
elif n.endswith('.standalone'):
|
||||||
if 'tmpfiles' in n:
|
if 'tmpfiles' in n:
|
||||||
o = o_standalone_tmpfiles
|
o = o_standalone_tmpfiles
|
||||||
|
40
systemd.spec
40
systemd.spec
@ -21,7 +21,7 @@
|
|||||||
Name: systemd
|
Name: systemd
|
||||||
Url: https://www.freedesktop.org/wiki/Software/systemd
|
Url: https://www.freedesktop.org/wiki/Software/systemd
|
||||||
Version: 247.3
|
Version: 247.3
|
||||||
Release: 1%{?dist}
|
Release: 2%{?dist}
|
||||||
# For a breakdown of the licensing, see README
|
# For a breakdown of the licensing, see README
|
||||||
License: LGPLv2+ and MIT and GPLv2+
|
License: LGPLv2+ and MIT and GPLv2+
|
||||||
Summary: System and Service Manager
|
Summary: System and Service Manager
|
||||||
@ -57,6 +57,10 @@ Source11: 20-grubby.install
|
|||||||
Source12: systemd-user
|
Source12: systemd-user
|
||||||
Source13: libsystemd-shared.abignore
|
Source13: libsystemd-shared.abignore
|
||||||
|
|
||||||
|
Source14: 10-oomd-defaults.conf
|
||||||
|
Source15: 10-oomd-root-slice-defaults.conf
|
||||||
|
Source16: 10-oomd-user-service-defaults.conf
|
||||||
|
|
||||||
Source21: macros.sysusers
|
Source21: macros.sysusers
|
||||||
Source22: sysusers.attr
|
Source22: sysusers.attr
|
||||||
Source23: sysusers.prov
|
Source23: sysusers.prov
|
||||||
@ -69,6 +73,12 @@ GIT_DIR=../../src/systemd/.git git diffab -M v233..master@{2017-06-15} -- hwdb/[
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
# Backports of patches from upstream (0000–0499)
|
# Backports of patches from upstream (0000–0499)
|
||||||
|
# systemd-oomd refinements for https://fedoraproject.org/wiki/Changes/EnableSystemdOomd
|
||||||
|
Patch0000: https://github.com/systemd/systemd/pull/17829.patch
|
||||||
|
Patch0001: https://github.com/systemd/systemd/pull/18361.patch
|
||||||
|
Patch0002: https://github.com/systemd/systemd/pull/18444.patch
|
||||||
|
Patch0003: https://github.com/systemd/systemd/pull/17732/commits/95ca39f04efa278ac93881e6e364a6ae520b03e7.patch
|
||||||
|
Patch0004: https://github.com/systemd/systemd/pull/18401.patch
|
||||||
|
|
||||||
# Downstream-only patches (5000–9999)
|
# Downstream-only patches (5000–9999)
|
||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1738828
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1738828
|
||||||
@ -342,6 +352,15 @@ systemd-networkd is a system service that manages networks. It detects
|
|||||||
and configures network devices as they appear, as well as creating virtual
|
and configures network devices as they appear, as well as creating virtual
|
||||||
network devices.
|
network devices.
|
||||||
|
|
||||||
|
%package oomd-defaults
|
||||||
|
Summary: Configuration files for systemd-oomd
|
||||||
|
Requires: %{name}%{?_isa} = %{version}-%{release}
|
||||||
|
License: LGPLv2+
|
||||||
|
|
||||||
|
%description oomd-defaults
|
||||||
|
A set of drop-in files for systemd units to enable action from systemd-oomd,
|
||||||
|
a userspace out-of-memory (OOM) killer.
|
||||||
|
|
||||||
%package tests
|
%package tests
|
||||||
Summary: Internal unit tests for systemd
|
Summary: Internal unit tests for systemd
|
||||||
Requires: %{name}%{?_isa} = %{version}-%{release}
|
Requires: %{name}%{?_isa} = %{version}-%{release}
|
||||||
@ -553,6 +572,11 @@ install -Dm0644 -t %{buildroot}%{_prefix}/lib/systemd/ %{SOURCE13}
|
|||||||
|
|
||||||
install -D -t %{buildroot}/usr/lib/systemd/ %{SOURCE3}
|
install -D -t %{buildroot}/usr/lib/systemd/ %{SOURCE3}
|
||||||
|
|
||||||
|
# systemd-oomd default configuration
|
||||||
|
install -Dm0644 -t %{buildroot}%{_prefix}/lib/systemd/oomd.conf.d/ %{SOURCE14}
|
||||||
|
install -Dm0644 -t %{buildroot}%{system_unit_dir}/-.slice.d/ %{SOURCE15}
|
||||||
|
install -Dm0644 -t %{buildroot}%{system_unit_dir}/user@.service.d/ %{SOURCE16}
|
||||||
|
|
||||||
sed -i 's|#!/usr/bin/env python3|#!%{__python3}|' %{buildroot}/usr/lib/systemd/tests/run-unit-tests.py
|
sed -i 's|#!/usr/bin/env python3|#!%{__python3}|' %{buildroot}/usr/lib/systemd/tests/run-unit-tests.py
|
||||||
|
|
||||||
install -m 0644 -D -t %{buildroot}%{_rpmconfigdir}/macros.d/ %{SOURCE21}
|
install -m 0644 -D -t %{buildroot}%{_rpmconfigdir}/macros.d/ %{SOURCE21}
|
||||||
@ -667,6 +691,8 @@ chmod g+s /{run,var}/log/journal/{,${machine_id}} &>/dev/null || :
|
|||||||
# Apply ACL to the journal directory
|
# Apply ACL to the journal directory
|
||||||
setfacl -Rnm g:wheel:rx,d:g:wheel:rx,g:adm:rx,d:g:adm:rx /var/log/journal/ &>/dev/null || :
|
setfacl -Rnm g:wheel:rx,d:g:wheel:rx,g:adm:rx,d:g:adm:rx /var/log/journal/ &>/dev/null || :
|
||||||
|
|
||||||
|
%systemd_post systemd-oomd.service
|
||||||
|
|
||||||
[ $1 -eq 1 ] || exit 0
|
[ $1 -eq 1 ] || exit 0
|
||||||
|
|
||||||
# We reset the enablement of all services upon initial installation
|
# We reset the enablement of all services upon initial installation
|
||||||
@ -727,6 +753,9 @@ if systemctl -q is-enabled systemd-resolved.service &>/dev/null; then
|
|||||||
systemctl start systemd-resolved.service &>/dev/null || :
|
systemctl start systemd-resolved.service &>/dev/null || :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
%postun
|
||||||
|
%systemd_postun_with_restart systemd-oomd.service
|
||||||
|
|
||||||
%post libs
|
%post libs
|
||||||
%{?ldconfig}
|
%{?ldconfig}
|
||||||
|
|
||||||
@ -887,6 +916,8 @@ getent passwd systemd-network &>/dev/null || useradd -r -u 192 -l -g systemd-net
|
|||||||
|
|
||||||
%files networkd -f .file-list-networkd
|
%files networkd -f .file-list-networkd
|
||||||
|
|
||||||
|
%files oomd-defaults -f .file-list-oomd-defaults
|
||||||
|
|
||||||
%files tests -f .file-list-tests
|
%files tests -f .file-list-tests
|
||||||
|
|
||||||
%files standalone-tmpfiles -f .file-list-standalone-tmpfiles
|
%files standalone-tmpfiles -f .file-list-standalone-tmpfiles
|
||||||
@ -894,6 +925,13 @@ getent passwd systemd-network &>/dev/null || useradd -r -u 192 -l -g systemd-net
|
|||||||
%files standalone-sysusers -f .file-list-standalone-sysusers
|
%files standalone-sysusers -f .file-list-standalone-sysusers
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Feb 5 2021 Anita Zhang <the.anitazha@gmail.com> - 247.3-2
|
||||||
|
- Changes for https://fedoraproject.org/wiki/Changes/EnableSystemdOomd.
|
||||||
|
- Backports consist primarily of PR #18361, #18444, and #18401 (plus some
|
||||||
|
additional ones to handle merge conflicts).
|
||||||
|
- Create systemd-oomd-defaults subpackage to install unit drop-ins that will
|
||||||
|
configure systemd-oomd to monitor and act.
|
||||||
|
|
||||||
* Tue Feb 2 2021 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> - 247.3-1
|
* Tue Feb 2 2021 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> - 247.3-1
|
||||||
- Minor stable release
|
- Minor stable release
|
||||||
- Fixes #1895937, #1813219, #1903106.
|
- Fixes #1895937, #1813219, #1903106.
|
||||||
|
Loading…
Reference in New Issue
Block a user