it-swarm.com.de

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

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

204
Mysterio

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

Aus der buntu 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 längeren Antwortzeiten für System und Anwendungen führen, wenn Prozesse zu stark 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 geeigneter.

Um den Swappiness-Wert zu überprüfen

cat /proc/sys/vm/swappiness

So ändern Sie den Swappiness-Wert Mit kann eine temporäre Änderung (beim Neustart verloren) mit einem Swappiness-Wert von 10 vorgenommen werden

Sudo sysctl vm.swappiness=10

Um eine Änderung dauerhaft vorzunehmen , 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 auschecken: https://askubuntu.com/a/103916/54187

185
jpetersen

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 verwendet (sehr vereinfacht)

Jede Anwendung kann einen Teil Ihres Speichers verwenden. Linux verwendet allen ansonsten nicht belegten Speicher (mit Ausnahme der letzten MB) als "Cache". Dies schließt den Seiten-Cache, Inode-Caches usw. ein. Dies ist eine gute Sache - es hilft, Dinge zu beschleunigen, die Haufen beschleunigen. 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 durchgeführt werden kann - alles, was sich im Cache befindet, ist entweder nur eine zweite Kopie von etwas, das sich bereits auf der Festplatte befindet, kann also sofort freigegeben werden, oder es ist etwas, was wir tun würden musste innerhalb der nächsten Sekunden auf die Festplatte spülen trotzdem .

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

Wenn Sie über freien Arbeitsspeicher sprechen, ist es viel sinnvoller, include Cache zu speichern, da er praktisch kostenlos ist - er ist verfügbar, wenn eine Anwendung ihn anfordert. Unter Linux meldet der Befehl free dies in beide Richtungen - die erste Zeile enthält Cache in der verwendeten Spalte RAM und die zweite Zeile enthält Cache (und 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 von RAM zum Auslagern neu zuweisen.

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 Edge-Fälle gibt, in denen es die Leistung beeinträchtigt, ist es ein Nettovorteil für eine breite Palette von Aufgaben, wenn Sie die Gesamtsystemleistung betrachten. 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 auf einem Desktop-System wirklich beeinträchtigt. Auf diese Weise können Anwendungen schnell wieder auf Benutzereingaben reagieren, nachdem sie längere Zeit untätig waren und Hintergrundprozesse in IO (z. B. eine Sicherung über Nacht) 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 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 einer enormen Menge an RAM haben (zum Zeitpunkt des Schreibens sind 8 GB eine enorme 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 Swap mein System beschleunigen? Tauscht ein Swap nicht langsamer?

Das Übertragen von Daten von RAM zu 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 Austauschen ist nur verbunden mit Zeiten, in denen Ihr System eine schlechte Leistung erbringt, weil es zu Zeiten auftritt, in denen Ihnen der nutzbare Arbeitsspeicher ausgeht, was Ihr System verlangsamen (oder instabil machen würde). auch wenn du keinen Swap hattest. Um die Sache zu vereinfachen, geschieht das Austauschen , weil Ihr System nicht mehr umgekehrt, sondern festgefahren ist.

Sobald die Daten ausgetauscht wurden, wann werden sie 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 verbleiben, da mehr Speicher für andere Dinge übrig bleibt, die möglicherweise are verwendet werden Beschleunigen Sie Ihr System.

90
thomasrutter

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 RAM verfügen, um alles in RAM zu speichern plus alles in Swap. Wenn Sie versuchen, Swap zu deaktivieren, reagiert Ihr System nicht mehr. Zuerst prüft mein Skript, ob genügend freier RAM vorhanden ist (was ein wenig Zeit in Anspruch nimmt, da die tatsächliche Menge an freiem RAM von der Menge abweicht, die free als frei meldet). dann wechselt nur Swap, wenn ja. 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. B. mit Sudo). 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.

23
Scott Severance

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 ausschalten, indem Sie den Befehl ausführen:
swapoff -av (Sie benötigen Sudo Rechte dafür.)
Wenn Sie den Swap nicht mögen, können Sie ihn mit dem symmetrischen Befehl einschalten:
swapon -av (erneut Sudo erforderlich).

4
drake01

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.

3
BillThor

Ich habe das Skript von Scott Severance bearbeitet, um mit den neueren Versionen von free übereinzustimmen, 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
2