Steigern Sie die Serverleistung mit systemd

1377
user116804

Ich möchte eine langwierige, speicherintensive Aufgabe ausführen, ohne die Leistung meines Servers zu beeinträchtigen. Mein Server hat 4 GB RAM und ich habe eine Swap-Datei mit 30 GB erstellt.

Es gibt ein sehr speicherintensives Programm (das komplexe Abfragen für eine riesige Datenbank durchführt), das den Server nach einiger Zeit so stark belastet, dass ich mich sogar nicht über SSH anmelden kann.

Mein Plan war, die Ressourcen dieses Programms über systemd zu beschränken. Verhindern Sie zunächst den Austausch für Benutzer- und Systemprogramme:

# systemctl edit user.slice [Slice] MemorySwapMax=0 

Und

# systemctl edit system.slice [Slice] MemorySwapMax=0 

Dann erstellen Sie ein Slice für das speicherintensive Programm:

[Slice] CPUAccounting=true CPUShares=512 MemoryLimit=1G MemoryMax=1.1G MemorySwapMax=infinity 

Dies sollte verhindern, dass das Programm mehr als 1 GB RAM verwendet, es kann jedoch so viel ausgetauscht werden, wie es will - oder?

Leider funktioniert das nicht. Entweder wird das Programm abgebrochen oder der Server ist nach einiger Zeit nicht erreichbar (wenn mit den Werten herumgespielt wird).

Ist das, was ich gerne mache, möglich? Wenn ja, wie würde ich das tun?

Edit: meine Lösung

echo 100 > /sys/fs/cgroup/memory/<myswappingslice>.slice/memory.swappiness echo 0 > /sys/fs/cgroup/memory/user.slice/memory.swappiness echo 0 > /sys/fs/cgroup/memory/system.slice/memory.swappiness 

Das ist alles. Ich weise den speicherverbrauchenden Dienst zu .slice zu, damit er aggressiv wechselt und nicht den gesamten Arbeitsspeicher beansprucht. Durch das Verhindern des Austauschs von user.slice und system.slice wird die Gesamtleistung des Servers nicht negativ beeinflusst.

1
Haben Sie einen physischen Server oder einen gemieteten virtuellen Server? Wenn Sie einen virtuellen Server mieten, hat der Host möglicherweise zusätzliche Einschränkungen für die Ressourcennutzung. Mark Stosberg vor 7 Jahren 0

2 Antworten auf die Frage

0
Mark Stosberg

Die MemorySwapMax=Direktive wurde in systemd 232 eingeführt. Wenn Sie eine ältere Version verwenden, steht Ihnen diese Direktive möglicherweise nicht zur Verfügung.

Es gibt keine Direktive MemoryMax=, aber es gibt eine MemoryLimit=.

Siehe man systemd.directivesfür eine Liste aller Richtlinien in Ihrer installierten Version von systemd, einschließlich Verweise auf die manSeiten, die sie in dokumentiert sind.

0
Moscato

MemoryMax = existiert, ist aber relativ neu und ältere Versionen von systemd verwenden es möglicherweise nicht.

Überprüfen Sie die Dokumentation hier.

https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html