Sam*_*des 4 linux debian memory-usage cgroup systemd
有没有办法让非特权用户或 root 允许非特权用户创建一个 systemd 作用域(或由 systemd 管理的其他控制组),以便限制该作用域的内存使用量,并且该限制可以由用户?
或者说,为什么这样达不到上面描述的效果:
$ systemd-run --scope --user --unit=limit-test.scope bash
Running as unit limit-test.scope.
$ systemctl show --user limit-test.scope |grep Mem
MemoryAccounting=no
MemoryLimit=18446744073709551615
$ systemctl set-property --user limit-test.scope MemoryAccounting=yes
$ systemctl set-property --user limit-test.scope MemoryLimit=100M
$ systemctl show --user limit-test.scope |grep Mem
MemoryAccounting=yes
MemoryLimit=104857600
$ python
>>> a = [1]*1000000000 # happily eats 7.4G of RAM
Run Code Online (Sandbox Code Playgroud)
我正在使用 systemd 215 的 Debian stable 上进行测试。内核是 3.18.2 并使用所需的支持进行编译,我相信:
$ zgrep -E 'CGROUP|MEMCG' /proc/config.gz
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
CONFIG_MEMCG_SWAP_ENABLED=y
CONFIG_MEMCG_KMEM=y
# CONFIG_CGROUP_HUGETLB is not set
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y
Run Code Online (Sandbox Code Playgroud)
/etc/systemd.system.conf 设置这些参数,但没有其他参数:
DefaultCPUAccounting=yes
DefaultBlockIOAccounting=yes
DefaultMemoryAccounting=yes
Run Code Online (Sandbox Code Playgroud)
我真正想要实现的是一种对 RSS 进行限制的方法,作为非特权用户,一个进程(或一组进程)而不限制虚拟内存,即 ulimit -v 已经退出。
如果这样做的话,它似乎可以工作:
$ systemd-run --scope --user --unit limit-test.scope -p MemoryAccounting=yes -p MemoryLimit='10M' bash
Run Code Online (Sandbox Code Playgroud)
然后检查状态:
$ systemctl show --user limit-test.scope | grep Mem
MemoryCurrent=18446744073709551615
MemoryAccounting=yes
MemoryLimit=10485760
Run Code Online (Sandbox Code Playgroud)
关键是传递带有-p
标志的属性。另请注意,对于用户模式 systemd,配置默认值的相关文件实际上是/etc/systemd/user.conf
,而不是/etc/systemd/system.conf
。