Warum wird Swap verwendet, obwohl ich genügend freien Arbeitsspeicher habe?

208

Ich dachte, die ganze Essenz von Swap besteht darin, als temporäres Sicherheitsnetz zu fungieren, wenn der Arbeitsspeicher voll ist, aber meine Swap-Partition wird ständig verwendet, obwohl ich manchmal bis zu 3 GB freien Arbeitsspeicher habe. Ist das normal?

Mysterio
quelle
3
Bitte teilen Sie den Inhalt oder die Ausgabe der folgenden Befehle / Dateien besser helfen Sie uns Ihr Problem zu beheben ( Anweisungen in dieser Antwort ) : free -m,top -b 1
ish
Aktualisiert die Frage morgen mit den Pastebins dieser Befehle. Es ist jetzt 12 Uhr :(
Mysterio
Ich sollte den Titel bearbeiten und hinzufügen "... aber ich bin zu müde, um mich gerade darum zu kümmern, also macht ihr auch ein Nickerchen": P
ish

Antworten:

188

Sie können versuchen, Ihren "swappiness" -Wert zu ändern:

Aus den Ubuntu Swap FAQ :

Was ist Swappiness und wie ändere ich es?

Der Parameter swappiness steuert die Tendenz des Kernels, Prozesse aus dem physischen Speicher auf die Auslagerungsplatte zu verschieben. Da Festplatten viel langsamer als RAM sind, kann dies zu langsameren Antwortzeiten für System und Anwendungen führen, wenn Prozesse zu aggressiv aus dem Arbeitsspeicher verschoben werden.

  1. swappiness kann einen Wert zwischen 0 und 100 haben

  2. swappiness = 0 weist den Kernel an, das Auslagern von Prozessen aus dem physischen Speicher so lange wie möglich zu vermeiden. Ab Kernel-Version 3.5 wird die Swapiness-Funktion deaktiviert.

  3. Mit swappiness = 100 wird der Kernel angewiesen, Prozesse aggressiv aus dem physischen Speicher auszutauschen und sie in den Swap-Cache zu verschieben

Die Standardeinstellung in Ubuntu ist swappiness = 60. Das Verringern des Standardwerts für swappiness verbessert wahrscheinlich die Gesamtleistung für eine typische Ubuntu-Desktop-Installation. Ein Wert von swappiness = 10 wird empfohlen, Sie können jedoch gerne experimentieren. Hinweis: Bei Ubuntu-Serverinstallationen gelten andere Leistungsanforderungen als bei Desktop-Systemen. Der Standardwert von 60 ist wahrscheinlich besser geeignet.

So überprüfen Sie den Swappiness-Wert

cat /proc/sys/vm/swappiness

So ändern Sie den Swappiness-Wert Mit kann eine vorübergehende Änderung (die beim Neustart verloren geht) mit einem Swappiness-Wert von 10 vorgenommen werden

sudo sysctl vm.swappiness=10

Um eine Änderung dauerhaft zu machen , bearbeiten Sie die Konfigurationsdatei mit Ihrem bevorzugten Editor:

gksudo gedit /etc/sysctl.conf

Suchen Sie nach vm.swappiness und ändern Sie den Wert wie gewünscht. Wenn vm.swappiness nicht vorhanden ist, fügen Sie es wie folgt am Ende der Datei hinzu:

vm.swappiness=10

Speichern Sie die Datei und starten Sie neu.

Sie können auch Folgendes überprüfen: https://askubuntu.com/a/103916/54187

jpetersen
quelle
1
Spekulationen im Leerlauf: Dies kann für die Leistung von Vorteil sein. Seiten, auf die seit einiger Zeit nicht mehr zugegriffen wurde, können in den Auslagerungsspeicher kopiert werden, sodass das Betriebssystem sie schnell entfernen kann, wenn Speicherplatz benötigt wird. Der Seiteninhalt bleibt jedoch im Speicher .
Simon Richter
7
@SimonRichter Ja das ist die Idee. Swappiness von 60 ist auf modernen Systemen wahrscheinlich zu aggressiv, da dies bedeutet, dass Sie anfangen, zu tauschen, wenn Sie noch mehrere Gigs freien Arbeitsspeichers haben.
Brendan Long
1
Führen Sie sudo sysctl --load=/etc/sysctl.confnach der Bearbeitung die Datei aus, um die Änderungen zu übernehmen
deFreitas
92

Ihre Frage hat einige unterschiedliche Aspekte.

Erstens, was ist Ihre Definition von "frei". Es ist eigentlich nicht so einfach, wie es in Linux (oder einem modernen Betriebssystem) klingt.

Wie Linux RAM benutzt (sehr vereinfacht)

Jede Anwendung kann einen Teil Ihres Speichers verwenden. Linux verwendet den gesamten ansonsten nicht belegten Speicher (mit Ausnahme der letzten MB) als "Cache". Dies schließt den Seiten-Cache, Inode-Caches usw. ein. Sowohl das Schreiben auf die Festplatte als auch das Lesen von der Festplatte kann durch den Cache immens beschleunigt werden.

Im Idealfall haben Sie genug Speicher für alle Ihre Anwendungen, und Sie haben noch einige hundert MB für den Cache übrig. In dieser Situation ist kein Auslagerungsvorgang erforderlich, solange Ihre Anwendungen nicht zu einer höheren Speichernutzung führen und das System nicht darum bemüht ist, genügend Speicherplatz für den Cache zu erhalten.

Sobald Anwendungen mehr RAM beanspruchen, wird lediglich ein Teil des vom Cache belegten Speicherplatzes belegt und der Cache verkleinert. Das Aufheben der Cache-Zuweisung ist billig und so einfach, dass es einfach in Echtzeit erfolgt - alles, was sich im Cache befindet, ist entweder nur eine zweite Kopie von etwas, das sich bereits auf der Festplatte befindet, und kann daher sofort freigegeben werden, oder es ist etwas, das wir tun würden musste ohnehin innerhalb der nächsten sekunden auf festplatte spülen .

Dies ist keine Linux-spezifische Situation - alle modernen Betriebssysteme arbeiten auf diese Weise. Die verschiedenen Betriebssysteme melden den freien Arbeitsspeicher möglicherweise nur unterschiedlich: Einige enthalten den Cache als Teil dessen, was sie als "frei" betrachten, andere möglicherweise nicht.

Wenn Sie über freien Arbeitsspeicher sprechen, ist es viel sinnvoller, den Cache einzuschließen, da er praktisch kostenlos ist - er ist verfügbar, wenn eine Anwendung dies anfordert. Unter Linux freemeldet der Befehl dies in beide Richtungen - die erste Zeile enthält den Cache in der verwendeten RAM-Spalte und die zweite Zeile enthält den Cache (und die Puffer) in der freien Spalte.

Wie Linux Swap benutzt (noch einfacher)

Wenn Sie genug Speicher verbraucht haben, um einen reibungslosen Cache zu gewährleisten, wird Linux möglicherweise einen Teil des nicht verwendeten Anwendungsspeichers aus dem RAM neu zuweisen, um ihn auszutauschen.

Es tut dies nicht nach einem bestimmten Cut-Off. Es ist nicht so, dass Sie einen bestimmten Prozentsatz der Zuweisung erreichen, wenn Linux mit dem Tauschen beginnt. Es hat einen ziemlich "Fuzzy" -Algorithmus. Es werden viele Dinge berücksichtigt, die am besten mit "wie viel Druck für die Speicherzuweisung besteht" beschrieben werden können. Wenn viel "Druck" besteht, neuen Speicher zuzuweisen, erhöht dies die Wahrscheinlichkeit, dass einige ausgetauscht werden, um mehr Platz zu schaffen. Wenn es weniger "Druck" gibt, werden diese Chancen verringert.

Ihr System verfügt über eine "Swappiness" -Einstellung, mit der Sie die Berechnung dieses "Drucks" optimieren können. Es wird normalerweise nicht empfohlen, dies überhaupt zu ändern, und ich würde nicht empfehlen, dass Sie es ändern. Das Austauschen ist insgesamt eine sehr gute Sache - obwohl es einige Randfälle gibt, in denen es die Leistung beeinträchtigt, ist es bei Betrachtung der Gesamtsystemleistung ein Nettovorteil für eine breite Palette von Aufgaben. Wenn Sie die Austauschbarkeit verringern, lässt sich der Cache-Speicher etwas stärker verkleinern, als dies sonst der Fall wäre, auch wenn dies möglicherweise wirklich nützlich ist. Es liegt an Ihnen, ob dies ein Kompromiss für das Problem ist, das Sie mit dem Tauschen haben. Sie sollten nur wissen, was Sie tun, das ist alles.

Es gibt eine bekannte Situation, in der Swap die wahrgenommene Leistung eines Desktopsystems wirklich beeinträchtigt. So können Anwendungen schnell wieder auf Benutzereingaben reagieren, nachdem sie längere Zeit nicht verwendet wurden und Hintergrundprozesse wie z über Nacht sichern) ausführen. Dies ist eine sehr sichtbare Trägheit, die jedoch nicht ausreicht, um das Ausschalten von Swap zu rechtfertigen, und die in jedem Betriebssystem nur sehr schwer zu verhindern ist. Schalten Sie Swap aus und diese anfängliche Trägheit nach dem Backup / Virus-Scan tritt möglicherweise nicht auf, aber das System läuft möglicherweise den ganzen Tag über etwas langsamer. Dies ist auch keine auf Linux beschränkte Situation.

Bei der Auswahl, was auf die Festplatte ausgelagert werden soll, versucht das System, Speicher auszuwählen, der nicht tatsächlich verwendet wird - in den gelesen oder aus dem geschrieben wird. Es hat einen ziemlich einfachen Algorithmus für die Berechnung, der die meiste Zeit gut wählt.

Wenn Sie ein System mit sehr viel RAM haben (zum Zeitpunkt des Schreibens sind 8 GB eine große Menge für eine typische Linux-Distribution), werden Sie sehr selten in eine Situation geraten, in der Swap überhaupt benötigt wird. Sie können sogar versuchen, Swap auszuschalten. Ich empfehle das nie, aber nur, weil Sie nie wissen, wann mehr RAM Sie vor einem Absturz einer Anwendung bewahren kann. Aber wenn Sie wissen, dass Sie es nicht brauchen werden, können Sie es tun.

Aber wie kann ein Tausch mein System beschleunigen? Tauscht nicht langsam?

Das Übertragen von Daten vom RAM zum Swap ist ein langsamer Vorgang, der jedoch nur ausgeführt wird, wenn der Kernel ziemlich sicher ist, dass der Gesamtnutzen dies überwiegt. Wenn Ihr Anwendungsspeicher beispielsweise so weit angestiegen ist, dass Sie fast keinen Cache mehr haben und Ihre E / A-Vorgänge aus diesem Grund sehr ineffizient sind, können Sie Ihr System erheblich beschleunigen, indem Sie sogar etwas Speicher freigeben nach dem anfänglichen Aufwand für den Austausch von Daten, um sie freizugeben.

Es ist auch ein letzter Ausweg, wenn Ihre Anwendungen tatsächlich mehr Speicher anfordern , als Sie tatsächlich haben. In diesem Fall ist ein Austausch erforderlich, um zu verhindern, dass nicht genügend Arbeitsspeicher zur Verfügung steht, was häufig dazu führt, dass eine Anwendung abstürzt oder gewaltsam beendet werden muss.

Das Auslagern ist nur dann möglich , wenn die Leistung Ihres Systems schlecht ist, da es zu Zeiten kommt, in denen nicht genügend RAM zur Verfügung steht, was das System verlangsamt (oder instabil macht), auch wenn Sie kein Auslagerungsverfahren hatten. Um die Sache zu vereinfachen, kommt es zu einem Austausch, weil Ihr System nicht mehr so ​​schnell läuft, wie es ist.

Wann werden die Daten nach dem Austausch wieder ausgegeben?

Das Übertragen von Daten aus dem Swap ist (zumindest für herkömmliche Festplatten) genauso zeitaufwendig wie das Einspielen. Verständlicherweise wird Ihr Kernel ebenso wenig bereit sein, Daten aus dem Swap zu entfernen, insbesondere wenn sie nicht tatsächlich verwendet werden (dh aus dem Swap gelesen oder in diesen geschrieben werden). Wenn Sie Daten in Swap haben und diese nicht verwendet werden, ist es eigentlich eine gute Sache, dass sie in Swap bleiben, da mehr Speicher für andere Dinge übrig bleibt, die verwendet werden, was möglicherweise Ihr System beschleunigt.

thomasrutter
quelle
5
+1 für detaillierte Erklärung. Ich behalte auch gerne 2GiB-Swap auf meinen Computern. Wenn etwas kaputt geht - Speicherverluste usw., können Sie feststellen, dass die Auslagerungsdaten steigen und nach dem Problem suchen, bevor nicht mehr genügend Speicher vorhanden ist. Es ist sowohl ein Sicherheitsnetz als auch ein Leistungsinstrument.
Joe
1
Auf meinem Netbook mit nur 2 GB RAM behalte ich 4 GB Swap. Dies liegt daran, dass ich das Netbook für viel mehr als gedacht verwende und meine Programme häufig mehr als 2 GB Speicher benötigen. Da Linux sich in Situationen mit unzureichendem Arbeitsspeicher sehr schlecht verhält, bevorzuge ich ein großes Sicherheitsnetz. Und ich habe viel Speicherplatz.
Scott Severance
Wenn Ihre Programme häufig mehr als 2 GB Arbeitsspeicher benötigen, kann es sinnvoll sein, mehr Arbeitsspeicher einzuspeichern (es ist extrem günstig!), Da die Leistung beeinträchtigt wird, wenn der Arbeitsspeicher aufgebraucht ist. Zum Nutzen anderer Leser: Achten Sie nicht nur auf den Cache-Speicher, der den verfügbaren Arbeitsspeicher belasten soll - siehe andere Verweise auf free -m.
Thomasrutter
2
@neon_overload: Ich sollte nur beachten, dass laut HP der maximale Arbeitsspeicher meines Netbooks 1 GB beträgt. Ich habe jetzt 2GB drin und Internetquellen schlagen vor, dass 2GB das tatsächliche Maximum ist. Daher besteht die Notwendigkeit für diese Art von Problemumgehungen.
Scott Severance
@ thomasrutter: Wie ändert sich deine Antwort bei großen Servern? Einer von mir hat 1 TB (ja, ein ganzes Terabyte) RAM und nutzt dennoch Swap. Welche Swap-Einstellung und welche Swap-Partitionsgröße würden Sie empfehlen?
Chrisinmtown
24

Das Einstellen des Swappiness-Werts funktioniert nicht in jeder Situation. Wenn es bei Ihnen funktioniert, großartig. Wenn nicht, habe ich ein Skript geschrieben, um den Swap regelmäßig zu löschen, indem ich ihn aus- und wieder einschalte.

Das Umschalten von Swap ist ein bisschen riskant, wenn Sie nicht aufpassen. Wenn Sie nicht über genügend freien Arbeitsspeicher verfügen, um alles im Arbeitsspeicher und alles im Auslagerungsmodus zu speichern, reagiert Ihr System nicht mehr, wenn Sie versuchen, den Auslagerungsmodus zu deaktivieren. Mein Skript überprüft zuerst, ob genügend freier Arbeitsspeicher vorhanden ist (was ein wenig Zeit in Anspruch nimmt, da die tatsächliche Menge an freiem Arbeitsspeicher von der Menge abweicht, die als frei gemeldet wird free), und schaltet dann nur den Swap-Modus um, wenn dies der Fall ist. Wenn Sie jedoch etwas weniger RAM haben, starten Sie keinen weiteren wichtigen Prozess, während das Skript ausgeführt wird. Hier ist es:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

Sie müssen dieses Skript als root ausführen (z sudo. B. mit ). Dieses Skript lässt Ihr System nicht mehr reagieren. Wenn der Arbeitsspeicher nicht ausreicht, kann der Swap nicht umgeschaltet werden. Ich benutze dieses Skript seit fast fünf Jahren ohne Probleme.

Scott Severance
quelle
+1 für Skript. Vielleicht möchten Sie es ein wenig modernisieren, indem Sie MB in MiB in den Ausgaben ändern. Ich habe ein ähnliches Skript ohne alle (guten) Sicherheitstests geschrieben, die Sie einschließen. Bei meinem alten Notizbuch, in dem der Austausch häufig verwendet wurde, dauerte es eine Weile - ein oder zwei Minuten, aber es tat nichts weh. Hin und wieder schlug es fehl, weil nicht genügend freier Speicher für die Ausführung vorhanden war, aber das verursachte keine zusätzlichen Probleme. Ich musste neu starten, um die Dinge zu klären, als das passierte. Es hatte etwas mit einem Speicherverlust in der Übertragung zu tun (da behoben, glaube ich) und hatte nur 2 GB RAM.
Joe
6
Wenn etwas zum Auslagern verschoben wurde und im Auslagerungsmodus verbleibt, ist dies normalerweise eine gute Sache. Dies bedeutet, dass die Daten nicht tatsächlich verwendet werden und ein Teil Ihres Arbeitsspeichers für andere Zwecke freigegeben wird, was zu einer potenziellen Geschwindigkeitssteigerung führen kann. Was hat Sie zu der Annahme veranlasst, dass diese Daten nicht ausgetauscht werden und stattdessen mehr wertvollen Arbeitsspeicher belegen sollten? Normalerweise weiß der Kernel ziemlich gut, was nicht verwendet wird und was sicher im Swap verbleibt, um RAM freizugeben.
Thomasrutter
@neon: Denken Sie daran, dass meine Computer 2 GB bzw. 3 GB RAM haben, was heutzutage ziemlich wenig ist. Der Beweis liegt in der Leistung. Das Aufrufen von Menüs oder das Umschalten von Programmen kann beispielsweise aufgrund des Austauschs langsam sein, ebenso wie die visuellen Effekte von Compos. Diese Langsamkeit wird durch Umschalten des Swap behoben, was zeigt, dass die Optimierungsalgorithmen des Kernels zumindest in einigen Situationen nicht optimal sind. Ich kann nicht mit wiederholten Erfahrungen streiten.
Scott Severance
Puh!! Dies hat sich nur auf 0% des Swaps verringert. Ich hatte nicht viel Zeit, um mich mit dieser vollständigen Frage und ihrer Antwort zu befassen, aber ich habe es favorisiert, sie zu lesen, wenn ich etwas Freizeit habe.
AzkerM
Warum setzen Sie swappiness nicht einfach auf einen niedrigen Wert? Das scheint dasselbe zu tun wie Ihr Drehbuch, aber viel kontrollierter.
Jhfrontz
4

In der Regel bleibt Swap auf heutigen Systemen ungenutzt. Nach meiner Erfahrung werden die Prozesse, die lange Zeit ohne intensive Operationen ablaufen, vom Linux auf Swap verlagert.
Dadurch werden einige betroffene Programme langsam ausgeführt.
Wenn Sie viel RAM frei haben, können Sie den Swap durch Ausführen des Befehls ausschalten:
swapoff -av(Sie benötigen sudoRechte dafür.)
Wenn Sie den Swap nicht mögen, können Sie ihn mit dem symmetrischen Befehl einschalten:
swapon -av( erneut sudoerforderlich).

drake01
quelle
12
Turning Swap - off vollständig ist übertrieben , da swapiness = 0 die gleiche Sache tut, aber sicherer (wenn Sie tun mit zu viel Zeug im Speicher landen, wird es etwas in Swap werfen).
Brendan Long
@ BrendanLong Fair point .. Danke, dass du mich unterrichtet hast. :)
drake01
3

Sobald Swap für ein Programm verwendet wurde, bleibt es in der Regel für die Laufzeit des Programms zugeordnet. Viele Programme haben Code (und Daten), der selten verwendet wird. Sobald der Speicher ausgelagert ist, ist es unwahrscheinlich, dass er ausgelagert wird.

Eine Möglichkeit, diese Seiten in den Speicher zu zwingen, besteht darin, das Auslagerungsgerät auszuschalten. Wenn Sie zwei haben, können Sie einen ausschalten, den wieder einschalten und dann den zweiten ausschalten. Wenn der Austausch wirklich benötigt wird, wird er zwischen den Geräten verschoben. Sie können das Auslagerungsgerät (oder die Datei) einfach ausschalten, aber wenn Sie wirklich Auslagerungsspeicher benötigen, können drastische Dinge passieren.

Neben den normalen Dingen im Speicher verwendet tempfs Swap Space und wird wie der Rest des Speichers ausgelagert. Wenn Sie etwas ausführen, für das viel temporärer Datenträger erforderlich ist, werden möglicherweise Seiten ausgetauscht. Einmal erstellte temporäre Dateien können nach ein paar Minuten nicht mehr verwendet werden und sind gute Kandidaten, um auf das Auslagerungsgerät verschoben zu werden.

Zur Not können Sie eine Datei als Swap-Gerät verwenden. Dies ist nützlich, wenn Sie vorübergehend zusätzlichen Auslagerungsspeicher benötigen.

BillThor
quelle
2

Ich habe das Skript von Scott Severance so bearbeitet , dass es mit den neueren Versionen von free übereinstimmt, die bereits ein gesamtes verfügbares Speicherfeld enthalten.

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
derberlinersmurf
quelle