Ständig zunehmende Swap-Größe unter Linux und nicht zurückgeforderter Swap-Speicherplatz?

10

Ich habe eine 8 GB RAM Linux Box, auf der 4 Tomcat Server ausgeführt werden. Eine davon ist auf 3000 MB Speicher eingestellt (Einstellung jvm -Xms und -Xmx), andere auf 1500 MB. Die Swap-Partition ist ebenfalls auf 8Gigs eingestellt. Wenn ich diese Server starte, ist die Auslastung der Auslagerungsdateien gering. Über einen Zeitraum von Tagen und zu bestimmten Zeiten, wenn einer / alle Server in Spitzenaktivität sind, nimmt die Swap-Nutzung jedoch zu. Hier ist eine typische sar-r-Ausgabe.

kbmemfree kbmemused% memused kbbuffers kbcached kbswpfree kbswpused % swpused kbswpcad

48260 8125832 99,41 196440 2761852 7197688 1190912 14,20 316044

75504 8098588 2399460 7197688 198032 99,08 1.190.912 14,20 316.032

Es zeigt einen derzeit verwendeten Swap von 14,2%. Das Lustige ist, dass% NIE abnimmt . Es steigt weiter an und erreicht bis zu 30-40% . Wir starten unsere Server wöchentlich neu.

Ich würde davon ausgehen, dass der prozentuale Anteil der Swpused in Perioden mit Spitzenaktivität zunimmt und in Perioden mit geringer Aktivität abnimmt. Oder zumindest konstant bleibt. Dies sieht so aus, als würde der Swap-Bereich vom Betriebssystem niemals zurückgefordert.

Ausgabe von frei: frei -m insgesamt verwendete frei geteilte Puffer zwischengespeichert Mem: 7982 7937 45 0 32 2088 - / + Puffer / Cache: 5816 2166 Swap: 8191 1163 7028

Es gibt also mindestens 2 g freien Ram. Die Frage ist also, warum der Swap-Bereich weiter zunimmt und vom Betriebssystem nicht zurückgefordert wird. Oder wie man dies debuggt, um herauszufinden, was passiert.

Zenil
quelle

Antworten:

12

Wenn Informationen auf eine Disc ausgelagert und später wieder in den Speicher eingelesen werden, werden sie häufig im Swap-Bereich zugewiesen, bis der Swap-Speicherplatz knapp wird. Das heißt, wenn dieselben Informationen später erneut ausgetauscht werden müssen und sich nicht geändert haben, kann das Betriebssystem die Seiten einfach aus dem zugewiesenen RAM löschen, ohne dass etwas auf die Disc geschrieben werden muss, um Zeit zu sparen.

Der Swap, der dem zurückgelesenen Material zugewiesen wurde, wird ebenfalls freigegeben

  1. wenn die relevanten Seiten überhaupt nicht mehr benötigt werden (dh von der Anwendung freigegeben werden)
  2. wenn die relevanten Seiten geändert werden (sodass die Kopie auf der Disc nicht mehr aktuell ist)
  3. Die Maschine verfügt nicht über genügend Swap-Speicherplatz, sodass einige Dinge, die sich bereits im RAM befinden, gelöscht werden, um Platz zu schaffen

Suchen Sie /proc/meminfonach einer Zeile mit dem Namen "SwapCached". Dieser Eintrag zählt Seiten, die sich sowohl im RAM als auch in Swap-Partitionen befinden. Wenn Sie beispielsweise zufällig eine kleine VM /proc/meminfoauswählen, zeigt die virtuelle Datei einer meiner VMs Folgendes:

SwapTotal:        698816 kB
SwapFree:         624520 kB
SwapCached:        17232 kB

Dies zeigt an, dass 74268 KB Swap-Speicherplatz zugewiesen sind, aber dass diese Seiten im Wert von 17232 KB derzeit auch im RAM zugeordnet sind (kann also jederzeit vom Swap freigegeben werden, wenn der Speicherplatz von etwas anderem benötigt wird).

Es wird auch zweifellos Seiten geben, die vor langer Zeit ausgetauscht wurden und seitdem nie wieder verwendet wurden. Der Kernel lädt keine Seiten aus dem Swap neu, nur weil es freien RAM gibt, in den er zurückgelesen werden kann, da dieser freie RAM möglicherweise besser für Cache oder Puffer verwendet wird. In Swap geschriebene Seiten werden im Allgemeinen nur erneut gelesen, wenn sie das nächste Mal benötigt werden.

Wenn Sie löschen möchten, was sich im Swap befindet, solange Sie über genügend freie und / oder freisetzbare Elemente verfügen (dh frei + Cache + Puffer (abzüglich der Teile der c + b-Zählungen, die nicht frei verfügbar sind, RightThisInstant)), drehen Sie sie einfach um aus und wieder ein mit swapoff -a && swapon -a.

Natürlich könnte es auch irgendwo zu einem Speicherverlust kommen, aber das ist nicht die einzige Erklärung für das Verhalten, das Sie sehen.

David Spillett
quelle
Hervorragende Antwort. Danke. Mein System zeigt also derzeit SwapTotal: 8388600 kB SwapFree: 7197688 kB SwapCached: 595724 kB So ist der tatsächliche Swap Free = 7197688 + 595724 = 7793412. Actul Swap Used = 8388600 - 7793412 = 595188 == 581MB. Ich denke, 581 MB Auslagerungsdateienutzung sind für ein 8-GB-System mit 4 laufenden Apps angemessen. Lassen Sie mich dies für die nächsten Tage überwachen und sehen, ob die Zahl von swapCached im Verhältnis zu% swapUsed weiter zunimmt.
Zenil
2

Grundsätzlich müssen Sie sich nicht darum kümmern. Es ist wichtig zu wissen, wie viel E / A an den Swap geht (siehe Befehl 'vmstat'). Mehr Sachen im Tausch zu haben kostet nichts. Die einzigen Kosten sind das Einlegen von Inhalten in den Tausch (Seite rein) oder das Herausnehmen (Seite raus). Daher ist es für das Betriebssystem durchaus vernünftig, den Swap wachsen zu lassen.

Guillaume
quelle
1
Es ist wichtig zu wissen, warum der Swap wächst und nie abnimmt. Was ist, wenn wir unseren Servern erlauben, wochenlang weiterzulaufen? Wird der Swap über das Limit hinaus wachsen und zu Speicherproblemen führen? Der Swapin / Swapout sieht "vernünftig" aus. Während Perioden mit Spitzenaktivität gibt es einen hohen Swapin / Swapout (und auch% Swapused steigt). Während normaler Perioden ist Swapin / Swapout minimal, aber% Swapused nimmt nicht ab
Zenil
0

Solange Sie Swap-Speicherplatz zur Verfügung haben, muss das Betriebssystem keinen Swap-Speicherplatz freigeben. Es wird freigegeben, wenn kein Platz mehr vorhanden ist. Aber wenn Sie in diese Situation geraten, haben Sie definitiv ein Problem.

Christian
quelle
0

Es gibt keine Möglichkeit festzustellen, ob dies irgendwann zu einem Problem wird, es sei denn, Sie führen einen Server lange genug aus, um festzustellen, ob es zu einem Problem wird.

Grundsätzlich tauscht das Betriebssystem Dinge aus, die nicht verwendet werden, um jederzeit Speicherplatz frei zu halten, falls ein neues Programm gestartet wird. Swap-Speicherplatz wird erst freigegeben, wenn er benötigt wird. Dies bedeutet, dass Sie 100% Swap-Speicherplatz verwenden können und keine Leistungsprobleme haben. Sie müssen sich Sorgen machen, wenn dies durch einen Speicherverlust verursacht wird. Es ist nicht unbedingt ein Speicherverlust, könnte es aber sein.

Java ist nicht anfällig für Speicherlecks, kann jedoch insbesondere bei komplizierten Apps auftreten.

Joshua Nurczyk
quelle