So begrenzen Sie den Speicher für einen von systemd verwalteten Dienst

8

Ich kenne ulimit und weiß, wie ich den Speicher für einen Prozess begrenzen kann, den ich explizit starte, oder ein Skript verwende. In diesem Fall habe ich jedoch einen Dienst, der von systemd verwaltet und gestartet wird.

Wie kann ich den maximalen Speicher begrenzen und ihn töten lassen (oder noch besser: Verhindern Sie die Speicherzuweisung (Rückgabe von NULL an malloc/ realloc)), wenn der maximale Speicherbedarf erreicht ist?

Petr
quelle

Antworten:

8

Die Manpage fürsystemd.exec enthält eine Liste der LimitXXXX-Anweisungen und eine praktische Tabelle, in der sie ulimitüber den setrlimit()Systemaufruf mit den Optionen verglichen werden.

Um den gesamten Adressraum ( ulimit -v) des Prozesses einzuschränken, verwenden Sie LimitAS=. Andernfalls wird nur die Verwendung von stack ( ulimit -s) LimitSTACK=oder data segment ( ulimit -d) eingeschränktLimitDATA=

Laut setrlimit()Manpage führen diese Grenzwerte dazu, dass die Zuweisung von zusätzlichem Speicher fehlschlägt. STACK und AS beenden das Programm mit einem Sigsegv, wenn das Limit erreicht ist und der Stack wachsen muss (und das Programm dies nicht behandelt hat).

DerfK
quelle
5

Systemd unterstützt die Begrenzung der Speichernutzung über die Option MemoryLimit, wie unter https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html beschrieben

Die Art und Weise, wie das System mit der Situation umgeht, in der der maximal zulässige Speicher (pro Dienst) erschöpft ist, hängt sowohl von der zugrunde liegenden Implementierung der cgroups als auch von der Art und Weise ab, wie systemd die Ressourcensteuerung implementiert. Ich vermute, der Prozess würde beendet werden (über OOM-Killer).

ivuk
quelle
1
Würde es den Dienst neu starten, wenn das Speicherlimit erreicht ist?
Aftab Naveed
3

Für Grenzen analog zu ulimit:

man systemd.exec

...
LimitAS=(like ulimit -v)
...
LimitRSS=(like ulimit -m)
...
Dan Armstrong
quelle