diff options
Diffstat (limited to 'test/units/testsuite-56.sh')
-rwxr-xr-x | test/units/testsuite-56.sh | 70 |
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 |