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

9

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? Gostaria que cada usuário obtivesse 24G, e não um total de 24G para todos os processos do usuário (o que eu acho que seria o resultado da configuração user.slicedireta).

kai
fonte

Respostas:

7

Parece não haver maneira oficialmente suportada de fazer isso. (Isso está incorreto. Veja a parte inferior) Uma maneira oficialmente desencorajada (porque manipula o cgroup) é a 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, crie 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 unificada do cgroup não estará ativada. Temos que habilitá-lo como https://unix.stackexchange.com/a/452728/297666

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

Nota adicionada em 25 de julho: Criar o seguinte arquivo /etc/systemd/system/user-1000.slicepara 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 Debian strecth com o systemd 237 instalado a partir de stretch-backports:

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

O inconveniente é que precisamos criar o arquivo acima para cada usuário. Com o systemd 239 , podemos criar o arquivo acima /etc/systemd/system/user-.slice.d/memory.confe a limitação de memória é imposta a todos os usuários. Mas há um erro no systemd 239 (este bug foi corrigido em 240) e não funciona como pretendido. Para contornar o bug, crie o seguinte arquivo como user-0.slicee 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
Ryutaroh Matsumoto
fonte
Enquanto isso, parece uma solução decente, mas vou aguardar uma versão mais oficial.
kai
1
@kai Encontrei formas oficiais de limitação de memória e as adicionei à minha resposta acima. Espero que seja útil.
Ryutaroh Matsumoto
1
Vou testá-lo, mas esta parece ser exatamente o que eu preciso (exceto para que o bug)
kai