Imposta un limite di risorse predefinito per tutti gli utenti con cgroups di systemd


9

Posso impostare un limite di memoria per gli utenti in questo modo:

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

C'è un modo per applicare questo per tutti gli utenti? Vorrei che ogni utente ricevesse 24 G, non un totale di 24 G per tutti i processi utente (che penso sarebbe il risultato dell'impostazione user.slicediretta).

Risposte:


7

Non sembra esserci un modo ufficialmente supportato per farlo. (Questo non è corretto. Vedi in basso) Un modo ufficialmente scoraggiato (perché manipola il cgroup) è il seguente:

Crea il seguente file come /etc/systemd/system/user@.service.d/set-memhigh.conf

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

Quindi rendere il seguente file come "/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

Puoi vedere se funziona o meno eseguendo

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

Se "/sys/fs/cgroup/user.slice" non esiste, la gerarchia di cgroup unificata non è abilitata. Dobbiamo abilitarlo come https://unix.stackexchange.com/a/452728/297666

Anche se funziona, non sono sicuro che ti piaccia ...

Nota aggiunta il 25 luglio: la creazione del seguente file come /etc/systemd/system/user-1000.sliceper ogni utente (sostituendo 1000 con UID dell'utente) impone una limitazione di memoria per quell'utente. L'ho verificato su systemd 237 su Ubuntu 18.04 e Debian strecth con systemd 237 installato da stretch-backport:

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

L'inconveniente è che dobbiamo creare il file sopra per ogni utente. Con systemd 239 , possiamo creare il file sopra come /etc/systemd/system/user-.slice.d/memory.confe la limitazione della memoria è imposta a ogni utente. Ma c'è un bug in systemd 239 (questo bug è stato corretto in 240) e non funziona come previsto. Per aggirare il bug, creare il seguente file come user-0.sliceed eseguire systemctl enable user-0.slice. Non è necessario creare il seguente file per ciascun utente.

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

Nel frattempo sembra una soluzione decente, ma aspetterò una versione più ufficiale.
kai,

1
@kai Ho trovato modi ufficiali per limitare la memoria e li ho aggiunti alla mia risposta sopra. Spero sia utile.
Ryutaroh Matsumoto,

1
Lo proverò, ma questo sembra esattamente ciò di cui ho bisogno (tranne per quel bug)
kai
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.