web-dev-qa-db-ja.com

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が出力されます。

4
Sami Liedes

正解は、ユーザープロセスのcgroup制限を設定できない(とにかく、この回答の執筆時点)です。

systemd-develメーリングリストからの参照

現在、これはサポートされていません。特権のないユーザーは、安全でないという理由だけで、現在、さまざまなコントローラーのcgroupプロパティにアクセスできません。

これを1日少しずつ開くことができますが、これにはカーネルの作業が必要であり、TejunからのOKで安全です。

これは2015年4月で、それ以来何も変わっていないと思います。

4
Chris Salzberg

このようにするとうまくいくようです:

$ 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の場合、デフォルトの構成に関連するファイルは実際には/etc/systemd/user.confであり、/etc/systemd/system.confではないことに注意してください。

4
Nathan Williams