Linux

使用 cgroups 作為使用者設置使用者創建的 systemd 範圍的 MemoryLimit

  • September 18, 2016

相關:限制子程序的整體記憶體使用

有沒有辦法讓非特權使用者或 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

我正在使用 systemd 215 在 Debian 上進行測試。核心是 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 月,我假設從那以後一切都沒有改變。

引用自:https://serverfault.com/questions/658579