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


9

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

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

有没有一种方法可以适用于所有用户?我希望每个用户获得24G,而不是所有用户进程总共获得24G(我认为这是user.slice直接将其设置为打开的结果)。

Answers:


7

似乎没有官方支持的方法。(这是不正确的。请参阅底部) 正式不鼓励使用的方法(因为它操纵cgroup)如下:

将以下文件作为 /etc/systemd/system/user@.service.d/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每个用户创建以下文件(用用户的UID替换1000)对该用户施加了内存限制。我验证它systemd 237与systemd在Ubuntu 18.04和Debian strecth 237从拉伸backports中安装:

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

不便之处在于,我们必须为每个用户制作上述文件。使用systemd 239,我们可以像上面那样创建文件,/etc/systemd/system/user-.slice.d/memory.conf并且对每个用户都施加了内存限制。但是systemd 239中有一个错误 (此错误已在240中得到纠正),并且无法按预期工作。要解决该错误,请创建以下文件user-0.slice并运行systemctl enable user-0.slice。我们并没有要为每个用户提供以下文件。

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

同时,这看起来像是一个不错的解决方法,但我会争取更正式的版本。

1
@kai我找到了限制内存的官方方法,并将它们添加到上述我的答案中。希望它有用。
松本龙太郎'18

1
我将对其进行测试,但这看起来确实正是我所需要的(除了那个错误)
kai
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.