Merged update from upstream sources
This is an automated DistroBaker update from upstream sources. If you do not know what this is about or would like to opt out, contact the OSCI team. Source: https://src.fedoraproject.org/rpms/systemd.git#0257583091a9b13d4ca7012ee3632f67af009b85
This commit is contained in:
parent
795d4d1e5f
commit
2a38ee711e
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,4 +1,5 @@
|
|||||||
*~
|
*~
|
||||||
|
/.mail.list
|
||||||
/systemd-*/
|
/systemd-*/
|
||||||
/.build-*.log
|
/.build-*.log
|
||||||
/x86_64/
|
/x86_64/
|
||||||
|
5
.zuul.yaml
Normal file
5
.zuul.yaml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
- project:
|
||||||
|
vars:
|
||||||
|
install_repo_exclude:
|
||||||
|
- systemd-standalone-tmpfiles
|
||||||
|
- systemd-standalone-sysuser
|
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`.
|
36
owner-check.sh
Executable file
36
owner-check.sh
Executable file
@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
[ -z "$server" -o -z "login" ] && { echo '$server and $login need to be set'; exit 1 }
|
||||||
|
|
||||||
|
header=
|
||||||
|
from=systemd-maint@fedoraproject.org
|
||||||
|
time='2 years ago'
|
||||||
|
# time='1 day ago'
|
||||||
|
port=587
|
||||||
|
|
||||||
|
for user in "$@"; do
|
||||||
|
echo "checking $user…"
|
||||||
|
t=$(git shortlog --all --author $user --since "@{$time}" | wc -l)
|
||||||
|
if [ $t != 0 ]; then
|
||||||
|
echo "$t commits in the last two years, OK"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$header" ]; then
|
||||||
|
echo '$USER$;$EMAIL$' >.mail.list
|
||||||
|
header=done
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$user;$user@fedoraproject.org" >>.mail.list
|
||||||
|
done
|
||||||
|
|
||||||
|
[ -z "$header" ] && exit 0
|
||||||
|
|
||||||
|
echo "Sending mails…"
|
||||||
|
set -x
|
||||||
|
massmail -F $from \
|
||||||
|
-C $from \
|
||||||
|
-S 'write access to the fedora systemd package' \
|
||||||
|
-z $server -u $login -P $port \
|
||||||
|
.mail.list <owner-check.template
|
20
owner-check.template
Normal file
20
owner-check.template
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
Dear $USER$,
|
||||||
|
|
||||||
|
the automation to check activity in the systemd dist-git repo [1]
|
||||||
|
determined that you haven't done any commits in the last two years.
|
||||||
|
|
||||||
|
To decrease the potential for unauthorized access, such checks will be
|
||||||
|
executed periodically. Not-used accounts with write access to the repo
|
||||||
|
will be downgraded to "ticket" (no write privileges).
|
||||||
|
|
||||||
|
If you want to retain access, please reply to this mail.
|
||||||
|
Otherwise, in two weeks, your access mode will be changed to "ticket".
|
||||||
|
Even without write access, anyone can open a pull request in pagure,
|
||||||
|
so write access is not necessary to contribute to the package.
|
||||||
|
Obviously such changes not permanent, so even if your access mode is
|
||||||
|
downgraded, it can easily be restored later on.
|
||||||
|
|
||||||
|
Yours friendly,
|
||||||
|
./owner-check.sh
|
||||||
|
|
||||||
|
[1] https://src.fedoraproject.org/rpms/systemd
|
@ -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
|
||||||
|
86
systemd.spec
86
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}
|
||||||
@ -624,9 +648,18 @@ getent passwd systemd-coredump &>/dev/null || useradd -r -l -g systemd-coredump
|
|||||||
getent group systemd-resolve &>/dev/null || groupadd -r -g 193 systemd-resolve 2>&1 || :
|
getent group systemd-resolve &>/dev/null || groupadd -r -g 193 systemd-resolve 2>&1 || :
|
||||||
getent passwd systemd-resolve &>/dev/null || useradd -r -u 193 -l -g systemd-resolve -d / -s /sbin/nologin -c "systemd Resolver" systemd-resolve &>/dev/null || :
|
getent passwd systemd-resolve &>/dev/null || useradd -r -u 193 -l -g systemd-resolve -d / -s /sbin/nologin -c "systemd Resolver" systemd-resolve &>/dev/null || :
|
||||||
|
|
||||||
|
getent group systemd-oom &>/dev/null || groupadd -r systemd-oom 2>&1 || :
|
||||||
|
getent passwd systemd-oom &>/dev/null || useradd -r -l -g systemd-oom -d / -s /sbin/nologin -c "systemd Userspace OOM Killer" systemd-oom &>/dev/null || :
|
||||||
|
|
||||||
%post
|
%post
|
||||||
systemd-machine-id-setup &>/dev/null || :
|
systemd-machine-id-setup &>/dev/null || :
|
||||||
|
|
||||||
|
# FIXME: move to %postun. We want to restart systemd *after* removing
|
||||||
|
# files from the old rpm. Right now we may still have bits the old
|
||||||
|
# setup if the files are not present in the new version. But before
|
||||||
|
# implement restarting of *other* services after the transaction, moving
|
||||||
|
# this would make things worse, increasing the number of warnings we get
|
||||||
|
# about needed daemon-reload.
|
||||||
systemctl daemon-reexec &>/dev/null || {
|
systemctl daemon-reexec &>/dev/null || {
|
||||||
# systemd v239 had bug #9553 in D-Bus authentication of the private socket,
|
# systemd v239 had bug #9553 in D-Bus authentication of the private socket,
|
||||||
# which was later fixed in v240 by #9625.
|
# which was later fixed in v240 by #9625.
|
||||||
@ -647,13 +680,13 @@ systemctl daemon-reexec &>/dev/null || {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
journalctl --update-catalog &>/dev/null || :
|
if [ $1 -eq 1 ]; then
|
||||||
systemd-tmpfiles --create &>/dev/null || :
|
# create /var/log/journal only on initial installation,
|
||||||
|
# and only if it's writable (it won't be in rpm-ostree).
|
||||||
|
[ -w %{_localstatedir} ] && mkdir -p %{_localstatedir}/log/journal
|
||||||
|
|
||||||
# create /var/log/journal only on initial installation,
|
[ -w %{_localstatedir} ] && journalctl --update-catalog || :
|
||||||
# and only if it's writable (it won't be in rpm-ostree).
|
systemd-tmpfiles --create &>/dev/null || :
|
||||||
if [ $1 -eq 1 ] && [ -w %{_localstatedir} ]; then
|
|
||||||
mkdir -p %{_localstatedir}/log/journal
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Make sure new journal files will be owned by the "systemd-journal" group
|
# Make sure new journal files will be owned by the "systemd-journal" group
|
||||||
@ -695,19 +728,17 @@ if test -d /run/systemd/system/ &&
|
|||||||
ln -fsv ../run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
|
ln -fsv ../run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
|
||||||
fi
|
fi
|
||||||
|
|
||||||
%preun
|
%postun
|
||||||
if [ $1 -eq 0 ] ; then
|
if [ $1 -eq 1 ]; then
|
||||||
systemctl disable --quiet \
|
[ -w %{_localstatedir} ] && journalctl --update-catalog || :
|
||||||
remote-fs.target \
|
systemd-tmpfiles --create &>/dev/null || :
|
||||||
getty@.service \
|
|
||||||
serial-getty@.service \
|
|
||||||
console-getty.service \
|
|
||||||
debug-shell.service \
|
|
||||||
systemd-resolved.service \
|
|
||||||
systemd-homed.service \
|
|
||||||
>/dev/null || :
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
%systemd_postun_with_restart systemd-timedated.service systemd-portabled.service systemd-homed.service systemd-hostnamed.service systemd-journald.service systemd-localed.service systemd-userdbd.service systemd-oomd.service
|
||||||
|
|
||||||
|
# FIXME: systemd-logind.service is excluded (https://github.com/systemd/systemd/pull/17558)
|
||||||
|
# FIXME: user@*.service needs to be restarted, but using systemctl --user daemon-reexec
|
||||||
|
|
||||||
%triggerun -- systemd < 246.1-1
|
%triggerun -- systemd < 246.1-1
|
||||||
# This is for upgrades from previous versions before systemd-resolved became the default.
|
# This is for upgrades from previous versions before systemd-resolved became the default.
|
||||||
systemctl --no-reload preset systemd-resolved.service &>/dev/null || :
|
systemctl --no-reload preset systemd-resolved.service &>/dev/null || :
|
||||||
@ -724,6 +755,12 @@ 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
|
||||||
|
|
||||||
|
%triggerpostun -- systemd < 247.3-2
|
||||||
|
# This is for upgrades from previous versions before oomd-defaults is available.
|
||||||
|
# We use %%triggerpostun here because rpm doesn't allow a second %%triggerun with
|
||||||
|
# a different package version.
|
||||||
|
systemctl --no-reload preset systemd-oomd.service &>/dev/null || :
|
||||||
|
|
||||||
%post libs
|
%post libs
|
||||||
%{?ldconfig}
|
%{?ldconfig}
|
||||||
|
|
||||||
@ -808,9 +845,9 @@ grep -q -E '^KEYMAP="?fi-latin[19]"?' /etc/vconsole.conf 2>/dev/null &&
|
|||||||
%systemd_preun %udev_services
|
%systemd_preun %udev_services
|
||||||
|
|
||||||
%postun udev
|
%postun udev
|
||||||
# Only restart systemd-udev, to run the upgraded dameon.
|
# Restart some services.
|
||||||
# Others are either oneshot services, or sockets, and restarting them causes issues (#1378974)
|
# Others are either oneshot services, or sockets, and restarting them causes issues (#1378974)
|
||||||
%systemd_postun_with_restart systemd-udevd.service
|
%systemd_postun_with_restart systemd-udevd.service systemd-timesyncd.service
|
||||||
|
|
||||||
%pre journal-remote
|
%pre journal-remote
|
||||||
getent group systemd-journal-remote &>/dev/null || groupadd -r systemd-journal-remote 2>&1 || :
|
getent group systemd-journal-remote &>/dev/null || groupadd -r systemd-journal-remote 2>&1 || :
|
||||||
@ -884,6 +921,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
|
||||||
@ -891,6 +930,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