使用 systemd cgroups 为所有用户设置默认资源限制

使用 systemd cgroups 为所有用户设置默认资源限制

我可以为用户设置内存限制,如下所示:

systemctl set-property user-UID.slice MemoryHigh=24G

有没有办法让它适用于所有用户?我希望每个用户获得 24G,而不是所有用户进程总共 24G(我认为这将是user.slice直接设置它的结果)。

答案1

似乎没有官方支持的方法可以做到这一点。(这是错误的。见底部) 官方不鼓励的一种方式(因为它操纵了 cgroup)如下:

将以下文件设为/etc/systemd/system/[email protected]/set-memhigh.conf

[Service]
Type=simple
ExecStartPost=+/root/set-memoryhigh.sh %i

然后将以下文件创建为“/root/set-memoryhigh.sh”

#!/bin/bash
exec >>/var/tmp/log.txt 2>&1 # for logging
set -x # for logging 
for d in /sys/fs/cgroup /sys/fs/cgroup/user.slice /sys/fs/cgroup/user.slice/user-$1.slice; do
  echo "+memory" >>${d}/cgroup.subtree_control
done
/bin/echo "24G" >> /sys/fs/cgroup/user.slice/user-$1.slice/memory.high

您可以通过运行来查看它是否有效

cat /sys/fs/cgroup/user.slice/user-${UID}.slice/memory.high

如果“/sys/fs/cgroup/user.slice”不存在,则未启用统一 cgroup 层次结构。我们必须将其启用为https://unix.stackexchange.com/a/452728/297666

虽然它有效,但我不确定你是否喜欢这个......

7 月 25 日添加的注释:制作以下/etc/systemd/system/user-1000.slice文件每个user(用用户的 UID 替换 1000)对该用户施加内存限制。我在systemd上验证了它第237章在 ubuntu 18.04 和 Debian strecth 上使用 systemd第237章从stretch-backport安装:

[Slice]
Slice=user.slice
MemoryHigh=24G

不便之处在于我们必须将上述文件制作为每个用户。与系统239,我们可以将上述文件制作为/etc/systemd/system/user-.slice.d/memory.conf并对每个用户施加内存限制。但systemd 239 中有一个错误 (这个bug在240被修正)并且它没有按预期工作。要解决该错误,请将以下文件创建为user-0.slice并运行systemctl enable user-0.slice.我们的确是不是必须为每个用户制作以下文件。

[Unit]
Before=systemd-logind.service
[Slice]
Slice=user.slice
[Install]
WantedBy=multi-user.target

相关内容