Ubuntu

限制 Ubuntu 18.04 中 systemd 服務的交換使用

  • July 12, 2021

我試圖限制使用Ubuntu 18.04文件MemorySwapMax中提到的程序的交換使用。

環境

ubuntu@vrni-platform:/usr/lib/systemd/system$ uname -a
Linux vrni-platform 4.15.0-143-generic #147-Ubuntu SMP Wed Apr 14 16:10:11 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

ubuntu@vrni-platform:/usr/lib/systemd/system$ systemctl --version
systemd 237
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid

我的 systemd 單元文件如下所示

[Unit]
Description=My service
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=support
MemoryMax=2000M
KillMode=process
MemoryAccounting=true
OOMScoreAdjust=1000
MemorySwapMax=0
ExecStart=/usr/bin/java -cp /home/support -XX:NativeMemoryTracking=summary -Xmx10000m MemoryConsumer 100 200 1

我試圖通過為MemorySwapMax. 但似乎 systemd 中存在一些問題,該問題已在 systemd 239 中修復。

所以我也嘗試了設置MemorySwapMax=1M。但這似乎也沒有限制此 systemd 服務的交換記憶體使用。

的文件MemorySwapMax說明了這一點

This setting is supported only if the unified control group hierarchy is used and disables MemoryLimit=.

有人可以讓我知道如何知道unified control group hierarchy我的設置中是否正在使用 systemd,或者還有什麼可能是不允許MemorySwapMax生效的問題?

編輯

如this answer中所述,我可以看到已cgroup2啟用

ubuntu@vrni-platform:/tmp/debraj$ sudo mount -t cgroup2 none /tmp/debraj
ubuntu@vrni-platform:/tmp/debraj$ ls -l /tmp/debraj/
total 0
-r--r--r--  1 root root 0 Jul  2 17:13 cgroup.controllers
-rw-r--r--  1 root root 0 Jul  2 17:13 cgroup.max.depth
-rw-r--r--  1 root root 0 Jul  2 17:13 cgroup.max.descendants
-rw-r--r--  1 root root 0 Jun 30 14:42 cgroup.procs
-r--r--r--  1 root root 0 Jul  2 17:13 cgroup.stat
-rw-r--r--  1 root root 0 Jul  2 17:13 cgroup.subtree_control
-rw-r--r--  1 root root 0 Jul  2 17:13 cgroup.threads
drwxr-xr-x  2 root root 0 Jun 30 14:42 init.scope
drwxr-xr-x 87 root root 0 Jul  2 15:05 system.slice
drwxr-xr-x  7 root root 0 Jun 30 15:22 user.slice
ubuntu@vrni-platform:/tmp/debraj$ sudo umount /tmp/debraj

這已在 systemd 郵件列表中得到解答。

連結1

重新發布相關部分。

看起來您的 Ubuntu 版本預設使用“混合”cgroup 模式。Cgroup v2 確實在你的核心中啟用,但不一定 在使用——在混合模式下,systemd 仍然以 v1 模式掛載所有資源控制器(cpu、記憶體等),並且只在 v2 樹中設置自己的程序跟踪。見findmnt

您可以使用 systemd.unified_cgroup_hierarchy=1 核心選項啟動以將所有內容切換到 cgroups v2,但如果您使用的是容器軟體(docker、podman),請確保它們與 cgroups v2 兼容。

連結2

你好,德布拉傑。

2021 年 7 月 8 日星期四下午 05:10:44 +0530,Debraj Manna 寫道:

> > > > > > > > > > > > Linux vrni-platform 4.15.0-143-generic #147-Ubuntu SMP Wed Apr 14 16:10:11 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux > > > > > > > > > $$ … $$ > > > GRUB_CMDLINE_LINUX=“audit=1 rootdelay=180 nousb net.ifnames=0 biosdevname=0 fsck.mode=force fsck.repair=yes ipv6.disable=1 systemd.unified_cgroup_hierarchy=1” > > > > > > > > > > > > 即使在進行這些更改之後 MemorySwapMax 也不會生效。 > > >

您還需要添加 swapaccount=1,僅從核心 v5.8 開始預設啟用交換記帳。

引用自:https://serverfault.com/questions/1068499