Antworten:
Auf Nachfrage. Tatsächlich überträgt Linux den physischen Speicher langsam, um ihn im Leerlauf auszutauschen (siehe: "swappiness").
Während des regulären Betriebs werden Daten vom Swap bei Bedarf in den Speicher geladen, wie andere geantwortet haben. In diesem Fall gibt es jedoch noch einen weiteren Fall: Wenn der Swap-Speicher deaktiviert ist, ist genügend physischer Speicher vorhanden, um den gesamten Swap-Inhalt zu laden.
Mach einfach:
swapoff -a
… Und alle Ihre Auslagerungsdaten werden in den Speicher zurückgeführt. Der Nebeneffekt ist, dass Festplattenpuffer / Caches möglicherweise geleert werden.
Manchmal kann es wünschenswert sein swapoff -a ; swapon -a
, z. B. nach einem fehlerhaften Speicherverlustprozess vor dem Absturz wichtigere Prozesse zu löschen - um sicherzustellen, dass alle im System ausgeführten Prozesse in den Speicher geladen werden und nicht auf den Austausch warten ein paar Minuten.
swapoff
das nicht fehlschlägt, aber das System wird bald nach dem swapoff
und der OOM den zufälligen Prozess beenden (im schlimmsten Fall die Shell, die gerade aufgerufen wird, swapon
oder den swapon
Befehl). In der Praxis ist dies sehr unwahrscheinlich - Caches verwenden viel Speicher, bevor sie swapoff
aufgerufen werden. Daher sollte genügend RAM vorhanden sein, damit beide Befehle ausgeführt werden können.
Wie andere bereits betont haben, werden Seiten nur bei Bedarf (bei Bedarf) wieder in den Arbeitsspeicher kopiert, anstatt Arbeitsspeicher zu belegen, der möglicherweise besser für Cache / Puffer verfügbar ist.
Die Tatsache, dass die Seiten zurück in den Arbeitsspeicher kopiert und nicht verschoben werden, ist wichtig und kann zu Verwirrung führen, wenn Sie sich dessen nicht bewusst sind. Die Seite wird nicht vom Swap freigegeben, es sei denn, sie wird überhaupt nicht mehr benötigt (dh die Seite wird vollständig freigegeben), wird im RAM geändert (sodass die Kopie beim Swap nicht mehr korrekt ist) oder der Swap geht zur Neige (und das Ein -Disk-Blöcke werden benötigt, um einige andere Seiten auszutauschen. Auf diese Weise ist kein erneutes Schreiben der Festplatte erforderlich, wenn die Seite in Zukunft erneut ausgetauscht werden muss, da der Kernel weiß, dass bereits eine gute Kopie auf der Festplatte vorhanden ist. Dies kann das "Thrashing" erheblich reduzieren, wenn der verfügbare RAM kritisch niedrig wird, der Swap-Speicher jedoch nicht verstopft.
Sie können sehen, wie viele Seiten sich derzeit sowohl im RAM als auch im Swap befinden. cat /proc/meminfo
Die SwapCached
Zeile gibt die Datenmenge an, die sich auf Seiten befindet, die sich derzeit sowohl im RAM als auch auf der Festplatte befinden. Wenn Sie der Meinung sind, dass Ihr aktueller Swap ihn höher als erwartet verwendet, überprüfen Sie den SwapCached-Wert, da dies möglicherweise die Diskrepanz erklärt.
Dies ist normalerweise an die von Ihnen verwendete Hardware gebunden. Auf der meisten Hardware (einschließlich Intel) steuert die MMU den gesamten Prozess.
Wenn ein Programm Speicher zuweist, fordert es ihn an die MMU an und erhält eine virtuelle Adresse zurück. Die MMU registriert diese Seite wiederum als "in Verwendung" in der globalen Adressraumkarte.
Wenn das Programm tatsächlich auf diesen Speicherplatz zugreift, sucht die MMU die Seite in der Adresszuordnung. Befindet sich diese Seite im "Live" -Speicher, sendet sie einen "Live" -Zeiger an das Betriebssystem zurück, der das Lesen / Schreiben des Speichers im Auftrag des Programms übernimmt. Wenn der Speicher derzeit nicht zugewiesen ist, wird ein Seitenfehler ausgelöst. Diese Prozessorausnahme wird dann vom Betriebssystem abgefangen, das dann dafür verantwortlich ist, herauszufinden, wo sich die Daten in der Auslagerungsdatei befinden, sie in den physischen Speicher zu laden und die Seite an die MMU zurückzugeben, damit der anfängliche Prozess fortgesetzt werden kann.
Dies bedeutet, dass, wenn nicht auf die Speicherseite zugegriffen wird, diese nach dem Auslagern nie wieder in den "Live" -Speicher zurückkehrt. Aus diesem Grund gibt es normalerweise eine Betriebssystem-API, mit der Programme festlegen können, dass ein bestimmter Speicherblock NICHT auf die Festplatte übertragen werden soll und im Speicher bleiben soll (ich weiß nichts über Linux, aber unter Windows ist es die VirtualLock-Funktion). .
mlock(2)
linux.die.net/man/2/mlock