Was sind die genauen Bedingungen, unter denen Linux Prozessspeicher vom RAM in eine Auslagerungsdatei austauscht?


7

Mein Server verfügt über 8 GB RAM und 8 GB für die Auslagerungsdatei. Ich habe speicherintensive Apps ausgeführt. Diese Apps haben Spitzenlasten, bei denen die Swap-Nutzung zunimmt. Es wird ungefähr 1 GIG Swap verwendet.

Ich habe einen anderen Server mit 4 GB RAM und 8 GB Swap und ähnlichen speicherintensiven Apps. Aber hier ist die Swap-Nutzung sehr vernachlässigbar. Rund 100 MB.

Ich habe mich gefragt, wie die genauen Bedingungen oder eine grobe Formel lauten, auf deren Grundlage Linux einen Prozessspeicher im RAM in die Auslagerungsdatei austauscht. Ich weiß, dass es auf dem Swapiness-Faktor basiert. Worauf basiert es noch? Dateigröße tauschen? Alle Hinweise auf die interne Dokumentation / den Quellcode von Linux kernal, die dies erklären, sind großartig.

Antworten:


3

Das VM-Subsystem eines Linux-Kernels ist ein sehr kompliziertes Tier. Der Kernel verwendet Heuristiken und Algorithmen, um zu bestimmen, welche Seiten wann ein- und ausgelagert werden sollen. Ich glaube nicht, dass es eine einfache Formel gibt, die beschreiben kann, wie und wann Seiten auf die Festplatte gelegt werden. Vielleicht ist dieser LWN-Artikel für Sie von Nutzen:

http://lwn.net/Articles/83588/


2

Wie Sie wahrscheinlich wissen, verwendet der Linux-Kernel so viel Speicher wie möglich, um Dinge zwischenzuspeichern. Das ist der Grund, warum die Ausgabe von free so aussieht, als hätte ich fast keinen Speicher mehr, so die oberste Zeile:

 $ free -m
              total       used       free     shared    buffers     cached
 Mem:          3168       2963        205          0        155       1263
 -/+ buffers/cache:       1543       1624
 Swap:          494         86        407

Der wichtige Teil ist jedoch die Menge an RAM, die Puffer und Cache nicht verwenden

 -/+ buffers/cache:       1543       1624

Trotzdem werden in diesem Beispiel alle bis auf 205 MB Speicher verwendet, auch wenn es sich um einen Cache handelt. Wie mir erklärt wurde (oder zumindest so, wie ich es verstanden habe), wenn ein Programm plötzlich> 205 MB Speicher anfordert, kommt dieser Block aus dem Swap heraus, so dass der Prozess den Speicherblock haben kann, dann kommt er aus Swap, sobald die Möglichkeit besteht, Speicher freizugeben, der vom Cache verwendet wird.

Wie bereits erwähnt, sind die zugrunde liegenden Mechanismen komplex und gehen weit über mein Verständnis hinaus. Ich habe Ted Ts'o in einer Klasse, die er an der LISA unterrichtete, fast diese identische Frage gestellt, und ich habe Ihnen im Wesentlichen die gleiche Antwort gegeben, die er mir gegeben hat, oder zumindest so, wie ich es verstanden habe.

Ich vermute übrigens, dass der im Swap "verwendete" Speicher zu diesem Zeitpunkt von nichts verwendet wird, sondern nur noch nicht freigegeben wurde.


1
swapoff -a && swapon -asollte verwendet werden, um diesen Swap-Speicherplatz freizugeben.
Pfo

Wenn ein Programm plötzlich nach> 205 MB Arbeitsspeicher fragen würde, müsste Linux keinen Arbeitsspeicher "aus dem Austausch" holen. Stattdessen könnte das System einfach entscheiden, dass einige seiner Festplatten-Cache-Seiten nicht so wichtig sind wie die Bereitstellung dieser RAM-Anforderung, diese Seiten als nicht verwendet markieren und ihren Inhalt löschen und sie dann dem Prozess übergeben. Schließlich kann alles im Festplatten-Cache später einfach wieder eingelesen werden, wenn sich jemand die zwischengespeicherte Datei erneut ansieht! Swap wäre nicht einmal involviert.
Brandon Rhodes

Das ist nicht die Art und Weise, wie es mir erklärt wurde (oder zumindest, wie ich die Erklärung verstanden habe)
Matt Simmons

2

Ausgehend von der Antwort von pfo kann ein Anbieter auch seine bereitgestellten Kernel (s) vorab anpassen, um den Austausch auf eine bestimmte Art und Weise zu handhaben. Auf einem Red Hat-System können Sie einen Großteil davon in /etc/sysctl.conf konfigurieren - Google-Einstellungen wie:

vm.swappiness
vm.vfs_cache_pressure

Durch sorgfältiges Anpassen des Systemaustauschs an die spezifischen Anforderungen Ihrer Anwendung können Sie möglicherweise die Swap-Nutzung auf diesem 8-GB-Computer reduzieren. Ich habe einen Hinweis in meinen Dateien, der für vm.swappiness besagt, dass "die Verwendung des Swap-Speichers auf Kernel 2.6.xx standardmäßig auf 60% eingestellt ist", aber den Link, in dem ich das gelesen habe, nicht gespeichert hat. Nehmen Sie ihn also mit einem Körnchen aus Salz. :) :)


1

Genau dieses Problem trat bei JBoss-App-Produktionsservern in AWS auf.

Ich würde sysctl -a beide Systeme unterscheiden.

1) Setzen Sie für Server vm.swappiness auf nahe 0. Dies bevorzugt, dass Inhalte gespeichert werden.

2) Aktivieren Sie eine kleine Auslagerungsdatei auf allen Servern, damit Sie die tatsächliche Speicherlast überwachen können. (Überprüfen Sie den verwendeten Swap%).

3) Überwachen Sie Seitenfehler (nFLT) mit Cacti oder ähnlichem.

4) Überprüfen Sie die Grenzen.

5) Abstimmung basierend auf messbarer App-Leistung.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.