Defina um limite de recurso padrão para todos os usuários com cgroups systemd

6

Eu posso definir um limite de memória para usuários assim:

systemctl set-property user-UID.slice MemoryHigh=24G

Existe uma maneira de isso se aplicar a todos os usuários? Eu gostaria que cada usuário recebesse 24G, não um total de 24G para todos os processos do usuário (o que eu acho que seria o resultado da configuração em user.slice diretamente).

    
por kai 14.03.2017 / 20:41

1 resposta

3

Parece não haver nenhuma maneira oficialmente suportada para fazer isso. (Isso está incorreto. Veja na parte inferior) Uma maneira oficialmente desencorajada (porque manipula o cgroup) é o seguinte:

Faça o seguinte arquivo como /etc/systemd/system/[email protected]/set-memhigh.conf

[Service]
Type=simple
ExecStartPost=+/root/set-memoryhigh.sh %i

Em seguida, faça o seguinte arquivo como "/root/set-memoryhigh.sh"

#!/bin/bash
exec >>/var/tmp/log.txt 2>&1 # for logging
set -x # for logging 
for d in /sys/fs/cgroup /sys/fs/cgroup/user.slice /sys/fs/cgroup/user.slice/user-$1.slice; do
  echo "+memory" >>${d}/cgroup.subtree_control
done
/bin/echo "24G" >> /sys/fs/cgroup/user.slice/user-$1.slice/memory.high

Você pode ver se funciona ou não, executando

cat /sys/fs/cgroup/user.slice/user-${UID}.slice/memory.high

Se "/sys/fs/cgroup/user.slice" não existir, a hierarquia de cgroups unificada não será ativada. Temos de ativá-lo como link

Embora funcione, não tenho certeza se você gosta disso ...

Observação adicionada em 25 de julho: A criação do seguinte arquivo como /etc/systemd/system/user-1000.slice para cada usuário (substituindo 1000 pelo UID do usuário) impõe uma limitação de memória a esse usuário. Eu verifiquei no systemd 237 no Ubuntu 18.04 e no Debian strecth com systemd 237 instalado a partir do stretch-backports:

[Slice] Slice=user.slice MemoryHigh=24G

O inconveniente é que temos que criar o arquivo acima para cada usuário. Com o systemd 239 , podemos fazer o arquivo acima como /etc/systemd/system/user-.slice.d/memory.conf e a limitação de memória é imposta a cada usuário. Mas existe um bug no systemd 239 e ele não funciona como esperado. Para contornar o erro, faça o seguinte arquivo como user-0.slice e execute systemctl enable user-0.slice . Nós não temos que fazer o seguinte arquivo para cada usuário.

[Unit] Before=systemd-logind.service [Slice] Slice=user.slice [Install] WantedBy=multi-user.target

    
por 30.06.2018 / 01:16