Connexe : Limiter l'utilisation globale de la mémoire pour les processus enfants

Existe-t-il un moyen pour un utilisateur non privilégié, ou pour root d'autoriser un utilisateur non privilégié, à créer une portée systemd (ou un autre groupe de contrôle géré par systemd) afin que l'utilisation de la mémoire de la portée soit limitée et que la limite soit réglable par le utilisateur?

Ou, pourquoi cela n'atteint-il pas l'effet décrit ci-dessus :

$ 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

Je teste cela sur Debian instable avec systemd 215. Le noyau est 3.18.2 et compilé avec le support requis, je crois :

$ 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 définit ces paramètres, mais rien d'autre :

DefaultCPUAccounting=yes
DefaultBlockIOAccounting=yes
DefaultMemoryAccounting=yes

Ce que j'essaie vraiment de réaliser, c'est un moyen de limiter RSS, en tant qu'utilisateur non privilégié, un processus (ou un groupe de processus) sans limiter la mémoire virtuelle, c'est-à-dire ulimit -v est sorti.

answer

Ok, donc la bonne réponse est que vous ne pouvez pas configurer de limites de groupe de contrôle pour les processus utilisateur (au moment de la rédaction de cette réponse, de toute façon).

Réf de la liste de diffusion systemd-devel :

We simply do not support this right now. Unprivileged users do not get access to the cgroup properties of the various controllers right now, simply because this is unsafe.

We can open this up one day, bit by bit but this requires some kernel work, and an OK from Tejun that this is safe.

C'était en avril 2015, et je suppose que rien n'a changé depuis.

Cela semble fonctionner si c'est fait de cette façon:

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

puis en vérifiant l'état :

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

La clé étant de passer dans la propriété avec le -pdrapeau. Notez également que pour le mode utilisateur systemd, le fichier pertinent pour la configuration des valeurs par défaut est en fait /etc/systemd/user.conf, et non /etc/systemd/system.conf.