在 Ubuntu 18.04 中限制 systemd 服务的交换使用

在 Ubuntu 18.04 中限制 systemd 服务的交换使用

我正在尝试使用MemorySwapMax文档使用 Ubuntu 18.04。

环境

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

我尝试通过为 指定 0 来禁用此进程的交换MemorySwapMax。但似乎有一些问题在 systemd 中,该问题已在 systemd 239 中修复。

因此我也尝试设置MemorySwapMax=1M。但这似乎也没有限制此 systemd 服务的交换内存使用量。

文档说明MemorySwapMax了这一点

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

有人能告诉我如何知道 systemd 是否unified control group hierarchy正在我的设置中使用,或者还有什么问题导致其无法MemorySwapMax生效?

编辑

正如本文所提到的回答我可以看到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

答案1

systemd 邮件列表中已回答此问题。

链接1

重新发布相关部分。

看起来你的 Ubuntu 版本默认使用“混合” cgroup 模式。Cgroup v2 确实已启用在你的内核中,但不一定 正在使用– 在混合模式下,systemd 仍以 v1 模式挂载所有资源控制器(cpu、内存等),并在 v2 树中仅设置自己的进程跟踪。请参阅findmnt

您可以使用 systemd.unified_cgroup_hierarchy=1 内核选项进行启动,将所有内容切换到 cgroups v2,但如果您使用容器软件(docker、podman),请确保它们与 cgroups v2 兼容。

链接2

你好,Debraj。

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

Linux vrni-platform 4.15.0-143-generic #147-Ubuntu SMP 2021 年 4 月 14 日星期三 16:10:11 UTC 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 起,交换会计才默认启用。

相关内容