summaryrefslogtreecommitdiff
path: root/test/units/testsuite-56.sh
diff options
context:
space:
mode:
Diffstat (limited to 'test/units/testsuite-56.sh')
-rwxr-xr-xtest/units/testsuite-56.sh70
1 files changed, 70 insertions, 0 deletions
diff --git a/test/units/testsuite-56.sh b/test/units/testsuite-56.sh
new file mode 100755
index 0000000000..5be6658972
--- /dev/null
+++ b/test/units/testsuite-56.sh
@@ -0,0 +1,70 @@
+#!/usr/bin/env bash
+set -ex
+set -o pipefail
+
+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
+ echo "no cgroup2" >> /skipped
+fi
+[[ -e /skipped ]] && exit 0 || true
+
+cat > /etc/systemd/system/testworkload.slice <<EOF
+[Slice]
+CPUAccounting=true
+MemoryAccounting=true
+IOAccounting=true
+TasksAccounting=true
+ManagedOOMMemoryPressure=kill
+ManagedOOMMemoryPressureLimitPercent=50%
+EOF
+
+# Create a lot of memory pressure by setting memory.high to a very small value
+cat > /etc/systemd/system/testbloat.service <<EOF
+[Service]
+MemoryHigh=2M
+Slice=testworkload.slice
+ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-56-slowgrowth.sh
+EOF
+
+# This generates no memory pressure
+cat > /etc/systemd/system/testchill.service <<EOF
+[Service]
+MemoryHigh=2M
+Slice=testworkload.slice
+ExecStart=sleep infinity
+EOF
+
+systemctl daemon-reload
+
+systemctl start testbloat.service
+systemctl start testchill.service
+
+# Verify systemd-oomd is monitoring the expected units
+oomctl | grep "/testworkload.slice"
+oomctl | grep "50%"
+
+# 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.
+timeout=$(date -ud "5 minutes" +%s)
+while [[ $(date -u +%s) -le $timeout ]]; do
+ if ! systemctl status testbloat.service; then
+ break
+ fi
+ sleep 15
+done
+
+# testbloat should be killed and testchill should be fine
+if systemctl status testbloat.service; then exit 42; fi
+if ! systemctl status testchill.service; then exit 24; fi
+
+systemd-analyze log-level info
+
+echo OK > /testok
+
+exit 0