Legen Sie ein Standardressourcenlimit für alle Benutzer mit systemd cgroups fest

9

Ich kann ein Speicherlimit für Benutzer wie folgt festlegen:

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

Gibt es eine Möglichkeit, dies für alle Benutzer zu gelten? Ich möchte, dass jeder Benutzer 24G erhält, nicht insgesamt 24G für alle Benutzerprozesse (was meiner Meinung nach das Ergebnis einer user.slicedirekten Aktivierung wäre ).

kai
quelle

Antworten:

7

Es scheint keinen offiziell unterstützten Weg zu geben, dies zu tun. (Dies ist falsch. Siehe unten) Ein offiziell entmutigter Weg (weil er die cgroup manipuliert) ist wie folgt:

Machen Sie die folgende Datei als /etc/systemd/system/[email protected]/set-memhigh.conf

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

Erstellen Sie dann die folgende Datei als "/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

Sie können sehen, ob es funktioniert oder nicht, indem Sie ausführen

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

Wenn "/sys/fs/cgroup/user.slice" nicht vorhanden ist, ist die einheitliche cgroup-Hierarchie nicht aktiviert. Wir müssen es als /unix//a/452728/297666 aktivieren

Obwohl es funktioniert, bin ich mir nicht sicher, ob Ihnen das gefällt ...

Hinweis hinzugefügt am 25. Juli: Wenn Sie die folgende Datei /etc/systemd/system/user-1000.slicefür jeden Benutzer erstellen (1000 durch die UID des Benutzers ersetzen), wird diesem Benutzer eine Speicherbeschränkung auferlegt. Ich habe es auf systemd 237 unter ubuntu 18.04 und Debian strecth mit systemd 237 überprüft, das von Stretch-Backports installiert wurde:

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

Die Unannehmlichkeit ist, dass wir die obige Datei für jeden Benutzer erstellen müssen . Mit systemd 239 können wir die obige Datei als erstellen /etc/systemd/system/user-.slice.d/memory.confund die Speicherbeschränkung wird jedem Benutzer auferlegt. Es gibt jedoch einen Fehler in systemd 239 (dieser Fehler wurde in 240 behoben) und er funktioniert nicht wie beabsichtigt. Um den Fehler zu umgehen, erstellen Sie die folgende Datei als user-0.sliceund führen Sie sie aus systemctl enable user-0.slice. Wir müssen nicht für jeden Benutzer die folgende Datei erstellen.

[Unit]
Before=systemd-logind.service
[Slice]
Slice=user.slice
[Install]
WantedBy=multi-user.target
Ryutaroh Matsumoto
quelle
Dies sieht in der Zwischenzeit nach einer anständigen Problemumgehung aus, aber ich werde mich für eine offiziellere Version einsetzen.
Kai
1
@kai Ich habe offizielle Wege zur Speicherbeschränkung gefunden und sie zu meiner obigen Antwort hinzugefügt. Hoffe es nützlich.
Ryutaroh Matsumoto
1
Ich werde es testen, aber das sieht genau so aus, wie ich es brauche (mit Ausnahme dieses Fehlers)
kai