Braucht Ihr VPS Swap? Größe richtig berechnen
Viele Cloud-Images haben keinen Swap. Erfahren Sie, wann ein kleiner VPS eine Swap-Datei braucht, welche Größe sinnvoll ist und wann zram die bessere Wahl ist.
Braucht Ihr VPS Swap?
Die meisten Cloud-Images werden ohne Swap ausgeliefert. Auf einem kleinen VPS lautet die Antwort daher meistens: Ja, legen Sie eine Swap-Datei an. Swap macht aus einem Server mit 1 GB keinen Server mit 2 GB. Der Kernel erhält dadurch einen Speicherort für selten verwendete anonyme Speicherseiten. So bleibt der Seitencache nutzbar. Der OOM-Killer (Out-of-Memory-Killer, eine Kernelroutine, die einen Prozess auswählt und beendet, um Speicher freizugeben) wird dadurch zum letzten Ausweg und nicht zum ersten.
Kurz gesagt: Auf einem Server, auf dem einige langlebige Dienste laufen, ist eine kleine Swap-Datei den dafür benötigten Speicherplatz wert. Auf einem Server, auf dem ein Prozess regelmäßig mehr Speicher anfordert, als das gesamte System besitzt, wird Swap das Problem nicht lösen. Der Fehler tritt dadurch sogar langsamer auf und ist schwerer zu erkennen. Im restlichen Teil dieses Leitfadens geht es darum, diese beiden Fälle zu unterscheiden und die beiden Kosten zu verstehen, die nur auf einem VPS auftreten.
Für jeden folgenden Befehl benötigen Sie root-Rechte auf Ihrem eigenen Server. Führen Sie die Befehle daher dort aus, anstatt die Ausgabe vom Server einer anderen Person zu kopieren.
Was Swap tatsächlich bewirkt und was nicht
Linux-Speicher besteht aus zwei Arten. Dateigestützte Seiten sind Kopien von Daten, die bereits auf der Festplatte vorhanden sind: Ihre Programme und alle Dateien, die Sie kürzlich gelesen haben. Diese Sammlung ist der Page Cache. Anonyme Seiten sind Speicher ohne zugehörige Datei: Heap und Stack sowie der größte Teil dessen, was eine Datenbank zur Laufzeit reserviert.
Wenn der Speicher knapp wird, muss der Kernel Seiten zurückgewinnen. Eine unveränderte dateigestützte Seite kann einfach freigegeben werden, weil ihre Kopie auf der Festplatte weiterhin vorhanden ist und die Seite später erneut eingelesen werden kann. Bei einer anonymen Seite ist das anders, weil ihre einzige Kopie im RAM liegt. Ohne Swap hat der Kernel für anonymen Speicher zwei Möglichkeiten: ihn behalten oder den Prozess beenden, dem er gehört.
Ein Server ohne Swap verwendet weiterhin Paging. Allerdings verwendet er es für den falschen Speicher. Unter Speicherdruck verkleinert der Kernel den Page Cache und verdrängt Dateiseiten, die er bald wieder benötigt, einschließlich des ausführbaren Codes der laufenden Programme. Diese Seiten werden als Major Page Faults erneut eingelesen. In der bi-Spalte von vmstat sehen Sie Festplattenlesevorgänge, und der Zähler pgmajfault in /proc/vmstat steigt an, während si und so die ganze Zeit bei null bleiben. Das System thrasht, und die Swap-Zähler melden nichts.
Swap fügt keine Kapazität hinzu. Wenn der Working Set, also die tatsächlich verwendeten Seiten, größer als der RAM ist, macht Swap aus einem Out-of-Memory-Kill einen sehr langsamen Server. Manchmal ist das der gewünschte Kompromiss, weil Sie sich bei einem langsamen Server noch anmelden und ihn reparieren können, während dies bei einer beendeten Datenbank nicht möglich ist. Manchmal ist es schlechter, weil ein langsamer Server weiterhin Health Checks nicht besteht und dabei jede Verbindung offen hält. Entscheiden Sie, welchen Zustand Sie möchten, bevor Sie Swap hinzufügen.
Warum werden Cloud-Images ohne Swap ausgeliefert?
Das ist eine bewusste Entscheidung. Ein Image muss auf jedem Tarif booten, den ein Anbieter verkauft. Eine feste Swap-Partition würde auf kleinen Tarifen Speicherplatz verschwenden und wäre auf großen Tarifen unnötig. Die Geschwindigkeit von Swap hängt außerdem vom Speicher unterhalb des Gastsystems ab. Das Image kann diese Eigenschaft im Voraus nicht kennen. Image-Ersteller optimieren zudem auf vorhersehbares Verhalten. Ein Prozess, der sofort beendet wird, lässt sich in einer ganzen Flotte leichter diagnostizieren als ein System, das aktiv bleibt und jede Anfrage erst Sekunden später beantwortet.
Diese Gründe gelten für kurzlebige Systeme. Ein VPS, den Sie dauerhaft betreiben, ist etwas anderes. Sie reparieren ihn, statt ihn zu ersetzen. Deshalb sind einige Sekunden Paging meist besser als ein beendeter Dienst. Betrachten Sie den fehlenden Swap als Standard für einen anderen Anwendungsfall.
Auslagerungsdatei oder Auslagerungspartition auf einem VPS?
Verwenden Sie eine Datei. Eine Partition zu erstellen bedeutet, ein bereits partitioniertes Laufwerk mit einem aktiven Root-Dateisystem neu zu partitionieren. Das ist ein echtes Risiko ohne praktischen Nutzen. Eine Datei erstellen und entfernen Sie mit den üblichen Befehlen. Die Größe können Sie später ändern, ohne die Partitionstabelle anzufassen.
Die Geschwindigkeit ist nicht ausschlaggebend. Zum Zeitpunkt swapon liest der Kernel die Extent-Zuordnung der Datei einmal ein und übergibt die E/A anschließend direkt an das Blockgerät. Das Dateisystem ist daher nicht für jede Seite beim Ein- und Auslagern beteiligt. Auf demselben Laufwerk ist die Leistung einer Auslagerungsdatei und einer Auslagerungspartition identisch.
Zwei Einschränkungen sollten Sie kennen. Legen Sie keinen Auslagerungsspeicher auf einem Netzwerkdateisystem wie NFS (network file system) an. Unter btrfs muss bei der Datei Copy-on-Write deaktiviert und die Komprimierung ausgeschaltet sein. Deshalb liefert btrfs ein eigenes Hilfsprogramm zum Erstellen einer solchen Datei mit.
So fügen Sie unter Ubuntu oder Debian eine Swap-Datei hinzu
Prüfen Sie zunächst den aktuellen Zustand, bevor Sie Änderungen vornehmen.
swapon --show
free -h
findmnt -no FSTYPE /Eine leere Ausgabe von swapon --show bedeutet, dass überhaupt kein Swap vorhanden ist. Das ist bei einem frischen Cloud-Image der Normalfall. findmnt gibt den Typ des Root-Dateisystems aus. Davon hängt ab, wie Sie die Datei erstellen. Bei ext4, das die meisten Cloud-Images verwenden, ist fallocate sicher.
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfilechmod muss absichtlich vor mkswap ausgeführt werden. Wenn Sie diesen Schritt überspringen, weist mkswap darauf hin: mkswap: /swapfile: insecure permissions 0644, fix with: chmod 0600 /swapfile. Eine für alle Benutzer lesbare Swap-Datei gibt jedem Benutzer auf dem System Zugriff auf den Speicherinhalt, den andere Prozesse ausgelagert haben. Ein erfolgreicher mkswap bestätigt anschließend die Größe. Die Ausgabe enthält dann beispielsweise eine Zeile wie Setting up swapspace version 1, size = 2 GiB (2147479552 bytes).
Unter xfs oder btrfs kann der letzte Befehl mit swapon: /swapfile: swapon failed: Invalid argument fehlschlagen. Bei XFS liegt das daran, dass fallocate nicht beschriebene Extents hinterlässt. Schreiben Sie in diesem Fall stattdessen die Bytes.
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progressBei btrfs liegt die Ursache bei Copy-on-Write. Aktuelle Versionen von btrfs-progs setzen die erforderlichen Flags automatisch.
sudo btrfs filesystem mkswapfile --size 2g /swapfileFühren Sie anschließend in jedem Fall chmod 600, gegebenenfalls mkswap, und danach swapon aus. Prüfen Sie dann das Ergebnis.
swapon --show
free -hswapon --show sollte /swapfile mit dem Typ file und der angeforderten Größe auflisten. free -h sollte eine Swap-Zeile mit nahezu keinem belegten Speicher anzeigen. Bei einer frisch eingerichteten Umgebung ist ein Swap-Verbrauch von 0 korrekt. Der Kernel verschiebt Seiten erst dorthin, wenn dafür ein Grund besteht.
Machen Sie die Konfiguration reboot-fest und testen Sie den Eintrag sofort.
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo swapoff /swapfile
sudo swapon -a
swapon --showswapon -a liest /etc/fstab ein. Daher schlägt eine falsche Zeile jetzt und direkt sichtbar fehl. Einen Tippfehler, den Sie nicht testen, bemerken Sie erst bei einem ungeplanten Reboot, wenn das System ohne den erwarteten Swap wieder startet.
Um den Swap später zu entfernen, führen Sie sudo swapoff /swapfile aus, löschen Sie die Zeile aus fstab und führen Sie anschließend sudo rm /swapfile aus. swapoff muss zunächst alle ausgelagerten Seiten wieder in den RAM einlesen. Auf einem ausgelasteten System kann der Befehl daher mit swapoff: /swapfile: swapoff failed: Cannot allocate memory fehlschlagen. Geben Sie Speicher frei und versuchen Sie es erneut.
Wie groß sollte die Swap-Datei sein?
Der Dienst hält selten verwendete anonyme Speicherseiten vor. Entscheidend ist daher, wie viel des zugewiesenen Speichers tatsächlich ungenutzt ist, nicht wie viel RAM der Tarif bereitstellt. Der ungenutzte Speicher wächst nicht proportional zur Tarifgröße. Deshalb sinkt der Multiplikator bei größeren Tarifen. Diese Regel verwendet diese Anleitung.
The data behind this chart
[
{
"label": "1 GB plan",
"swap_gb": 2,
"swap_x_ram": 2
},
{
"label": "2 GB plan",
"swap_gb": 2,
"swap_x_ram": 1
},
{
"label": "4 GB plan",
"swap_gb": 2,
"swap_x_ram": 0.5
},
{
"label": "8 GB plan",
"swap_gb": 4,
"swap_x_ram": 0.5
},
{
"label": "16 GB plan",
"swap_gb": 4,
"swap_x_ram": 0.25
}
]Beim kleinsten Tarif beträgt die Swap-Größe 2 GB. Das entspricht dem 2-Fachen des RAM, weil ein System mit 1 GB so wenig Reserve hat, dass bereits eine einzelne Lastspitze den OOM-Killer auslösen kann. Am oberen Ende der Tabelle wird die Datei auf 4 GB beziehungsweise auf das 0.25-Fache des RAM begrenzt. Das Auslagern einer solchen Datenmenge auf gemeinsam genutzten Speicher dauert so lange, dass der Server währenddessen praktisch nicht verfügbar ist. Verringern Sie diese Werte, wenn Ihr verfügbarer Speicherplatz knapp ist, da die Datei tatsächlich Speicherplatz belegt.
Der wichtigste klassische Grund, Swap in der Größe des RAM oder größer anzulegen, ist der Ruhezustand. Dabei wird das vollständige Speicherabbild in den Swap geschrieben. Ein VPS verwendet keinen Ruhezustand. Diese Regel gilt für Sie daher nicht.
Was ändert vm.swappiness tatsächlich?
vm.swappiness ist kein Prozentsatz des RAM und kein Schwellenwert. Der Wert beschreibt die relativen Kosten, die der Kernel für das Freigeben anonymer Speicherseiten im Vergleich zu Dateiseiten ansetzt. Der Standardwert ist 60. Verringern Sie den Wert, bevorzugt der Kernel das Verwerfen des Page Cache. Erhöhen Sie ihn, bevorzugt der Kernel, anonyme Speicherseiten in den Swap auszulagern.
Das ist in beide Richtungen ein Abwägen. Bei vm.swappiness = 10 hält eine Datenbank mehr ihrer Speicherzuweisungen im RAM und bezahlt dafür, indem sie Dateien erneut einliest, die gerade aus dem Cache entfernt wurden. Auf einem Server, dessen eigentliche Aufgabe das Bereitstellen von Dateien ist, ist das die falsche Richtung, weil dort der Page Cache die nützliche Arbeit übernimmt.
Der Wert 0 deaktiviert den Swap nicht. Er weist den Kernel an, das Freigeben anonymer Speicherseiten zu vermeiden, bis der freie Speicher fast erschöpft ist. Dadurch wird der OOM-Killer früher aktiv, nicht später. Wenn Sie keinen Swap verwenden möchten, entfernen Sie die Swap-Datei.
sysctl vm.swappiness
printf 'vm.swappiness = 10\n' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system
sysctl vm.swappinessEin direkt gesetztes sysctl -w gilt nur bis zum nächsten Reboot und wird danach stillschweigend nicht mehr angewendet. Schreiben Sie den Wert daher in die Datei unter /etc/sysctl.d/. Kernel ab 5.8 akzeptieren Werte von 0 bis 200. Werte über 100 sind nur sinnvoll, wenn der Swap ungefähr so schnell wie der RAM ist. Das bedeutet zram.
zram: Swap, der CPU-Zeit statt Speicherplatz benötigt
zram ist ein komprimiertes Blockgerät im RAM. Wenn Sie es als Swap verwenden, wird eine Seite, die sonst auf die Festplatte geschrieben würde, komprimiert und bleibt im Arbeitsspeicher. Es entsteht kein Festplatten-I/O und kein Speicherplatz auf der Festplatte wird belegt. Der Preis dafür ist CPU-Zeit bei jedem Ein- und Auslagern von Seiten sowie der RAM, in dem die komprimierten Seiten liegen und der Ihren Anwendungen nicht mehr zur Verfügung steht.
Für anonyme Seiten werden üblicherweise Komprimierungsverhältnisse zwischen 2:1 und 3:1 veröffentlicht. Ihren eigenen Wert gibt zramctl in den Spalten DATA und COMPR aus. Messen Sie diesen Wert, statt mit dem typischen Verhältnis zu planen, da manche Workloads Daten enthalten, die sich kaum komprimieren lassen.
sudo apt install zram-toolsSetzen Sie ALGO=zstd und PERCENT=25 in /etc/default/zramswap und starten Sie anschließend den Dienst neu. Prüfen Sie danach das Ergebnis.
sudo systemctl restart zramswap
zramctl
swapon --showPERCENT ist ein Anteil des gesamten RAM. Der Wert 25 reserviert auf einem System mit 4 GB bis zu 1 GB für komprimierte Seiten. Beginnen Sie mit einem niedrigen Wert und erhöhen Sie ihn nur, wenn zramctl zeigt, dass sich das Gerät füllt. Die Einstellung PRIORITY in derselben Datei legt fest, welchen Swap der Kernel zuerst verwendet: Der höhere Wert hat Vorrang. Eine mit einfachem swapon hinzugefügte Swap-Datei erhält eine negative Priorität. Daher wird zram zuerst verwendet, und die Datei nimmt den verbleibenden Bedarf auf. swapon --show gibt beide Werte in der Spalte PRIO aus. Bei Distributionen, die statt zram-tools systemd-zram-generator verwenden, befinden sich dieselben Einstellungen in /etc/systemd/zram-generator.conf.
zram eignet sich für ein System mit verfügbarer CPU-Kapazität und wenig freiem Speicherplatz auf der Festplatte. Es ist die falsche Wahl, wenn die CPU-Zeit bereits die knappe Ressource ist, da die Komprimierung mit der Anwendung um dieselbe Kapazität konkurriert.
Zwei Swap-Fallen, die nur auf einem VPS zuschlagen
Die erste Falle ist der Speicherplatz. Eine 2 GB große Swap-Datei belegt in dem Moment 2 GB des Speicherplatzes Ihres Tarifs, in dem Sie sie erstellen, weil der Platz im Voraus zugewiesen werden muss. df -h / sinkt sofort um den vollständigen Betrag und steigt erst wieder, wenn Sie die Datei löschen. Bei einem kleinen Tarif ist das ein merklicher Anteil. Ein volles Root-Dateisystem verursacht außerdem deutlich mehr Probleme, als Swap jemals beheben kann. Die Datei wird auch in der Ausgabe von du gezählt. Das sollten Sie berücksichtigen, wenn Sie nach freiem Speicherplatz suchen und df und du unterschiedliche Angaben zum belegten Speicherplatz machen.
Die zweite Falle ist die Latenz. Ihre Swap-E/A läuft über den Speicher, den der Host mit seinen anderen Gastsystemen teilt. Die Auslastung dieser anderen Gastsysteme können Sie innerhalb Ihres Gastsystems nicht sehen. Sie sehen nur die Auswirkung: Das Einlesen einer Speicherseite dauert normalerweise nur kurz, manchmal aber deutlich länger. Der Prozess, der auf diese Seite wartet, bleibt stehen, bis sie eingelesen wurde. Das ist dieselbe Überlegung wie bei CPU-Steal-Time auf einem gemeinsam genutzten Host, angewendet auf die Speicherwarteschlange statt auf die Runqueue. Messen Sie die Latenz auf Ihrem eigenen System. Jede veröffentlichte Latenzangabe beschreibt die Nachbarn eines anderen Systems.
Woran erkennen Sie, dass Swap Ihnen schadet?
Verwendeter Swap ist kein Problem. Swap-Aktivität ist das Problem. Wenn auf einem Server mehrere hundert Megabyte im Swap liegen und keine Paging-Aktivität stattfindet, wurde lediglich Speicher ausgelagert, auf den seit Stunden nicht zugegriffen wurde. Genau das war beabsichtigt.
Beobachten Sie die Raten statt der Gesamtwerte.
vmstat 1 5si und so geben an, wie viele Kibibyte pro Sekunde ein- und ausgelagert werden. Auf einem gesunden System bleiben diese Werte unabhängig vom Inhalt der Spalte swpd bei oder nahe null. Ein anhaltender Wert von so bei gleichzeitig steigenden si bedeutet, dass Speicherseiten ausgelagert und unmittelbar wieder eingelesen werden. Das ist Thrashing.
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 3 1048572 38210 4096 61440 912 1180 2210 1290 1402 2890 9 7 12 72 0Dieses Beispiel zeigt ein System mit Problemen. Das deutlichste Signal steht nicht in den Swap-Spalten. Es ist wa mit dem Wert 72. Das bedeutet, dass die CPU die meiste Zeit auf I/O gewartet hat. b hat den Wert 3. Das bedeutet, dass drei Prozesse blockiert sind.
PSI (pressure stall information) beantwortet diese Frage direkter.
cat /proc/pressure/memorysome avg10=8.42 avg60=5.11 avg300=2.03 total=1284729
full avg10=3.10 avg60=1.94 avg300=0.71 total=498210some avg10=8.42 bedeutet, dass während der letzten 10 Sekunden mindestens eine Task 8.42 Prozent der Zeit auf Speicher gewartet hat. full erfasst die Zeit, in der jede nicht im Leerlauf befindliche Task blockiert war. Ein anhaltender Wert von full ist daher ein messbarer Schaden und kein Warnsignal. Wenn die Datei nicht existiert, ist PSI in Ihrem Kernel standardmäßig deaktiviert. Setzen Sie dann psi=1 in der Kernel-Befehlszeile.
So sehen Sie, welche Prozesse Speicherseiten im Swap halten:
sudo awk '/^Name:/{n=$2} /^VmSwap:/ && $2+0 > 0 {printf "%10d kB %s\n", $2, n}' /proc/[0-9]*/status | sort -rn | headSo prüfen Sie, ob der OOM-Killer bereits aktiv war:
sudo journalctl -k --grep "Out of memory"Ein Treffer sieht beispielsweise wie Out of memory: Killed process 2199 (mysqld) total-vm:1275860kB, anon-rss:129252kB, file-rss:0kB, shmem-rss:0kB, UID:114 pgtables:504kB oom_score_adj:0 aus. Das Service-Log enthält in derselben Sekunde den Eintrag Main process exited, code=killed, status=9/KILL. Wenn Sie diese Zeilen auf einem System ohne Swap gesehen haben, ist das Hinzufügen einer Swap-Datei der kostengünstigste nächste Versuch.
Wenn Swap die falsche Lösung ist
Swap verschafft Ihnen Zeit, wenn der Speicherdruck vorübergehend ist oder selten benötigte Speicherseiten betrifft. Für einen Prozess, der weiter wächst, bis er beendet wird, bringt Swap nichts. Außerdem lässt sich der Fehler dadurch schwerer überwachen, weil der Rechner zusätzliche Minuten mit dem Auslagern verbringt, statt schnell fehlzuschlagen und neu zu starten.
Begrenzen Sie stattdessen den Prozess. Ein systemd-Dienst akzeptiert MemoryMax= und MemorySwapMax= in einer Drop-in-Datei. Damit können Sie Speicher und CPU eines Dienstes mit systemd begrenzen, ohne die Anwendung zu ändern. Container bieten dieselben Steuerungsmöglichkeiten auf der nächsthöheren Ebene. Damit verhindern Sie, dass ein Compose-Dienst den gesamten Server auslastet. In beiden Fällen wird der Prozess mit einer protokollierten Bezeichnung beendet. Sie können den Vorgang im Log finden, statt den Kernel anhand einer Bewertung über das Opfer entscheiden zu lassen.
Erledigen Sie das, solange der Server neu und wenig ausgelastet ist. Das Erstellen der Swap-Datei und das Festlegen eines Speicherlimits dauert wenige Minuten. Diese Arbeiten gehören zu den übrigen Schritten in den ersten zehn Minuten auf einem neuen VPS.
FAQ
Macht das Hinzufügen von Swap aus meiner 1-GB-VPS eine 2-GB-VPS?
Nein. Swap ist deutlich langsamer als RAM, und der Kernel verschiebt dorthin nur Seiten, die er als inaktiv einstuft. Swap schafft Reserven für Lastspitzen und bietet einen Ablageort für Speicher, der reserviert, danach aber nie wieder verwendet wurde. Wenn Ihre Anwendung aktiv mehr Speicher liest und schreibt, als auf dem System vorhanden ist, macht Swap aus einem Out-of-Memory-Kill ständiges Paging. Der Server bleibt zwar aktiv, antwortet aber so langsam, dass er praktisch nicht nutzbar ist. In diesem Fall sollten Sie RAM hinzufügen oder den wachsenden Prozess begrenzen.
Wie viel Swap benötigt eine 1-GB- oder 2-GB-VPS?
2 GB reichen in beiden Fällen aus. Danach muss die Swap-Größe nicht weiter mit der RAM-Größe wachsen. Swap nimmt inaktive anonyme Speicherseiten auf. Die Menge wirklich inaktiven Speichers auf einem Server wächst nicht im gleichen Maß wie der gesamte RAM. Die alte Regel vom doppelten RAM stammt aus dem Ruhezustand. Dabei wird das vollständige Speicherabbild auf die Festplatte geschrieben. Eine VPS verwendet jedoch keinen Ruhezustand. Eine Größe von mehr als 4 GB verlängert und verlangsamt meist nur den Ausfall auf dem Speicher, den Sie mit anderen Gästen teilen.
Ist das Setzen von vm.swappiness auf 0 der richtige Weg, um Swapping zu verhindern?
Nein. Außerdem bewirkt diese Einstellung nicht das, was ihr Name vermuten lässt. vm.swappiness = 0 deaktiviert Swap nicht. Der Kernel wird angewiesen, anonyme Seiten erst dann zurückzufordern, wenn der Speicher fast erschöpft ist. Dadurch wird ein OOM-Kill wahrscheinlicher, nicht unwahrscheinlicher. Außerdem wird die gesamte Rückforderung auf den Page Cache verlagert, sodass Dateizugriffe häufiger wieder von der Festplatte erfolgen. Wenn Sie Swap vollständig deaktivieren möchten, führen Sie sudo swapoff -a aus und entfernen Sie die fstab-Zeile. Wenn Sie weniger Swapping möchten, verwenden Sie vm.swappiness = 10 und vergleichen Sie die Spalten si und so in vmstat vor und nach der Änderung.
Sollte ich zram anstelle einer Swap-Datei verwenden?
Verwenden Sie zram, wenn CPU-Reserven vorhanden sind und nur wenig Speicherplatz frei ist. Verwenden Sie eine Swap-Datei, wenn das Gegenteil zutrifft. zram komprimiert Speicherseiten und hält sie im RAM. Dadurch entfallen Festplattenzugriffe vollständig. Jede Seite verursacht jedoch beim Ein- und Auslagern CPU-Kosten. Außerdem belegt zram RAM, der den Anwendungen dann nicht mehr zur Verfügung steht. Auf einer VPS mit einem kleinen CPU-Limit fällt diese Belastung bei der Ressource an, die ohnehin knapp ist. Der parallele Betrieb beider Varianten ist üblich: Geben Sie zram mit PRIORITY in /etc/default/zramswap die höhere Priorität und behalten Sie darunter eine Swap-Datei auf der Festplatte für Überläufe.
Warum wurde der OOM-Killer ausgeführt, obwohl free verfügbaren Speicher angezeigt hat?
free zeigt eine Momentaufnahme. Eine Speicherreservierung erfolgt dagegen sofort. Ein Prozess, der schneller einen großen Speicherblock anfordert, als der Kernel Speicher freigeben kann, wird beendet, obwohl die durchschnittliche Auslastung unkritisch aussah. Lesen Sie das Kernel-Log mit sudo journalctl -k --grep "Out of memory". Dort werden der beendete Prozess und seine resident im Speicher gehaltene Größe zu diesem Zeitpunkt genannt. Prüfen Sie anschließend, ob der Kill durch ein cgroup-Limit und nicht durch das gesamte System ausgelöst wurde. Ein Container oder eine systemd-Unit mit gesetztem MemoryMax= wird an ihrem eigenen Limit beendet, während auf dem Host weiterhin freier Speicher vorhanden sein kann.