Sollte ich mir Sorgen machen, dass Swap auf einem Host mit fast 40 GB freiem Speicher verwendet wird?


39

Ich habe unten einen Produktionshost:

htop

Das System verwendet 1 GB Swap, während fast 40 GB freier, ungenutzter Speicherplatz zur Verfügung stehen. Sollte ich mir darüber Sorgen machen, oder ist es meistens normal?


23
Eigentlich sollten Sie sich Gedanken über einen Produktionshost machen, bei dem die tatsächliche Last fast 40 GB Arbeitsspeicher verschwendet. Sicherlich könnte es eine Verwendung finden, um diesen Speicher zu belegen - die Anwendungen greifen auf die Festplatten zu, könnte es diesen Speicher nicht verwenden, um einige dieser Daten zwischenzuspeichern, E / A zu reduzieren und seine Leistung zu verbessern? Warum werden 40 GB Arbeitsspeicher auf einem Computer verschwendet, der gerade arbeitet? Darüber sollten Sie sich Sorgen machen. Das ist nicht normal
David Schwartz

25
Es wäre wirklich nützlicher, wenn Sie uns die Ausgabe von zeigen würden free -m. Die Grafiken sind schwer zu lesen.
user9517 unterstützt GoFundMonica

@DavidSchwartz - Ich habe eine verwandte Frage, die gerade noch aktiv ist. serverfault.com/questions/825909/…
MrDuk

Antworten:


68

Dies ist kein Problem und wahrscheinlich normal. Viele Codes (und möglicherweise Daten) werden sehr selten verwendet, sodass das System sie austauscht, um Speicherplatz freizugeben.

Das Auslagern ist meist nur dann ein Problem, wenn der Speicher kontinuierlich ein- und ausgelagert wird. Es ist diese Art von Aktivität, die die Leistung beeinträchtigt und auf ein Problem an einer anderen Stelle im System hinweist.

Wenn Sie Ihre Swap-Aktivität überwachen möchten, können Sie mit mehreren Dienstprogrammen, aber vmstatin der Regel sehr nützlich, z

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 348256  73540 274600    0    0     1     9    9    6  2  0 98  0  0
 0  0      0 348240  73544 274620    0    0     0    16   28   26  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   29   33  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   21   23  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   24   26  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   23   23  0  0 100  0  0

Ignorieren Sie die erste Zeile als Aktivität seit dem Systemstart. Beachten Sie die Spalten siund sounter ---swap--; Sie sollten im Allgemeinen ziemlich klein sein, wenn nicht die meiste Zeit 0.

Erwähnenswert ist auch, dass dieses präventive Austauschen mit einer Kernel-Einstellung gesteuert werden kann. Die Datei at /proc/sys/vm/swappinessenthält eine Zahl zwischen 0 und 100, die dem Kernel mitteilt, wie aggressiv der Speicher ausgelagert werden soll. Zeigen Sie die Datei an, um zu sehen, auf was dies festgelegt ist. Standardmäßig haben die meisten Linux-Distributionen den Standardwert 60. Wenn Sie jedoch keine Auslagerungen sehen möchten, bevor der Speicher voll ist, geben Sie eine 0 in die Datei wie folgt ein:

echo 0 >/proc/sys/vm/swappiness

Dies kann durch Hinzufügen dauerhaft gemacht werden

vm.swappiness = 0

zu /etc/sysctl.conf.


14
Erwähnenswert ist auch, dass dieses präventive Austauschen mit einer Kernel-Einstellung gesteuert werden kann. Die Datei unter / proc / sys / vm / swappiness enthält eine Zahl zwischen 0 und 100, die dem Kernel mitteilt, wie aggressiv der Speicher ausgelagert werden soll. Zeigen Sie die Datei an, um zu sehen, auf was dies festgelegt ist. Standardmäßig Standard der meisten Linux - Distributionen dies auf 60, aber wenn Sie keinen Swapping sehen wollen , bevor Speicher erschöpft ist, Echo ein 0 in die Datei wie folgt: echo 0 >/proc/sys/vm/swappiness. Dies kann durch Hinzufügen vm.swappiness = 0von /etc/sysctl.conf dauerhaft gemacht werden.
Virtex

@virtex: Ich verwende gerne swappiness = 1 oder etwas weniger als 10 auf meinem Desktop. Das kann auch auf Servern meistens gut gehen. Entmutigen Sie das Auslagern, um RAM für mehr Pagecache freizugeben, ohne es vollständig zu verbieten.
Peter Cordes

1
@PeterCordes Achten Sie auf Server, insbesondere auf Server, die auf Datenbanken zugreifen oder Dateien bereitstellen. Diese können sehr davon profitieren, dass Speicher für Datei-Caches verfügbar wird.
Jonas Schäfer

4
@JonasWielicki: Selbst mit swappiness=7oder ohne etwas werden langfristig nicht verwendete Seiten ausgetauscht. Es gibt einen großen Unterschied zu swappiness=0jedem anderen Wert, auch zu niedrigen Werten. Die Kernel-Standardeinstellung swappiness=60ist im Allgemeinen für Server geeignet und nur für die interaktive Desktop-Verwendung, bei der eine geringe Austauschbarkeit gut ist. Aber es auf 7 oder so zu setzen, sollte nicht viel schaden. (Aber ich habe nicht überprüft, ich bin kein Server-Sysadmin).
Peter Cordes

2
@PeterCordes Solange Sie keinen Druck auf das Gedächtnis ausüben, swappinessfunktioniert alles hervorragend. Mit dem Druck werden Sie sehen, dass der swappiness=7Dateicache für einen längeren Zeitraum fast vollständig ausgehungert ist , während swappiness=60viel Cache aufgelöst wird, aber auch innerhalb von Sekunden ein Auslagerungsprozess einsetzt. Es ist immer noch der Cache, der das Schlagen nimmt, aber auf eine viel ausgeglichenere Art und Weise.
Kubanczyk

25

Linux schreibt vorbeugend Seiten auf die Festplatte, wenn es nichts Besseres zu tun hat. Dies bedeutet jedoch nicht , dass diese Seiten aus dem Speicher entfernt werden. Es ist nur so , dass für den Fall , es muss diese Seiten in der Zukunft vertreiben, ist es nicht für müssen warten sie auf die Festplatte geschrieben werden, da sie bereits vorhanden sind.

Schließlich ist der Grund, warum Ihnen der Speicher ausgeht, wahrscheinlich, dass Ihr Computer bereits hart arbeitet und Sie ihn nicht zusätzlich mit dem Austauschen belasten möchten. Tauschen Sie lieber, wenn die Maschine nichts tut.

Aus einem ähnlichen Grund sollte Ihr Speicher immer voll sein. Speicherseiten, Dateisystem-Cache, tmpfses gibt so viele Dinge, die im Speicher gehalten werden könnten. Sie sollten sich wirklich Sorgen machen, wenn Ihr Gedächtnis leer ist. Immerhin haben Sie eine Menge Geld dafür bezahlt (zumindest im Vergleich zu der gleichen Menge an Speicherplatz), damit es besser genutzt werden kann!


Jorg, die Seiten, die der Kernel präventiv auf Festplatten schreibt, sind keine Auslagerungsseiten, sondern schmutzige Festplatten-Cache-Seiten. Die Tunnables vm.dirty_background _... steuern dies. Die Auslagerungsaktivität beginnt gemäß der Auslagerungs-Tunnelung und wartet nicht auf Leerlaufzeiten.
Lucas

11

Swap verwendet ist nicht schlecht, aber eine Menge Swap-Aktivität ist

  vmstat 1
  procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
  6  0 521040 114564   6688 377308    8   13   639   173    0 1100  5  4 90  0
  1  0 521040 114964   6688 377448    0    0   256     0    0 1826  3  4 94  0
  0  0 521040 115956   6688 377448    0    0     0     0    0 1182  7  3 90  0
  0  0 521036 115992   6688 377448    4    0    16     0    0 1154 10  2 88  0
  3  0 521036 114628   6696 377640    0    0   928   224    0 1503 15 17 67  1

Der Spaltenwechsel ist überhaupt kein Problem. Nicht - Null - Werte in den Spalten si und so sind tödlich für die Serverleistung. Besonders diejenigen mit viel RAM.

Es ist am besten, Swapinness auf Computern mit mehreren GB RAM zu deaktivieren:

sysctl -w vm.swappiness=0

Dadurch wird der Swap nicht deaktiviert. Linux wird nur angewiesen, den Swap als letzte Maßnahme zu verwenden. Dadurch werden ein paar MB Programme verschwendet, die sich nicht im RAM befinden müssen. Es ist jedoch vorzuziehen, die Warteschlangen für den Festplattenzugriff auszutauschen.

Edit 1: warum der Standardwert von swappiness nicht optimal ist

Wir müssen uns daran erinnern, dass ein großer 486 vor zwei Jahrzehnten nur 32 MB RAM hatte. Swap-Algorithmen wurden entwickelt, um den gesamten Arbeitsspeicher in Sekundenbruchteilen auf die Festplatte zu verschieben. Selbst mit den langsameren Scheiben dieser Zeit. Aus diesem Grund sind Standard-Swap-Richtlinien so aggressiv. RAM war damals der Engpass. Seitdem hat sich die RAM-Größe mehr als 10.000 Mal und die Festplattengeschwindigkeit weniger als 10 Mal erhöht. Dies verschob den Engpass auf die Festplattenbandbreite.

Edit 2: Warum ist si so tödlich für Server?

Si und so ist Aktivität auf Rechnern mit Tonnen RAM tödlich, weil das System mit sich selbst um RAM kämpft. Was passiert ist, dass Festplatten, auch große Speicher, im Vergleich zu RAMs zu langsam sind. Aggressiver Austausch bevorzugt den Kernel-Festplatten-Cache gegenüber Anwendungsdaten und ist die häufigste Quelle für den Kampf um RAM. Da das Betriebssystem den Festplatten-Cache auf jedem si freigeben muss, ist die Lebensdauer des zusätzlichen Caches, den Swap bereitstellt, zu kurz, um nützlich zu sein. Das Ergebnis ist, dass Sie die Festplattenbandbreite zum Speichern des Caches verwenden, der wahrscheinlich nicht verwendet wird, und Ihre Programme anhalten, während sie auf die si- Seiten warten . Dies bedeutet, dass viele kritische Ressourcen verbraucht werden, ohne dass die Anwendungen davon profitieren.

Beachten Sie den Titel der Antwort "Viel Swap-Aktivität auf Servern mit viel RAM". Dies gilt nicht für Maschinen mit gelegentlicher Aktivität. Dies gilt möglicherweise nicht für die Zukunft, wenn in den Betriebssystemen intelligentere Auslagerungsalgorithmen entwickelt werden.

Edit 3: "kalte" Seiten

Die Leute romantisieren den Tauschalgorithmus. Einige sagen, "es braucht weniger belegte Seiten des RAM", aber dies ist überhaupt nicht das, was der Kernel tut. Die Sache mit Swap ist schwer zu verstehen, da der Kernel nicht weiß, was eine "kalte Seite" ist. Der Kernel verfügt nicht über eine gute Metrik, um festzustellen, ob die Seite verwendet wird oder wahrscheinlich in naher Zukunft verwendet wird. Um zu umgehen, dass der Kernel Seiten mehr oder weniger zufällig in den Swap einfügt, bleiben Seiten, die nicht benötigt werden, dort. Das Problem dieses Algorithmus ist, dass Seiten zum Tausch gehen müssen, um zu wissen, ob sie von den Anwendungen benötigt werden. Und das bedeutet, dass eine Menge "heißer" Seiten in den Tausch gehen werden. Das Problem dabei ist, dass Festplatten im Vergleich zum RAM zu langsam sind.

Ich habe meinen eigenen Benchmark erstellt, der ein realistisches Szenario darstellt, das für viele Anwendungen mit einem anständigen Volumen sehr häufig ist. Bei meinen Tests habe ich keine Vorteile für den Durchsatz oder die Latenz festgestellt, wenn Swaps verwendet werden. Weit davon entfernt. Wenn der Austausch beginnt, verlangsamt er sowohl den Durchsatz als auch die Latenz um mindestens eine Größenordnung.

Ich gehe noch ein bisschen weiter: Ich verstehe, dass Swap nicht für die Verarbeitung vorgesehen ist. Swaps sind nur für Notfälle. Diese Momente, in denen zu viele Anwendungen gleichzeitig ausgeführt werden und Sie einen Speicherspitzenwert erhalten. Ohne Swap würde dies zu Fehlern aufgrund von Speichermangel führen. Ich betrachte Swap-Nutzung als Ausfall der Entwicklungs- und Produktionsteams. Dies ist nur eine Meinung, die weit über das hinausgeht, was wir hier besprochen haben, aber ich denke. Natürlich verfügen meine Anwendungen über eine hervorragende Speicherverwaltung.


9
"Am besten Swapinness deaktivieren" Am besten, warum? (Am besten zu welchem ​​Zweck?) Die Standardeinstellung ist möglicherweise nicht für alle Verwendungszwecke geeignet, aber ich benötige noch einen Grund, sie zu ändern.
Jpaugh

3
Wie ist sitödlicher für Ihren Server als bi? Beides bedeutet, dass ein Programm darauf wartet, dass 4096 Bytes von der Festplatte in den Speicher gelesen werden. Das biist aus jeder Datei und siaus einer bestimmten engen Kategorie von Dateien (aber ihre Bytes bewegen sich genauso schnell durch genau denselben Pfad).
Kubanczyk

2
Ein 486 mit 128 MB RAM war sehr selten und hätte als Mainframe oder Supercomputer gedeutet - daher hätte die CPU wahrscheinlich nicht 486 betragen. Mein alter 486 hatte 4 MB RAM und ich war neidisch auf den Computer meines Freundes mit 16 MB RAM (große Server) 16 bis 32 MB RAM). Schneller Vorlauf zu Pentiums und wir sehen normalerweise 8 bis 16 MB. Als Pentium3 zum ersten Mal auftauchte (als die CPUs normalerweise über 1 GHz starteten), waren 32 MB normal und die Webserver hatten normalerweise 64 bis 128 MB.
Slebetman

swappiness=0scheint völlig ungeeignet für Server. Sie könnten es für ein interaktives Desktop-System in Betracht ziehen (aber selbst dann swappiness=1ist es eine bessere Wahl, um eventuell wirklich kalte Seiten auszutauschen). Siehe Kommentare zu einer anderen Antwort . swappiness=7oder etwas reduziert die Auslagerungsaktivität drastisch, ohne dass kalte Seiten bis zum OOM in den RAM gepinnt werden, und ist eine Überlegung wert, wenn Sie der Meinung 60sind, dass sie für einen bestimmten Server zu ausgelagert sind.
Peter Cordes

1
@kubanczyk: Ich finde sidas schlimmer als bi. Die meisten Server-Softwareprogramme basieren auf der Annahme, dass E / A von der Festplatte langsam sein können, und verwenden Threads, asynchrone E / A oder eine andere Technik, um im Allgemeinen während des Wartens auf E / A reaktionsfähig zu bleiben. Ein Seitenfehler kann überall auftreten. Im schlimmsten Fall kann nach dem Aufheben einer Sperre ein langsamer Seitenfehler auftreten, der alle anderen Threads für ~ 10 ms daran hindert, in diesen kritischen Abschnitt zu gelangen (mit Auslagerung bei langsamer Rotation). Dies kann plausibel sein, wenn ein kritischer Abschnitt Daten aus einer gemeinsam genutzten Datenstruktur auf eine möglicherweise kalte Seite kopiert.
Peter Cordes

8

Dies ist keine Antwort auf Ihre Frage. sondern nur zusätzliche Informationen, die Ihnen helfen, eine fundierte Entscheidung zu treffen.

Wenn Sie wissen möchten, welche Prozesse speziell wie viel Swap verwenden, finden Sie hier ein kleines Shell-Skript:

#!/bin/bash

set -o posix
set -u

OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"` ; do
  PID=`echo $DIR | cut -d / -f 3`
  PROGNAME=`ps -p $PID -o comm --no-headers`

  SUM=0
  for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'` ; do
    let SUM=$SUM+$SWAP
  done
  echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"

  let OVERALL=$OVERALL+$SUM
done
echo "Overall swap used: $OVERALL"

Ich sollte auch hinzufügen, dass tmpfs auch auslagern wird. Dies ist häufiger auf modernen Linux-Systemen der Fall, die systemd verwenden und mit tmpfs User-Space / tmp-Overlays erstellen.


Nettes Drehbuch. Schauen Sie sich auch smem an.
user9517 unterstützt GoFundMonica

Ich denke man könnte das viel effizienter schreiben ( weit weniger gegabelte Prozesse) mit awk '/Swap/ {sw += $2} FNR==1 { /*first line of a new file */ find the command somehow, maybe still fork/exec ps;} END { print totals }' /proc/[0-9]*/smaps. Das läuft cut und ps für jeden Prozess und grep + awk mehrmals für jeden Prozess im System.
Peter Cordes

0

Ich habe festgestellt, dass die Replikation von MySQL Cluster langsamer wird oder fehlschlägt, wenn die Agenten stark ausgetauscht werden. Vielleicht haben einige Anwendungen nichts dagegen oder profitieren sogar von einem gewissen Austausch, aber die Datenbanken scheinen wirklich darunter zu leiden. Wie auch immer viele Diskussionen, die ich in Foren gesehen habe, behandeln den Austausch, der aus der spezifischen Arbeitslastdiskussion dekontextualisiert wurde.

In der DBA-Welt scheint der Konsens zu lauten: "Wenn Sie MySQL (oder wirklich jedes andere DBMS) ausführen, möchten Sie keine E / A in Ihrem Auslagerungsbereich sehen. Skalieren der Cache-Größe (mithilfe von) innodb_buffer_pool_size (im Fall von MySQL) ist die Standardpraxis, um sicherzustellen, dass genügend freier Speicher vorhanden ist, sodass kein Austausch erforderlich ist.

Aber was ist, wenn Sie einen Fehler oder eine Fehleinschätzung begehen und tauschen? Wie stark wirkt es sich wirklich auf die Leistung aus? Genau das wollte ich untersuchen. "

Ich hoffe, die Leser finden die folgenden Links apropos.

https://www.percona.com/blog/2017/01/13/impact-of-swapping-on-mysql-performance/

https://www.percona.com/blog/2010/01/18/why-swapping-is-bad-for-mysql-performance/


1
Willkommen bei Server Fault! Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Frederik Nielsen
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.