Configurando o MemoryLimit de um escopo systemd criado pelo usuário usando cgroups como usuário

4

Relacionados: Liberar o uso geral de memória para processos filhos

Existe uma maneira para um usuário não privilegiado, ou para o root permitir que um usuário não privilegiado crie um escopo systemd (ou outro grupo de controle gerenciado pelo systemd) para que o uso de memória do escopo seja limitado e que o limite seja configurável pelo usuário?

Ou, por que isso não alcança o efeito descrito acima:

$ 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

Estou testando isso no Debian unstable com o systemd 215. O kernel é 3.18.2 e compilado com o suporte necessário, acredito:

$ 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 define esses parâmetros, mas nada mais:

DefaultCPUAccounting=yes
DefaultBlockIOAccounting=yes
DefaultMemoryAccounting=yes

O que estou realmente tentando alcançar é uma maneira de limitar o RSS, como um usuário não privilegiado, um processo (ou um grupo de processos) sem limitar a memória virtual, ou seja, ulimit -v está fora.

    
por Sami Liedes 10.01.2015 / 11:58

2 respostas

3

Ok, então a resposta correta é que você não pode configurar os limites do cgroup para os processos do usuário (no momento de escrever esta resposta, de qualquer forma).

Ref da lista de discussão 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.

Isso foi em abril de 2015, e estou assumindo que nada mudou desde então.

    
por 18.09.2016 / 14:43
4

Parece funcionar se feito assim:

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

e, em seguida, verificar o status:

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

A chave é passar na propriedade com o sinalizador -p . Além disso, observe que, para o systemd do modo de usuário, o arquivo relevante para a configuração de padrões é, na verdade, /etc/systemd/user.conf e não /etc/systemd/system.conf .

    
por 02.10.2015 / 08:26