forked from pool/systemd
94f1d69402
See https://github.com/openSUSE/systemd/blob/SUSE/v255/NEWS for details. - This includes the following bug fixes: - commit 6e10405aa25fe5e76b740d9ec59730e3f4470c7a (bsc#1219766) - The following patches have been rebased: - 0002-rc-local-fix-ordering-startup-for-etc-init.d-boot.lo.patch - 0008-sysv-generator-translate-Required-Start-into-a-Wants.patch - 0009-pid1-handle-console-specificities-weirdness-for-s390.patch - 5001-Revert-udev-update-devlink-with-the-newer-device-nod.patch - 5002-Revert-udev-revert-workarounds-for-issues-caused-by-.patch - The following patches have been removed since they're part of v255: - 5003-cgroup-rename-TasksMax-structure-to-CGroupTasksMax.patch - 5004-bus-print-properties-ignore-CGROUP_LIMIT_MAX-for-Mem.patch - 5005-bus-print-properties-prettify-more-unset-properties.patch - systemd-boot has been added to the list of the dependencies of the systemd-testsuite package as the installation of the bootloader is now tested. - the following patches have been backported on top of v255.3: 96edf7ad18 service: Demote log level of NotifyAccess= messages to debug (bsc#1210113 jsc#PED-6214) fdde7f26d6 vconsole-setup: don't fail if the only found vc is already used by plymouth (bsc#1218618) f96c587d41 rules: set up tty permissions and group for /dev/hvc* nodes (bsc#1218137) 63a41b8899 vconsole-setup: remember the correct error value when open_terminal() fails f51a2e038c vconsole-setup: handle the case where the vc is in KD_GRAPHICS mode more gracefully (bsc#1215282) 15025a04c4 test: make sure to install the filesystem package in the test image on SUSE 06fecfb635 test: make sure that sd-boot is installed before testing bootctl 1e8788ea68 test: install systemd-boot in openSUSE test images 6e2875ad43 test/test-shutdown.py: optionally display the test I/Os in a dedicated log file 4be1a801b4 test-69: send SIGTERM to ask systemd-nspawn to properly stop the container 7bdab7b7c7 man: Document ranges for distributions config files and local config files 3f12a6c22f test: systemd-update-utmp is optional OBS-URL: https://build.opensuse.org/package/show/Base:System/systemd?expand=0&rev=1497
669 lines
32 KiB
Diff
669 lines
32 KiB
Diff
From 840527985f03a4327fc0fe78e45d889742601698 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Michal=20Koutn=C3=BD?= <mkoutny@suse.com>
|
|
Date: Fri, 11 Aug 2023 13:51:20 +0200
|
|
Subject: [PATCH 5006/5010] cgroup: Add EffectiveMemoryMax=,
|
|
EffectiveMemoryHigh= and EffectiveTasksMax= properties
|
|
|
|
Users become perplexed when they run their workload in a unit with no
|
|
explicit limits configured (moreover, listing the limit property would
|
|
even show it's infinity) but they experience unexpected resource
|
|
limitation.
|
|
|
|
The memory and pid limits come as the most visible, therefore add new
|
|
unit read-only properties:
|
|
- EffectiveMemoryMax=,
|
|
- EffectiveMemoryHigh=,
|
|
- EffectiveTasksMax=.
|
|
|
|
These properties represent the most stringent limit systemd is aware of
|
|
for the given unit -- and that is typically(*) the effective value.
|
|
|
|
Implement the properties by simply traversing all parents in the
|
|
leaf-slice tree and picking the minimum value. Note that effective
|
|
limits are thus defined even for units that don't enable explicit
|
|
accounting (because of the hierarchy).
|
|
|
|
(*) The evasive case is when systemd runs in a cgroupns and cannot
|
|
reason about outer setup. Complete solution would need kernel support.
|
|
|
|
(cherry picked from commit 4fb0d2dc140c9a2c01c236d2a8dc09a44157e896)
|
|
|
|
[mkoutny: fixes jsc#PED-5659]
|
|
---
|
|
man/org.freedesktop.systemd1.xml | 126 ++++++++++++++++++++++++++++++
|
|
man/systemd.resource-control.xml | 11 ++-
|
|
src/core/cgroup.c | 48 ++++++++++++
|
|
src/core/cgroup.h | 13 +++
|
|
src/core/dbus-unit.c | 25 ++++++
|
|
src/shared/bus-print-properties.c | 6 +-
|
|
6 files changed, 224 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/man/org.freedesktop.systemd1.xml b/man/org.freedesktop.systemd1.xml
|
|
index a1bcbba02f..59733c0039 100644
|
|
--- a/man/org.freedesktop.systemd1.xml
|
|
+++ b/man/org.freedesktop.systemd1.xml
|
|
@@ -2786,6 +2786,10 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t MemoryAvailable = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveMemoryMax = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveMemoryHigh = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t CPUUsageNSec = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly ay EffectiveCPUs = [...];
|
|
@@ -2794,6 +2798,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t TasksCurrent = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveTasksMax = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t IPIngressBytes = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t IPIngressPackets = ...;
|
|
@@ -3419,6 +3425,10 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
|
|
|
<!--property MemoryZSwapCurrent is not documented!-->
|
|
|
|
+ <!--property EffectiveMemoryMax is not documented!-->
|
|
+
|
|
+ <!--property EffectiveMemoryHigh is not documented!-->
|
|
+
|
|
<!--property CPUUsageNSec is not documented!-->
|
|
|
|
<!--property EffectiveCPUs is not documented!-->
|
|
@@ -3427,6 +3437,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
|
|
|
<!--property TasksCurrent is not documented!-->
|
|
|
|
+ <!--property EffectiveTasksMax is not documented!-->
|
|
+
|
|
<!--property IPIngressBytes is not documented!-->
|
|
|
|
<!--property IPIngressPackets is not documented!-->
|
|
@@ -4061,6 +4073,10 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="MemoryAvailable"/>
|
|
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveMemoryMax"/>
|
|
+
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveMemoryHigh"/>
|
|
+
|
|
<variablelist class="dbus-property" generated="True" extra-ref="CPUUsageNSec"/>
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="EffectiveCPUs"/>
|
|
@@ -4069,6 +4085,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="TasksCurrent"/>
|
|
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveTasksMax"/>
|
|
+
|
|
<variablelist class="dbus-property" generated="True" extra-ref="IPIngressBytes"/>
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="IPIngressPackets"/>
|
|
@@ -4865,6 +4883,10 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t MemoryAvailable = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveMemoryMax = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveMemoryHigh = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t CPUUsageNSec = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly ay EffectiveCPUs = [...];
|
|
@@ -4873,6 +4895,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t TasksCurrent = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveTasksMax = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t IPIngressBytes = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t IPIngressPackets = ...;
|
|
@@ -5508,6 +5532,10 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
|
|
|
|
<!--property MemoryZSwapCurrent is not documented!-->
|
|
|
|
+ <!--property EffectiveMemoryMax is not documented!-->
|
|
+
|
|
+ <!--property EffectiveMemoryHigh is not documented!-->
|
|
+
|
|
<!--property CPUUsageNSec is not documented!-->
|
|
|
|
<!--property EffectiveCPUs is not documented!-->
|
|
@@ -5516,6 +5544,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
|
|
|
|
<!--property TasksCurrent is not documented!-->
|
|
|
|
+ <!--property EffectiveTasksMax is not documented!-->
|
|
+
|
|
<!--property IPIngressBytes is not documented!-->
|
|
|
|
<!--property IPIngressPackets is not documented!-->
|
|
@@ -6132,6 +6162,10 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="MemoryAvailable"/>
|
|
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveMemoryMax"/>
|
|
+
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveMemoryHigh"/>
|
|
+
|
|
<variablelist class="dbus-property" generated="True" extra-ref="CPUUsageNSec"/>
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="EffectiveCPUs"/>
|
|
@@ -6140,6 +6174,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="TasksCurrent"/>
|
|
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveTasksMax"/>
|
|
+
|
|
<variablelist class="dbus-property" generated="True" extra-ref="IPIngressBytes"/>
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="IPIngressPackets"/>
|
|
@@ -6810,6 +6846,10 @@ node /org/freedesktop/systemd1/unit/home_2emount {
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t MemoryAvailable = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveMemoryMax = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveMemoryHigh = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t CPUUsageNSec = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly ay EffectiveCPUs = [...];
|
|
@@ -6818,6 +6858,8 @@ node /org/freedesktop/systemd1/unit/home_2emount {
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t TasksCurrent = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveTasksMax = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t IPIngressBytes = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t IPIngressPackets = ...;
|
|
@@ -7381,6 +7423,10 @@ node /org/freedesktop/systemd1/unit/home_2emount {
|
|
|
|
<!--property MemoryZSwapCurrent is not documented!-->
|
|
|
|
+ <!--property EffectiveMemoryMax is not documented!-->
|
|
+
|
|
+ <!--property EffectiveMemoryHigh is not documented!-->
|
|
+
|
|
<!--property CPUUsageNSec is not documented!-->
|
|
|
|
<!--property EffectiveCPUs is not documented!-->
|
|
@@ -7389,6 +7435,8 @@ node /org/freedesktop/systemd1/unit/home_2emount {
|
|
|
|
<!--property TasksCurrent is not documented!-->
|
|
|
|
+ <!--property EffectiveTasksMax is not documented!-->
|
|
+
|
|
<!--property IPIngressBytes is not documented!-->
|
|
|
|
<!--property IPIngressPackets is not documented!-->
|
|
@@ -7919,6 +7967,10 @@ node /org/freedesktop/systemd1/unit/home_2emount {
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="MemoryAvailable"/>
|
|
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveMemoryMax"/>
|
|
+
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveMemoryHigh"/>
|
|
+
|
|
<variablelist class="dbus-property" generated="True" extra-ref="CPUUsageNSec"/>
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="EffectiveCPUs"/>
|
|
@@ -7927,6 +7979,8 @@ node /org/freedesktop/systemd1/unit/home_2emount {
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="TasksCurrent"/>
|
|
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveTasksMax"/>
|
|
+
|
|
<variablelist class="dbus-property" generated="True" extra-ref="IPIngressBytes"/>
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="IPIngressPackets"/>
|
|
@@ -8720,6 +8774,10 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t MemoryAvailable = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveMemoryMax = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveMemoryHigh = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t CPUUsageNSec = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly ay EffectiveCPUs = [...];
|
|
@@ -8728,6 +8786,8 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t TasksCurrent = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveTasksMax = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t IPIngressBytes = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t IPIngressPackets = ...;
|
|
@@ -9277,6 +9337,10 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
|
|
|
|
<!--property MemoryZSwapCurrent is not documented!-->
|
|
|
|
+ <!--property EffectiveMemoryMax is not documented!-->
|
|
+
|
|
+ <!--property EffectiveMemoryHigh is not documented!-->
|
|
+
|
|
<!--property CPUUsageNSec is not documented!-->
|
|
|
|
<!--property EffectiveCPUs is not documented!-->
|
|
@@ -9285,6 +9349,8 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
|
|
|
|
<!--property TasksCurrent is not documented!-->
|
|
|
|
+ <!--property EffectiveTasksMax is not documented!-->
|
|
+
|
|
<!--property IPIngressBytes is not documented!-->
|
|
|
|
<!--property IPIngressPackets is not documented!-->
|
|
@@ -9801,6 +9867,10 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="MemoryAvailable"/>
|
|
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveMemoryMax"/>
|
|
+
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveMemoryHigh"/>
|
|
+
|
|
<variablelist class="dbus-property" generated="True" extra-ref="CPUUsageNSec"/>
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="EffectiveCPUs"/>
|
|
@@ -9809,6 +9879,8 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="TasksCurrent"/>
|
|
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveTasksMax"/>
|
|
+
|
|
<variablelist class="dbus-property" generated="True" extra-ref="IPIngressBytes"/>
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="IPIngressPackets"/>
|
|
@@ -10461,6 +10533,10 @@ node /org/freedesktop/systemd1/unit/system_2eslice {
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t MemoryAvailable = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveMemoryMax = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveMemoryHigh = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t CPUUsageNSec = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly ay EffectiveCPUs = [...];
|
|
@@ -10469,6 +10545,8 @@ node /org/freedesktop/systemd1/unit/system_2eslice {
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t TasksCurrent = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveTasksMax = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t IPIngressBytes = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t IPIngressPackets = ...;
|
|
@@ -10644,6 +10722,10 @@ node /org/freedesktop/systemd1/unit/system_2eslice {
|
|
|
|
<!--property MemoryZSwapCurrent is not documented!-->
|
|
|
|
+ <!--property EffectiveMemoryMax is not documented!-->
|
|
+
|
|
+ <!--property EffectiveMemoryHigh is not documented!-->
|
|
+
|
|
<!--property CPUUsageNSec is not documented!-->
|
|
|
|
<!--property EffectiveCPUs is not documented!-->
|
|
@@ -10652,6 +10734,8 @@ node /org/freedesktop/systemd1/unit/system_2eslice {
|
|
|
|
<!--property TasksCurrent is not documented!-->
|
|
|
|
+ <!--property EffectiveTasksMax is not documented!-->
|
|
+
|
|
<!--property IPIngressBytes is not documented!-->
|
|
|
|
<!--property IPIngressPackets is not documented!-->
|
|
@@ -10832,6 +10916,10 @@ node /org/freedesktop/systemd1/unit/system_2eslice {
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="MemoryAvailable"/>
|
|
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveMemoryMax"/>
|
|
+
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveMemoryHigh"/>
|
|
+
|
|
<variablelist class="dbus-property" generated="True" extra-ref="CPUUsageNSec"/>
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="EffectiveCPUs"/>
|
|
@@ -10840,6 +10928,8 @@ node /org/freedesktop/systemd1/unit/system_2eslice {
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="TasksCurrent"/>
|
|
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveTasksMax"/>
|
|
+
|
|
<variablelist class="dbus-property" generated="True" extra-ref="IPIngressBytes"/>
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="IPIngressPackets"/>
|
|
@@ -11046,6 +11136,10 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope {
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t MemoryAvailable = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveMemoryMax = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveMemoryHigh = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t CPUUsageNSec = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly ay EffectiveCPUs = [...];
|
|
@@ -11054,6 +11148,8 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope {
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t TasksCurrent = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
+ readonly t EffectiveTasksMax = ...;
|
|
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t IPIngressBytes = ...;
|
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
|
|
readonly t IPIngressPackets = ...;
|
|
@@ -11249,6 +11345,10 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope {
|
|
|
|
<!--property MemoryZSwapCurrent is not documented!-->
|
|
|
|
+ <!--property EffectiveMemoryMax is not documented!-->
|
|
+
|
|
+ <!--property EffectiveMemoryHigh is not documented!-->
|
|
+
|
|
<!--property CPUUsageNSec is not documented!-->
|
|
|
|
<!--property EffectiveCPUs is not documented!-->
|
|
@@ -11257,6 +11357,8 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope {
|
|
|
|
<!--property TasksCurrent is not documented!-->
|
|
|
|
+ <!--property EffectiveTasksMax is not documented!-->
|
|
+
|
|
<!--property IPIngressBytes is not documented!-->
|
|
|
|
<!--property IPIngressPackets is not documented!-->
|
|
@@ -11467,6 +11569,10 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope {
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="MemoryAvailable"/>
|
|
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveMemoryMax"/>
|
|
+
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveMemoryHigh"/>
|
|
+
|
|
<variablelist class="dbus-property" generated="True" extra-ref="CPUUsageNSec"/>
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="EffectiveCPUs"/>
|
|
@@ -11475,6 +11581,8 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope {
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="TasksCurrent"/>
|
|
|
|
+ <variablelist class="dbus-property" generated="True" extra-ref="EffectiveTasksMax"/>
|
|
+
|
|
<variablelist class="dbus-property" generated="True" extra-ref="IPIngressBytes"/>
|
|
|
|
<variablelist class="dbus-property" generated="True" extra-ref="IPIngressPackets"/>
|
|
@@ -11866,6 +11974,9 @@ $ gdbus introspect --system --dest org.freedesktop.systemd1 \
|
|
<varname>MemorySwapCurrent</varname>,
|
|
<varname>MemorySwapPeak</varname>, and
|
|
<varname>MemoryZSwapCurrent</varname> were added in version 255.</para>
|
|
+ <para><varname>EffectiveMemoryHigh</varname>,
|
|
+ <varname>EffectiveMemoryMax</varname>,
|
|
+ <varname>EffectiveTasksMax</varname> were added in version 256.</para>
|
|
</refsect2>
|
|
<refsect2>
|
|
<title>Socket Unit Objects</title>
|
|
@@ -11897,6 +12008,9 @@ $ gdbus introspect --system --dest org.freedesktop.systemd1 \
|
|
<varname>MemorySwapCurrent</varname>,
|
|
<varname>MemorySwapPeak</varname>, and
|
|
<varname>MemoryZSwapCurrent</varname> were added in version 255.</para>
|
|
+ <para><varname>EffectiveMemoryHigh</varname>,
|
|
+ <varname>EffectiveMemoryMax</varname>,
|
|
+ <varname>EffectiveTasksMax</varname> were added in version 256.</para>
|
|
</refsect2>
|
|
<refsect2>
|
|
<title>Mount Unit Objects</title>
|
|
@@ -11926,6 +12040,9 @@ $ gdbus introspect --system --dest org.freedesktop.systemd1 \
|
|
<varname>MemorySwapCurrent</varname>,
|
|
<varname>MemorySwapPeak</varname>, and
|
|
<varname>MemoryZSwapCurrent</varname> were added in version 255.</para>
|
|
+ <para><varname>EffectiveMemoryHigh</varname>,
|
|
+ <varname>EffectiveMemoryMax</varname>,
|
|
+ <varname>EffectiveTasksMax</varname> were added in version 256.</para>
|
|
</refsect2>
|
|
<refsect2>
|
|
<title>Swap Unit Objects</title>
|
|
@@ -11955,6 +12072,9 @@ $ gdbus introspect --system --dest org.freedesktop.systemd1 \
|
|
<varname>MemorySwapCurrent</varname>,
|
|
<varname>MemorySwapPeak</varname>, and
|
|
<varname>MemoryZSwapCurrent</varname> were added in version 255.</para>
|
|
+ <para><varname>EffectiveMemoryHigh</varname>,
|
|
+ <varname>EffectiveMemoryMax</varname>,
|
|
+ <varname>EffectiveTasksMax</varname> were added in version 256.</para>
|
|
</refsect2>
|
|
<refsect2>
|
|
<title>Slice Unit Objects</title>
|
|
@@ -11975,6 +12095,9 @@ $ gdbus introspect --system --dest org.freedesktop.systemd1 \
|
|
<varname>MemorySwapCurrent</varname>,
|
|
<varname>MemorySwapPeak</varname>, and
|
|
<varname>MemoryZSwapCurrent</varname> were added in version 255.</para>
|
|
+ <para><varname>EffectiveMemoryHigh</varname>,
|
|
+ <varname>EffectiveMemoryMax</varname>,
|
|
+ <varname>EffectiveTasksMax</varname> were added in version 256.</para>
|
|
</refsect2>
|
|
<refsect2>
|
|
<title>Scope Unit Objects</title>
|
|
@@ -11996,6 +12119,9 @@ $ gdbus introspect --system --dest org.freedesktop.systemd1 \
|
|
<varname>MemorySwapCurrent</varname>,
|
|
<varname>MemorySwapPeak</varname>, and
|
|
<varname>MemoryZSwapCurrent</varname> were added in version 255.</para>
|
|
+ <para><varname>EffectiveMemoryHigh</varname>,
|
|
+ <varname>EffectiveMemoryMax</varname>,
|
|
+ <varname>EffectiveTasksMax</varname> were added in version 256.</para>
|
|
</refsect2>
|
|
<refsect2>
|
|
<title>Job Objects</title>
|
|
diff --git a/man/systemd.resource-control.xml b/man/systemd.resource-control.xml
|
|
index 42f265c950..bd8b6a5719 100644
|
|
--- a/man/systemd.resource-control.xml
|
|
+++ b/man/systemd.resource-control.xml
|
|
@@ -406,7 +406,9 @@ CPUWeight=20 DisableControllers=cpu / \
|
|
system. If assigned the
|
|
special value <literal>infinity</literal>, no memory throttling is applied. This controls the
|
|
<literal>memory.high</literal> control group attribute. For details about this control group attribute, see
|
|
- <ulink url="https://docs.kernel.org/admin-guide/cgroup-v2.html#memory-interface-files">Memory Interface Files</ulink>.</para>
|
|
+ <ulink url="https://docs.kernel.org/admin-guide/cgroup-v2.html#memory-interface-files">Memory Interface Files</ulink>.
|
|
+ The effective configuration is reported as <varname>EffectiveMemoryHigh=</varname>
|
|
+ (see also <varname>EffectiveMemoryMax=</varname>).</para>
|
|
|
|
<para>While <varname>StartupMemoryHigh=</varname> applies to the startup and shutdown phases of the system,
|
|
<varname>MemoryHigh=</varname> applies to normal runtime of the system, and if the former is not set also to
|
|
@@ -434,7 +436,9 @@ CPUWeight=20 DisableControllers=cpu / \
|
|
percentage value may be specified, which is taken relative to the installed physical memory on the system. If
|
|
assigned the special value <literal>infinity</literal>, no memory limit is applied. This controls the
|
|
<literal>memory.max</literal> control group attribute. For details about this control group attribute, see
|
|
- <ulink url="https://docs.kernel.org/admin-guide/cgroup-v2.html#memory-interface-files">Memory Interface Files</ulink>.</para>
|
|
+ <ulink url="https://docs.kernel.org/admin-guide/cgroup-v2.html#memory-interface-files">Memory Interface Files</ulink>.
|
|
+ The effective configuration is reported as <varname>EffectiveMemoryMax=</varname> (the value is
|
|
+ the most stringent limit of the unit and parent slices).</para>
|
|
|
|
<para>While <varname>StartupMemoryMax=</varname> applies to the startup and shutdown phases of the system,
|
|
<varname>MemoryMax=</varname> applies to normal runtime of the system, and if the former is not set also to
|
|
@@ -560,7 +564,8 @@ CPUWeight=20 DisableControllers=cpu / \
|
|
limit is applied. This controls the <literal>pids.max</literal> control group attribute. For
|
|
details about this control group attribute, the
|
|
<ulink url="https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html#pid">pids controller
|
|
- </ulink>.</para>
|
|
+ </ulink>.
|
|
+ The effective configuration is reported as <varname>EffectiveTasksMax=</varname>.</para>
|
|
|
|
<para>The system default for this setting may be controlled with
|
|
<varname>DefaultTasksMax=</varname> in
|
|
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
|
|
index 61ac4df1a6..78ca67216a 100644
|
|
--- a/src/core/cgroup.c
|
|
+++ b/src/core/cgroup.c
|
|
@@ -4243,6 +4243,46 @@ int unit_get_ip_accounting(
|
|
return r;
|
|
}
|
|
|
|
+static uint64_t unit_get_effective_limit_one(Unit *u, CGroupLimitType type) {
|
|
+ CGroupContext *cc;
|
|
+
|
|
+ assert(u);
|
|
+ assert(UNIT_HAS_CGROUP_CONTEXT(u));
|
|
+
|
|
+ cc = unit_get_cgroup_context(u);
|
|
+ switch (type) {
|
|
+ /* Note: on legacy/hybrid hierarchies memory_max stays CGROUP_LIMIT_MAX unless configured
|
|
+ * explicitly. Effective value of MemoryLimit= (cgroup v1) is not implemented. */
|
|
+ case CGROUP_LIMIT_MEMORY_MAX:
|
|
+ return cc->memory_max;
|
|
+ case CGROUP_LIMIT_MEMORY_HIGH:
|
|
+ return cc->memory_high;
|
|
+ case CGROUP_LIMIT_TASKS_MAX:
|
|
+ return cgroup_tasks_max_resolve(&cc->tasks_max);
|
|
+ default:
|
|
+ assert_not_reached();
|
|
+ }
|
|
+}
|
|
+
|
|
+int unit_get_effective_limit(Unit *u, CGroupLimitType type, uint64_t *ret) {
|
|
+ uint64_t infimum;
|
|
+
|
|
+ assert(u);
|
|
+ assert(ret);
|
|
+ assert(type >= 0);
|
|
+ assert(type < _CGROUP_LIMIT_TYPE_MAX);
|
|
+
|
|
+ if (!UNIT_HAS_CGROUP_CONTEXT(u))
|
|
+ return -EINVAL;
|
|
+
|
|
+ infimum = unit_get_effective_limit_one(u, type);
|
|
+ for (Unit *slice = UNIT_GET_SLICE(u); slice; slice = UNIT_GET_SLICE(slice))
|
|
+ infimum = MIN(infimum, unit_get_effective_limit_one(slice, type));
|
|
+
|
|
+ *ret = infimum;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static int unit_get_io_accounting_raw(Unit *u, uint64_t ret[static _CGROUP_IO_ACCOUNTING_METRIC_MAX]) {
|
|
static const char *const field_names[_CGROUP_IO_ACCOUNTING_METRIC_MAX] = {
|
|
[CGROUP_IO_READ_BYTES] = "rbytes=",
|
|
@@ -4663,3 +4703,11 @@ static const char* const cgroup_memory_accounting_metric_table[_CGROUP_MEMORY_AC
|
|
};
|
|
|
|
DEFINE_STRING_TABLE_LOOKUP(cgroup_memory_accounting_metric, CGroupMemoryAccountingMetric);
|
|
+
|
|
+static const char *const cgroup_limit_type_table[_CGROUP_LIMIT_TYPE_MAX] = {
|
|
+ [CGROUP_LIMIT_MEMORY_MAX] = "EffectiveMemoryMax",
|
|
+ [CGROUP_LIMIT_MEMORY_HIGH] = "EffectiveMemoryHigh",
|
|
+ [CGROUP_LIMIT_TASKS_MAX] = "EffectiveTasksMax",
|
|
+};
|
|
+
|
|
+DEFINE_STRING_TABLE_LOOKUP(cgroup_limit_type, CGroupLimitType);
|
|
diff --git a/src/core/cgroup.h b/src/core/cgroup.h
|
|
index f1b674b4b7..54bce91ea1 100644
|
|
--- a/src/core/cgroup.h
|
|
+++ b/src/core/cgroup.h
|
|
@@ -276,6 +276,15 @@ typedef enum CGroupMemoryAccountingMetric {
|
|
_CGROUP_MEMORY_ACCOUNTING_METRIC_INVALID = -EINVAL,
|
|
} CGroupMemoryAccountingMetric;
|
|
|
|
+/* Used for limits whose value sets have infimum */
|
|
+typedef enum CGroupLimitType {
|
|
+ CGROUP_LIMIT_MEMORY_MAX,
|
|
+ CGROUP_LIMIT_MEMORY_HIGH,
|
|
+ CGROUP_LIMIT_TASKS_MAX,
|
|
+ _CGROUP_LIMIT_TYPE_MAX,
|
|
+ _CGROUP_LIMIT_INVALID = -EINVAL,
|
|
+} CGroupLimitType;
|
|
+
|
|
typedef struct Unit Unit;
|
|
typedef struct Manager Manager;
|
|
typedef enum ManagerState ManagerState;
|
|
@@ -374,6 +383,7 @@ int unit_get_tasks_current(Unit *u, uint64_t *ret);
|
|
int unit_get_cpu_usage(Unit *u, nsec_t *ret);
|
|
int unit_get_io_accounting(Unit *u, CGroupIOAccountingMetric metric, bool allow_cache, uint64_t *ret);
|
|
int unit_get_ip_accounting(Unit *u, CGroupIPAccountingMetric metric, uint64_t *ret);
|
|
+int unit_get_effective_limit(Unit *u, CGroupLimitType type, uint64_t *ret);
|
|
|
|
int unit_reset_cpu_accounting(Unit *u);
|
|
void unit_reset_memory_accounting_last(Unit *u);
|
|
@@ -425,5 +435,8 @@ CGroupIPAccountingMetric cgroup_ip_accounting_metric_from_string(const char *s)
|
|
const char* cgroup_io_accounting_metric_to_string(CGroupIOAccountingMetric m) _const_;
|
|
CGroupIOAccountingMetric cgroup_io_accounting_metric_from_string(const char *s) _pure_;
|
|
|
|
+const char* cgroup_limit_type_to_string(CGroupLimitType m) _const_;
|
|
+CGroupLimitType cgroup_limit_type_from_string(const char *s) _pure_;
|
|
+
|
|
const char* cgroup_memory_accounting_metric_to_string(CGroupMemoryAccountingMetric m) _const_;
|
|
CGroupMemoryAccountingMetric cgroup_memory_accounting_metric_from_string(const char *s) _pure_;
|
|
diff --git a/src/core/dbus-unit.c b/src/core/dbus-unit.c
|
|
index 1a037b7035..ac6add4700 100644
|
|
--- a/src/core/dbus-unit.c
|
|
+++ b/src/core/dbus-unit.c
|
|
@@ -1441,6 +1441,28 @@ static int property_get_io_counter(
|
|
return sd_bus_message_append(reply, "t", value);
|
|
}
|
|
|
|
+static int property_get_effective_limit(
|
|
+ sd_bus *bus,
|
|
+ const char *path,
|
|
+ const char *interface,
|
|
+ const char *property,
|
|
+ sd_bus_message *reply,
|
|
+ void *userdata,
|
|
+ sd_bus_error *error) {
|
|
+
|
|
+ uint64_t value = CGROUP_LIMIT_MAX;
|
|
+ Unit *u = ASSERT_PTR(userdata);
|
|
+ ssize_t type;
|
|
+
|
|
+ assert(bus);
|
|
+ assert(reply);
|
|
+ assert(property);
|
|
+
|
|
+ assert_se((type = cgroup_limit_type_from_string(property)) >= 0);
|
|
+ (void) unit_get_effective_limit(u, type, &value);
|
|
+ return sd_bus_message_append(reply, "t", value);
|
|
+}
|
|
+
|
|
int bus_unit_method_attach_processes(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
|
_cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
|
|
_cleanup_set_free_ Set *pids = NULL;
|
|
@@ -1562,10 +1584,13 @@ const sd_bus_vtable bus_unit_cgroup_vtable[] = {
|
|
SD_BUS_PROPERTY("MemorySwapPeak", "t", property_get_memory_accounting, 0, 0),
|
|
SD_BUS_PROPERTY("MemoryZSwapCurrent", "t", property_get_memory_accounting, 0, 0),
|
|
SD_BUS_PROPERTY("MemoryAvailable", "t", property_get_available_memory, 0, 0),
|
|
+ SD_BUS_PROPERTY("EffectiveMemoryMax", "t", property_get_effective_limit, 0, 0),
|
|
+ SD_BUS_PROPERTY("EffectiveMemoryHigh", "t", property_get_effective_limit, 0, 0),
|
|
SD_BUS_PROPERTY("CPUUsageNSec", "t", property_get_cpu_usage, 0, 0),
|
|
SD_BUS_PROPERTY("EffectiveCPUs", "ay", property_get_cpuset_cpus, 0, 0),
|
|
SD_BUS_PROPERTY("EffectiveMemoryNodes", "ay", property_get_cpuset_mems, 0, 0),
|
|
SD_BUS_PROPERTY("TasksCurrent", "t", property_get_current_tasks, 0, 0),
|
|
+ SD_BUS_PROPERTY("EffectiveTasksMax", "t", property_get_effective_limit, 0, 0),
|
|
SD_BUS_PROPERTY("IPIngressBytes", "t", property_get_ip_counter, 0, 0),
|
|
SD_BUS_PROPERTY("IPIngressPackets", "t", property_get_ip_counter, 0, 0),
|
|
SD_BUS_PROPERTY("IPEgressBytes", "t", property_get_ip_counter, 0, 0),
|
|
diff --git a/src/shared/bus-print-properties.c b/src/shared/bus-print-properties.c
|
|
index 6704e1ef3d..99b1cc7c70 100644
|
|
--- a/src/shared/bus-print-properties.c
|
|
+++ b/src/shared/bus-print-properties.c
|
|
@@ -164,9 +164,11 @@ static int bus_print_property(const char *name, const char *expected_value, sd_b
|
|
|
|
bus_print_property_value(name, expected_value, flags, "[not set]");
|
|
|
|
- else if ((ENDSWITH_SET(name, "MemoryLow", "MemoryMin", "MemoryHigh", "MemoryMax", "MemorySwapMax", "MemoryZSwapMax", "MemoryLimit") &&
|
|
+ else if ((ENDSWITH_SET(name, "MemoryLow", "MemoryMin",
|
|
+ "MemoryHigh", "MemoryMax",
|
|
+ "MemorySwapMax", "MemoryZSwapMax", "MemoryLimit") &&
|
|
u == CGROUP_LIMIT_MAX) ||
|
|
- (STR_IN_SET(name, "TasksMax", "DefaultTasksMax") && u == UINT64_MAX) ||
|
|
+ (endswith(name, "TasksMax") && u == UINT64_MAX) ||
|
|
(startswith(name, "Limit") && u == UINT64_MAX) ||
|
|
(startswith(name, "DefaultLimit") && u == UINT64_MAX))
|
|
|
|
--
|
|
2.35.3
|
|
|