Linux
使用 cgroups 作為使用者設置使用者創建的 systemd 範圍的 MemoryLimit
有沒有辦法讓非特權使用者或 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 限制(無論如何,在編寫此答案時)。
我們現在根本不支持這一點。非特權使用者現在無法訪問各種控制器的 cgroup 屬性,僅僅是因為這是不安全的。
我們可以在某一天一點一點地打開它,但這需要一些核心工作,並且 Tejun 確認這是安全的。
這是 2015 年 4 月,我假設從那以後一切都沒有改變。