2021-03-05 18:36:04 +09:00
#!/usr/bin/env bash
2021-10-17 18:13:06 +02:00
# SPDX-License-Identifier: LGPL-2.1-or-later
2021-04-09 19:39:41 +02:00
set -eux
2018-12-13 17:22:01 +01:00
set -o pipefail
2021-03-05 18:36:04 +09:00
systemd-analyze log-level debug
2018-12-13 17:22:01 +01:00
2023-01-20 23:00:38 +00:00
# Ensure that the init.scope.d drop-in is applied on boot
test " $( cat /sys/fs/cgroup/init.scope/memory.high) " != "max"
2021-03-05 18:36:04 +09:00
# Loose checks to ensure the environment has the necessary features for systemd-oomd
2021-04-08 00:09:55 +02:00
[ [ -e /proc/pressure ] ] || echo "no PSI" >>/skipped
2024-02-09 18:53:19 +01:00
[ [ " $( get_cgroup_hierarchy) " = = "unified" ] ] || echo "no cgroupsv2" >>/skipped
[ [ -x /usr/lib/systemd/systemd-oomd ] ] || echo "no oomd" >>/skipped
if [ [ -s /skipped ] ] ; then
2021-04-09 19:49:32 +02:00
exit 0
fi
2018-12-13 17:22:01 +01:00
2023-06-17 00:01:24 +01:00
rm -rf /run/systemd/system/testsuite-55-testbloat.service.d
2018-12-13 17:22:01 +01:00
2023-06-23 23:19:31 +01:00
# Activate swap file if we are in a VM
if systemd-detect-virt --vm --quiet; then
2024-02-14 11:48:56 +01:00
if [ [ " $( findmnt -n -o FSTYPE /) " = = btrfs ] ] ; then
btrfs filesystem mkswapfile -s 64M /swapfile
else
dd if = /dev/zero of = /swapfile bs = 1M count = 64
chmod 0600 /swapfile
mkswap /swapfile
fi
2023-06-23 23:19:31 +01:00
swapon /swapfile
swapon --show
fi
2022-01-06 21:37:21 +01:00
# Configure oomd explicitly to avoid conflicts with distro dropins
2023-06-17 00:01:24 +01:00
mkdir -p /run/systemd/oomd.conf.d/
2023-06-17 00:06:38 +01:00
cat >/run/systemd/oomd.conf.d/99-oomd-test.conf <<EOF
[ OOM]
DefaultMemoryPressureDurationSec = 2s
EOF
2023-06-17 00:01:24 +01:00
mkdir -p /run/systemd/system/-.slice.d/
2023-06-17 00:06:38 +01:00
cat >/run/systemd/system/-.slice.d/99-oomd-test.conf <<EOF
[ Slice]
ManagedOOMSwap = auto
EOF
2023-06-17 00:01:24 +01:00
mkdir -p /run/systemd/system/user@.service.d/
2023-06-17 00:06:38 +01:00
cat >/run/systemd/system/user@.service.d/99-oomd-test.conf <<EOF
[ Service]
ManagedOOMMemoryPressure = auto
ManagedOOMMemoryPressureLimit = 0%
EOF
2018-12-13 17:22:01 +01:00
2023-06-17 00:01:24 +01:00
mkdir -p /run/systemd/system/systemd-oomd.service.d/
2023-06-17 00:06:38 +01:00
cat >/run/systemd/system/systemd-oomd.service.d/debug.conf <<EOF
[ Service]
Environment = SYSTEMD_LOG_LEVEL = debug
EOF
2021-07-03 02:04:31 +09:00
systemctl daemon-reload
2022-01-12 12:29:34 +01:00
# enable the service to ensure dbus-org.freedesktop.oom1.service exists
# and D-Bus activation works
systemctl enable systemd-oomd.service
2021-07-03 02:04:31 +09:00
# if oomd is already running for some reasons, then restart it to make sure the above settings to be applied
if systemctl is-active systemd-oomd.service; then
systemctl restart systemd-oomd.service
fi
2021-03-05 18:36:04 +09:00
systemctl start testsuite-55-testchill.service
systemctl start testsuite-55-testbloat.service
2018-12-13 17:22:01 +01:00
2021-03-05 18:36:04 +09:00
# Verify systemd-oomd is monitoring the expected units
2024-02-09 18:53:19 +01:00
timeout 1m bash -xec 'until oomctl | grep "/testsuite-55-workload.slice"; do sleep 1; done'
oomctl | grep "/testsuite-55-workload.slice"
oomctl | grep "20.00%"
oomctl | grep "Default Memory Pressure Duration: 2s"
2018-12-13 17:22:01 +01:00
2021-07-03 02:24:30 +09:00
systemctl status testsuite-55-testchill.service
2021-07-03 02:23:11 +09:00
# systemd-oomd watches for elevated pressure for 2 seconds before acting.
2021-03-05 18:36:04 +09:00
# It can take time to build up pressure so either wait 2 minutes or for the service to fail.
2024-02-09 18:53:19 +01:00
for _ in { 0..59} ; do
2021-03-05 18:36:04 +09:00
if ! systemctl status testsuite-55-testbloat.service; then
2018-12-13 17:22:01 +01:00
break
2021-03-05 18:36:04 +09:00
fi
2023-06-17 00:07:32 +01:00
oomctl
2021-07-03 02:23:11 +09:00
sleep 2
2018-12-13 17:22:01 +01:00
done
2021-03-05 18:36:04 +09:00
# testbloat should be killed and testchill should be fine
if systemctl status testsuite-55-testbloat.service; then exit 42; fi
if ! systemctl status testsuite-55-testchill.service; then exit 24; fi
2021-09-09 16:12:55 +01:00
# Make sure we also work correctly on user units.
2024-02-21 15:42:35 +01:00
loginctl enable-linger testuser
2021-09-09 16:12:55 +01:00
2021-11-22 22:12:09 +01:00
systemctl start --machine "testuser@.host" --user testsuite-55-testchill.service
systemctl start --machine "testuser@.host" --user testsuite-55-testbloat.service
2021-09-09 16:12:55 +01:00
# Verify systemd-oomd is monitoring the expected units
2021-11-24 01:02:22 -08:00
# Try to avoid racing the oomctl output check by checking in a loop with a timeout
2024-02-09 18:53:19 +01:00
timeout 1m bash -xec 'until oomctl | grep "/testsuite-55-workload.slice"; do sleep 1; done'
oomctl | grep -E "/user.slice.*/testsuite-55-workload.slice"
oomctl | grep "20.00%"
oomctl | grep "Default Memory Pressure Duration: 2s"
2021-09-09 16:12:55 +01:00
2021-11-22 22:12:09 +01:00
systemctl --machine "testuser@.host" --user status testsuite-55-testchill.service
2021-09-09 16:12:55 +01:00
# systemd-oomd watches for elevated pressure for 2 seconds before acting.
# It can take time to build up pressure so either wait 2 minutes or for the service to fail.
2024-02-09 18:53:19 +01:00
for _ in { 0..59} ; do
2021-11-22 22:12:09 +01:00
if ! systemctl --machine "testuser@.host" --user status testsuite-55-testbloat.service; then
2021-09-09 16:12:55 +01:00
break
fi
2023-06-17 00:07:32 +01:00
oomctl
2021-09-09 16:12:55 +01:00
sleep 2
done
# testbloat should be killed and testchill should be fine
2021-11-22 22:12:09 +01:00
if systemctl --machine "testuser@.host" --user status testsuite-55-testbloat.service; then exit 42; fi
if ! systemctl --machine "testuser@.host" --user status testsuite-55-testchill.service; then exit 24; fi
2021-09-09 16:12:55 +01:00
2024-02-21 15:42:35 +01:00
loginctl disable-linger testuser
2021-03-05 18:36:04 +09:00
# only run this portion of the test if we can set xattrs
if setfattr -n user.xattr_test -v 1 /sys/fs/cgroup/; then
sleep 120 # wait for systemd-oomd kill cool down and elevated memory pressure to come down
2023-06-17 00:01:24 +01:00
mkdir -p /run/systemd/system/testsuite-55-testbloat.service.d/
2023-06-17 00:06:38 +01:00
cat >/run/systemd/system/testsuite-55-testbloat.service.d/override.conf <<EOF
[ Service]
ManagedOOMPreference = avoid
EOF
2021-03-05 18:36:04 +09:00
systemctl daemon-reload
systemctl start testsuite-55-testchill.service
systemctl start testsuite-55-testmunch.service
systemctl start testsuite-55-testbloat.service
2024-02-09 18:53:19 +01:00
for _ in { 0..59} ; do
2021-03-05 18:36:04 +09:00
if ! systemctl status testsuite-55-testmunch.service; then
break
fi
2023-06-17 00:07:32 +01:00
oomctl
2021-09-12 00:02:31 -07:00
sleep 2
2021-03-05 18:36:04 +09:00
done
# testmunch should be killed since testbloat had the avoid xattr on it
if ! systemctl status testsuite-55-testbloat.service; then exit 25; fi
if systemctl status testsuite-55-testmunch.service; then exit 43; fi
if ! systemctl status testsuite-55-testchill.service; then exit 24; fi
fi
systemd-analyze log-level info
2021-04-08 00:09:55 +02:00
echo OK >/testok
2018-12-13 17:22:01 +01:00
exit 0