Establezca un límite de recursos predeterminado para todos los usuarios con systemd cgroups

9

Puedo establecer un límite de memoria para los usuarios de esta manera:

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

¿Hay alguna manera de que esto se aplique a todos los usuarios? Me gustaría que cada usuario obtenga 24G, no un total de 24G para todos los procesos de usuario (lo que creo que sería el resultado de configurarlo user.slicedirectamente).

kai
fuente

Respuestas:

7

Parece que no hay una forma oficial de hacerlo. (Esto es incorrecto. Vea la parte inferior) Una forma oficialmente desaconsejada (porque manipula el cgroup) es la siguiente:

Haga el siguiente archivo como /etc/systemd/system/[email protected]/set-memhigh.conf

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

Luego haga el siguiente archivo 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

Puede ver si funciona o no ejecutando

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

Si "/sys/fs/cgroup/user.slice" no existe, entonces la jerarquía unificada de cgroup no está habilitada. Tenemos que habilitarlo como https://unix.stackexchange.com/a/452728/297666

Aunque funciona, no estoy seguro si te gusta esto ...

Nota agregada el 25 de julio: Hacer el siguiente archivo /etc/systemd/system/user-1000.slicepara cada usuario (reemplazando 1000 por el UID del usuario) impone una limitación de memoria a ese usuario. Lo verifiqué en systemd 237 en ubuntu 18.04 y Debian strecth con systemd 237 instalado desde estiramiento-backports:

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

El inconveniente es que tenemos que hacer el archivo anterior para cada usuario. Con systemd 239 , podemos hacer el archivo anterior como /etc/systemd/system/user-.slice.d/memory.confy la limitación de memoria se impone a cada usuario. Pero hay un error en systemd 239 (este error se corrigió en 240) y no funciona según lo previsto. Para evitar el error, cree el siguiente archivo como user-0.slicey ejecútelo systemctl enable user-0.slice. Nosotros no tenemos que hacer la siguiente archivo para cada usuario.

[Unit]
Before=systemd-logind.service
[Slice]
Slice=user.slice
[Install]
WantedBy=multi-user.target
Ryutaroh Matsumoto
fuente
Mientras tanto, esto parece una solución decente, pero esperaré para una versión más oficial.
kai
1
@kai Encontré formas oficiales de limitación de memoria y las agregué a mi respuesta anterior. Espero que sea útil.
Ryutaroh Matsumoto
1
Lo probaré, pero esto parece exactamente lo que necesito (excepto ese error)
kai