Ist es eine schlechte Idee, ein Cron-Skript zu erstellen, das den Swap jede Stunde leert?

26

Seit Jahren habe ich das gleiche Problem mit meinen kleinen Ubuntu-Konfigurationen: Der belegte Swap-Platz nimmt mit der Zeit zu. Ich habe den Eindruck, dass dies hauptsächlich darauf zurückzuführen ist, dass der zugewiesene Arbeitsspeicher nie in den Arbeitsspeicher zurückkehrt, obwohl genügend Speicherplatz vorhanden ist, außer im Fall einer Benutzeraktion wie dem Deaktivieren des Auslagerungsmodus.

Ich habe einen kurzen cronBefehl gegeben, um dies zu automatisieren, und ich habe gute Ergebnisse:

#! /bin/sh

echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab

Aber weil es eher ein Trick als eine echte Lösung für dieses Problem ist, frage ich mich, warum es eine schlechte Idee sein könnte oder wie ich dieses Skript verbessern könnte, um es ein bisschen schlauer zu machen.

Yvan Sraka
quelle
29
Verzeihen Sie meine Unwissenheit, aber was genau meinen Sie damit, dass der Speicherplatz-SWAP mit der Zeit wächst und sich der zugewiesene Speicher in den RAM leert ? Normalerweise weisen Sie dem System einen gewissen Swap-Speicherplatz zu und hören nie wieder davon. Wen interessiert es, wie viel vom Swap tatsächlich genommen wird? Was ist das Problem?
Dessert
5
Warum willst du das überhaupt machen? Warum halten Sie die Verwendung von Swap-Inhalten für eine schlechte Sache? Über wie viel Swap-Nutzung sprechen wir?
März
25
Ich bin ein bisschen verwirrt. Sie sprechen immer von einem "Problem", beschreiben aber keinerlei negative Auswirkungen. Warum halten Sie das für ein Problem?
David Schwartz
17
Wenn etwas in den Tausch gerät und dort bleibt, liegt es daran, dass nichts davon Gebrauch macht. Und wenn nichts es verwendet wird , ist es besser, lassen RAM für etwas verwendet werden, wird zugegriffen, wie Cache, als zu Swap in die Daten zurück.
hobbs
12
Wie ist das besser, als den Swap einfach wegzulassen?
user253751

Antworten:

51

Verwenden Sie es so: ja, schlecht. Sie müssen wirklich prüfen, ob genügend Speicher verfügbar ist, bevor Sie den Swap ausschalten. Eine bessere Version finden Sie unter https://askubuntu.com/a/90399/15811 .

Auch: Bist du dir da sicher? Das Zuweisen von Swap bedeutet nicht, dass Swap verwendet wird. Der Befehl vmstat, Spalten si(Swap In) und so(Swap Out). Wenn diese 0 bleiben, haben Sie ein anderes Problem. Meiner Erfahrung nach wird Swap kaum verwendet, und Sie werden es möglicherweise nicht verwenden, weil Sie denken, es würde es nicht leeren, aber es gibt nichts zu leeren.

Rinzwind
quelle
3
Warte was? Wenn nicht genügend Speicher vorhanden ist, damit der Swapoff erfolgreich ist, wird der Swapoff zuerst vom OOM-Killer getötet. Ja, sie haben das tatsächlich fest codiert (dies wird durch einen Systemaufruf überprüft).
Joshua
@ Joshua sicher, aber er will es automatisiert arbeiten. Nicht fehlerfrei.
Rinzwind
4
Ohne meine eigene Antwort zu verfassen, ist die mit der Zeit zunehmende Nutzung von Tauschbörsen überhaupt keine schlechte Sache . Dies bedeutet, dass der Kernel langsam herausfindet, welcher Müll, der Speicher verbraucht, niemals verbraucht wird , und ihn zum Auslagern verschiebt, damit der Speicher für Dinge verwendet werden kann, die Ihnen tatsächlich helfen (wie die Möglichkeit, mehr fs-Daten zwischenzuspeichern, um dies zu erreichen) es muss nicht ständig verworfen und erneut von der Festplatte gelesen werden).
R ..
@Rinzwind cron funktioniert gut mit Jobs, die fehlerhaft sind, und das verknüpfte Skript wird auch nicht verwendet vmstat.
Jpaugh
41

Ich würde sagen, es ist eine schlechte Idee. Wenn Sie denken, Sie haben freien Speicher und ein aktiver Prozess wird nicht vom Auslagerungsspeicher in den Arbeitsspeicher verschoben, haben Sie entweder nicht so viel freien Speicher wie Sie denken oder der Prozess ist nicht so aktiv, wie Sie denken ist.

Wenn ein aktiver Prozess weiterhin ausgetauscht wird, sollten Sie das Problem beheben, das den Speicher unter Druck setzt. Wenn es kein aktiver Prozess ist, was ist das große Problem?

muru
quelle
1
+1: Was ist die große Sache? Ändern Sie niemals ein laufendes System , ich denke nicht, dass man mit den Kernfunktionen des Systems so herumspielen sollte, besonders nicht ohne Notwendigkeit.
Dessert
3
Ich habe manchmal Probleme, bei denen ich einen Prozess mit einem Speicherverlust beende (was alles andere zum Auslagern zwang), sodass ich ~ 10% RAM verbrauchte ... aber alle laufenden Programme werden ausgelagert, bis ich wieder auf sie zugreife. Jedes Mal, wenn Sie etwas berühren, gibt es eine Verzögerung von zwei Sekunden. Ich kann sehen, woher OP kommt, und es wäre schön, wenn dies automatisch erfolgen würde, aber dies ist nicht der richtige Weg.
Jemand irgendwo
1
@SomeoneSomewhere Aber so funktioniert es sowieso nicht. Wenn der Prozess Speicher verliert, verwendet er diesen Speicher definitionsgemäß nicht aktiv (er liest und schreibt ihn nicht). es hat es nur zufällig zugeteilt. Wenn es andere aktive Prozesse gibt, wird der durchgesickerte Speicher ausgelagert und es ist Ihr Swap, der voller Müll ist, nicht Ihr physischer RAM.
David Richerby
@DavidRicherby Wenn Sie ein Programm im Hintergrund geöffnet haben, ist dieses Programm immer noch weniger aktiv als der Speicherverlust - und wenn Sie dorthin zurückwechseln, muss es aus dem Swap-Modus entfernt werden.
Jemand irgendwo
@SomeoneSomewhere Sie scheinen falsch verstanden zu haben, wie das Speichersystem funktioniert. Sie müssen nicht den gesamten Prozess im physischen RAM haben: Swap wird mit der Granularität einzelner Seiten verwaltet. Jede Seite, die für eine Weile nicht verwendet wurde, kann ausgelagert werden, und eine Seite, die nur aus Speicherlecks besteht, wird nie wieder verwendet, sodass sie nach dem Auslagern nie wieder eingelagert wird.
David Richerby
34

Es ist eine schlechte Idee.

Der Kernel beginnt mit dem Kopieren (nicht dem Verschieben) von Daten zum Auslagern, lange bevor der physische Speicher fast voll ist. Wenn ein Prozess jemals viel Speicher benötigt, kann jede Seite, die bereits eine gültige Auslagerungskopie hat, sofort wiederverwendet werden, ohne dass ein weiterer Schreibvorgang erforderlich ist auf die Festplatte.

Im Allgemeinen geschieht dies meistens für Seiten, auf die lange Zeit nicht zugegriffen wurde. Dies ist ein guter Indikator dafür, dass ein baldiger Zugriff unwahrscheinlich ist.

Wenn Sie die Kopien explizit verwerfen, hat dies keinen Vorteil, da die Daten immer noch im RAM vorhanden sind, Sie jedoch möglicherweise Geschwindigkeit kosten, wenn ein Prozess viel Speicher zuweisen möchte und ein Auslagern erforderlich wird.

Der Kernel verwendet auch immer Swap-Speicher, sobald der physische Speicher zu über 50% voll ist. Diese Zahlen sind also ungleich Null, auch wenn genügend Speicher installiert ist.

Simon Richter
quelle
4
always : Ich gehe davon aus, dass /proc/sys/vm/swappinessder Standardwert von 70beibehalten wird. Dies ist gut für Server und führt ziemlich aggressiv schmutzige Seiten aus Prozessen aus, die sie eine Weile nicht mehr berührt haben, um Platz für mehr Pagecache zu schaffen. Dies ist für Desktops oftmals schlecht, da Alt-Tab langsam werden kann.
Peter Cordes
@PeterCordes, wenn die Seiten tatsächlich entfernt wurden, wurden auf den Caches mehr Zugriffe ausgeführt als auf den betreffenden Anwendungsseiten. Die Verwendung dieser Seiten als Festplatten-Caches hat also einen Nettovorteil. Ich kann sehen, wie die Leistung von Alt-Tab für den Benutzer sichtbarer ist als beispielsweise die Kompilierungszeit für ein großes Projekt, finde es jedoch schwierig, eine Richtlinie zu formulieren, die eine sofortige Reaktion garantiert, ohne zu viel Leistung zu opfern.
Simon Richter
1
Anders ausgedrückt: Der Kernel ist auf Durchsatz ( swappiness=70) eingestellt, aber die Latenz ist für die Benutzererfahrung auf einem Desktop wichtiger. Es ist ein Kompromiss. Wenn Sie routinemäßig Dinge kompilieren, die etwas zu groß sind, um im PageCache zu bleiben, lassen Sie sicher swappinessein wenig höher, wie 20 oder 30 anstelle von 5 oder 10. Siehe auch akitaonrails.com/2017/01/17/optimizing-linux-for -Slow-Computer . Wenn vm.vfs_cache_pressureweniger als 100 angezeigt werden, werden auch Inode- / Verzeichnis-Metadaten über Datenseiten zwischengespeichert, was auch für die Reaktionsfähigkeit der Benutzeroberfläche von Vorteil ist.
Peter Cordes
1
Andere Tunables: Rückschreibschwellen lonesysadmin.net/2013/12/22/… . Diese steuern, wie schnell Linux mit dem Schreiben auf die Festplatte beginnt, nachdem etwas in Dateien geschrieben wurde, und wie viele schmutzige Seiten zulässig sind. (dh wie viel Speicherplatz für das Caching von Schreibvorgängen aufgewendet werden kann)
Peter Cordes
21

Das ist eine schlechte Idee. Wenn dies nützlich wäre, würde der Linux-Kernel es auf diese Weise implementieren. Ich glaube nicht, dass es einen Grund gibt, mehr als ein paar Optimierungsparameter zu ändern, da solch ein einfaches Shell-Skript höchstwahrscheinlich nicht schlauer ist als die Algorithmen der Kernel-Entwickler.

Sie haben grundsätzlich zwei Fälle:

  • Die Prozesse im Swap Space werden sowieso nicht verwendet. Warum möchten Sie sie zurück in den Arbeitsspeicher ziehen?
  • Es gibt wenig RAM, daher werden sie ausgetauscht und Sie ziehen sie zurück in den RAM. Dann wird Ihr System sie so schnell wie möglich wieder in den Swap stecken.

Es gibt also zwei Hauptpunkte:

  1. Erstens ist Ihr System langsam, wenn zu wenig RAM vorhanden ist, um alle Ihre Programme gleichzeitig auszuführen. Mit Swap können Sie mehr Programme ausführen, aber nicht schnell zu einem selten verwendeten Programm wechseln, das möglicherweise ausgetauscht wird. Kein Tausch kann dazu führen, dass der selten genutzte getötet wird, oder dass der aktuell genutzte eine Ausnahmebedingung wegen Speichermangel verursacht.
  2. Zweitens, Swap ist eine gute Sache, und es ist auch gut, Sachen in Swap zu haben, da Sie freien RAM zu Kosten von Programmen haben, die Sie momentan sowieso nicht verwenden.

Obwohl es bei zu vielen Programmen keine Probleme mit zu wenig Arbeitsspeicher gibt, können einige Programme Arbeitsspeicher basierend auf dem derzeit freien Arbeitsspeicher zuweisen (möglicherweise verwendet Ihr Browser mehr Memcache und Sie können schneller browsen) und der Kernel kann freien Arbeitsspeicher für das Zwischenspeichern und Speichern verwenden ähnliche Optimierungen. Wenn Sie erzwingen, dass Ihr Swap leer ist, löscht der Kernel den Lesecache und das Starten einer neuen Firefox-Instanz dauert länger als wenn sich Firefox noch im Festplattencache befindet.

Wenn Sie das Verhalten des Kernels optimieren möchten, lesen Sie den swappiness-Parameter .

Zwei zusätzliche Ressourcen werden von @ peter-cordes bereitgestellt:

Wenn Sie wirklich einen leeren Swap haben möchten, können Sie den Swap dauerhaft deaktivieren. Ich verstehe nicht, warum es sich auszahlt, wenn es eine Stunde lang eingeschaltet ist und dann geleert wird.

allo
quelle
5

Sie können die gleichen Ergebnisse erzielen, indem Sie den Kernel anweisen, die Caches freizugeben:

echo 3 > /proc/sys/vm/drop_caches

Auf diese Weise vermeiden Sie den kurzen Moment eines möglichen Speichermangels und lassen den Kernel entscheiden, was erforderlich ist und was verworfen werden kann.

Alex C
quelle
0

Im Gegensatz zur gängigen Idee ist SWAP an sich nicht schlecht .
Was Ihr System tatsächlich verlangsamt, ist die Kernelaktivität, die Daten vom RAM zum SWAP und zurück in den RAM verschiebt swappiness.
Das System tut dies automatisch, wenn es mit konfiguriert wird swappiness.
Dadurch wird der Speicher von inaktiven Prozessen auf der Festplatten-Swap-Partition gesichert.
Ich habe selbst jahrelang mit einer Maschine gearbeitet, die nicht so viel RAM-Speicher hatte, und ich hatte immer etwas SWAP-Speicher verwendet. Mein Computer hat immer noch einwandfrei funktioniert, bis Sie anfangen, den Speicher wieder in den Arbeitsspeicher zu verschieben, indem Sie versuchen, eine geöffnete Anwendung zu schließen. Dann begann die Arbeitsbelastung zuzunehmen.

  • Wenn Sie den SWAP-Speicher also ständig bereinigen, steigt die Arbeitslast auf Ihrer Maschine erheblich.
  • Das Ausführen von Anwendungen, deren Arbeitsspeicher sich auf der SWAP-Partition befindet, kann zu einer Beschädigung der Ausführung führen.

Eher würde ich vorschlagen, dass Sie genau untersuchen, welche Anwendung Ihren Speicher in der Befehlszeile mit der htopAnwendung verwendet, und entscheiden, eine Anwendung zu schließen. Das gnome-system-monitorkann Ihnen auch in seinem Process-Tab einen guten Einblick geben.
Wenn Sie große Anwendungen haben, die viel RAM verbrauchen. Führen Sie sie nicht alle auf einmal aus.

Bodo Hugo Barwich
quelle