Définir une limite de ressources par défaut pour tous les utilisateurs avec des groupes de contrôle systemd

9

Je peux définir une limite de mémoire pour les utilisateurs comme ceci:

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

Existe-t-il un moyen pour que cela s'applique à tous les utilisateurs? Je voudrais que chaque utilisateur obtienne 24G, pas un total de 24G pour tous les processus utilisateur (ce qui, je pense, serait le résultat de la configuration user.slicedirecte).

kai
la source

Réponses:

7

Il ne semble pas y avoir de moyen officiellement soutenu de le faire. (C'est incorrect. Voir le bas) Une manière officiellement découragée (car elle manipule le groupe de contrôle) est la suivante:

Faites le fichier suivant comme /etc/systemd/system/[email protected]/set-memhigh.conf

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

Créez ensuite le fichier suivant en tant que "/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

Vous pouvez voir si cela fonctionne ou non en exécutant

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

Si "/sys/fs/cgroup/user.slice" n'existe pas, la hiérarchie de groupe de contrôle unifiée n'est pas activée. Nous devons l'activer en tant que https://unix.stackexchange.com/a/452728/297666

Bien que cela fonctionne, je ne sais pas si vous aimez ça ...

Note ajoutée le 25 juillet: La création du fichier suivant comme /etc/systemd/system/user-1000.slicepour chaque utilisateur (remplacement de 1000 par l'UID de l'utilisateur) impose une limitation de mémoire à cet utilisateur. Je l'ai vérifié sur systemd 237 sur ubuntu 18.04 et Debian strecth avec systemd 237 installé à partir de stretch-backports:

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

L'inconvénient est que nous devons créer le fichier ci-dessus pour chaque utilisateur. Avec systemd 239 , nous pouvons créer le fichier ci-dessus au fur /etc/systemd/system/user-.slice.d/memory.confet à mesure que la limitation de mémoire est imposée à chaque utilisateur. Mais il y a un bogue dans systemd 239 (ce bogue a été corrigé dans 240) et il ne fonctionne pas comme prévu. Pour contourner le bogue, créez le fichier suivant en tant que user-0.sliceet exécutez systemctl enable user-0.slice. Nous n'avons pas à créer le fichier suivant pour chaque utilisateur.

[Unit]
Before=systemd-logind.service
[Slice]
Slice=user.slice
[Install]
WantedBy=multi-user.target
Ryutaroh Matsumoto
la source
Cela ressemble à une solution de contournement décente en attendant, mais je tiendrai pour une version plus officielle.
kai
1
@kai J'ai trouvé des moyens officiels de limiter la mémoire et les ai ajoutés à ma réponse ci-dessus. J'espère que c'est utile.
Ryutaroh Matsumoto du
1
Je vais le tester, mais cela ressemble exactement à ce dont j'ai besoin (à l'exception de ce bug)
kai