Назад | Перейти на главную страницу

Установка MemoryLimit для созданной пользователем области systemd с использованием cgroups в качестве пользователя

Связанный: Ограничение общего использования памяти дочерними процессами

Есть ли способ для непривилегированного пользователя или для пользователя 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

Я тестирую это на Debian unstable с systemd 215. Ядро 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 отсутствует.

Кажется, что это сработает, если сделать так:

$ 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.

Хорошо, поэтому правильный ответ: вы не можете установить ограничения cgroup для пользовательских процессов (во всяком случае, на момент написания этого ответа).

Ссылка из списка рассылки systemd-devel:

Мы просто сейчас этого не поддерживаем. Непривилегированные пользователи не получают сейчас доступа к свойствам контрольной группы различных контроллеров просто потому, что это небезопасно.

Мы можем открыть это однажды, по крупицам, но для этого потребуется некоторая работа с ядром и согласие Tejun, что это безопасно.

Это был апрель 2015 года, и я предполагаю, что с тех пор ничего не изменилось.