使用cgroups作为用户来设置用户创build的systemd作用域的MemoryLimit

相关: 使subprocess的整体内存使用

有没有一种方式让非特权用户或root用户允许非特权用户创build一个systemd作用域(或由systemdpipe理的其他控制组),以便该作用域的内存使用量是有限的,并且该限制可由用户?

或者,为什么这不能达到上述效果:

$ 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 

我正在使用systemd 215对Debian unstable进行testing。内核是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 

/etc/systemd.system.conf设置这些参数,但没有别的:

 DefaultCPUAccounting=yes DefaultBlockIOAccounting=yes DefaultMemoryAccounting=yes 

我真正想要实现的是一种限制RSS的方法,作为一个非特权用户,一个进程(或一组进程),而不限制虚拟内存,即ulimit -v不在。

好的,所以正确的答案是你不能为用户进程设置cgroup限制 (无论如何,在写这个答案的时候)。

从systemd-devel邮件列表中引用 :

我们现在根本不支持这个。 非特权用户现在不能访问各种控制器的cgroup属性,只是因为这是不安全的。

有一天我们可以一点点地打开它,但是这需要一些内核工作,而Tejun的确定这是安全的。

这是2015年4月,而且我以前没有任何改变。

这似乎工作,如果这样做:

 $ systemd-run --scope --user --unit limit-test.scope -p MemoryAccounting=yes -p MemoryLimit='10M' bash 

然后检查状态:

 $ systemctl show --user limit-test.scope | grep Mem MemoryCurrent=18446744073709551615 MemoryAccounting=yes MemoryLimit=10485760 

关键是要通过属性与-p标志。 此外,请注意,对于用户模式systemd,configuration默认值的相关文件实际上是/etc/systemd/user.conf ,而不是/etc/systemd/system.conf