Frage Sollte ich besorgt sein, dass Swap auf einem Host mit fast 40 GB freiem Speicher verwendet wird?


Ich habe einen Produktionshost, unten:

htop

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


39
2018-01-12 17:04


Ursprung


Eigentlich sollte man sich Sorgen machen über einen Produktions-Host mit einer echten Last, die fast 40 GB Speicher verschwendet. Sicherlich könnte es einige Verwendung finden, um diesen Speicher zu verwenden - die Anwendungen greifen auf die Festplatten zu, könnten sie diesen Speicher nicht dazu verwenden, einige dieser Daten zwischenzuspeichern, I / Os zu reduzieren und ihre Leistung zu verbessern? Warum werden 40 GB Speicher auf einer Maschine verschwendet, die Arbeit leistet? Darüber solltest du besorgt sein. Das ist nicht normal. - David Schwartz
Es wäre wirklich sinnvoller, wenn Sie uns die Ausgabe von zeigen free -m. Die Grafiken sind schwer zu lesen. - Iain
@DavidSchwartz - Ich habe eine verwandte Frage, die immer noch aktiv ist. serverfault.com/questions/825909/ ... - MrDuk


Antworten:


Dies ist kein Problem und ist wahrscheinlich normal. Viel Code (und möglicherweise Daten) wird sehr selten verwendet, so dass das System es austauscht, um Speicher freizugeben.

Swapping ist meist nur ein Problem, wenn Speicher ständig ein- und ausgelagert wird. Es ist diese Art von Aktivität, die Leistung tötet und ein Problem an anderer Stelle im System vorschlägt.

Wenn Sie Ihre Swap-Aktivität überwachen möchten, können Sie mit mehreren Dienstprogrammen aber vmstat ist normalerweise ziemlich nützlich, z.B.

$ 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

Ignoriere die erste Zeile als Aktivität, seit das System gestartet wurde. Beachten Sie das si und so Spalten unter ---swap--; Sie sollten in der Regel ziemlich kleine Zahlen sein, wenn nicht die meiste Zeit.

Erwähnenswert ist auch, dass dieses preemptive Swapping mit einer Kernel-Einstellung gesteuert werden kann. Die Datei bei /proc/sys/vm/swappiness enthält eine Zahl zwischen 0 und 100, die dem Kernel mitteilt, wie aggressiv er den Speicher austauscht. Cat die Datei, um zu sehen, was darauf eingestellt ist. Standardmäßig setzen die meisten Linux-Distributionen diesen Wert auf 60. Wenn Sie jedoch kein Swapping sehen möchten, bevor der Speicher erschöpft ist, geben Sie eine 0 in die Datei ein:

echo 0 >/proc/sys/vm/swappiness

Dies kann durch Hinzufügen dauerhaft gemacht werden

vm.swappiness = 0

zu /etc/sysctl.conf.


68
2018-01-12 17:10



Erwähnenswert ist auch, dass dieses preemptive Swapping mit einer Kernel-Einstellung gesteuert werden kann. Die Datei at / proc / sys / vm / swappiness enthält eine Zahl zwischen 0 und 100, die dem Kernel mitteilt, wie aggressiv er den Speicher austauscht. Cat die Datei, um zu sehen, was darauf eingestellt ist. Standardmäßig setzen die meisten Linux-Distributionen diesen Wert auf 60. Wenn Sie jedoch kein Swapping sehen möchten, bevor der Speicher erschöpft ist, geben Sie eine 0 in die Datei ein: echo 0 >/proc/sys/vm/swappiness. Dies kann durch Hinzufügen dauerhaft gemacht werden vm.swappiness = 0 nach /etc/sysctl.conf. - virtex
@virtex: Ich verwende swappiness = 1, oder etwas weniger als 10, auf meinem Desktop. Das könnte auch auf Servern die meiste Zeit gut gehen. Wir raten dringend davon ab, den Arbeitsspeicher für mehr Seitencache freizugeben, ohne ihn vollständig zu verbieten. - Peter Cordes
@PeterCordes Achten Sie auf Server, insbesondere diejenigen, die auf Datenbanken zugreifen oder Dateien bereitstellen. Diese können sehr davon profitieren, dass der Speicher für Dateicaches verfügbar wird. - Jonas Schäfer
@JonasWielicki: Sogar mit swappiness=7 oder etwas, lange ungenutzte Seiten werden ausgelagert. Es gibt einen großen Unterschied zwischen swappiness=0 und jeden anderen Wert, auch niedrige Werte. Der Kernel-Standard swappiness=60 ist in der Regel gut für Server geeignet und nur für den interaktiven Einsatz auf Desktop-Computern, bei denen eine geringe Swappiness-Funktion gut ist. Aber es auf 7 oder etwas einzustellen sollte nicht viel weh tun. (Aber ich habe nicht überprüft, ich bin kein Server-Systemadministrator). - Peter Cordes
@PeterCordes Bis du den Erinnerungsdruck hast, egal swappiness funktioniert super. Mit dem Druck werden Sie das sehen swappiness=7 Verhungert den Dateicache fast komplett für einen längeren Zeitraum, während swappiness=60 liquidiert viel Cache, beginnt aber auch innerhalb von Sekunden auszuwechseln. Es ist immer noch der Cache, der die Prügel nimmt, aber in einer viel ausgeglicheneren Art und Weise. - kubanczyk


Linux wird präventiv Seiten auf die Festplatte schreiben, wenn es nichts besseres zu tun hat. Das tut nicht Das bedeutet, dass diese Seiten aus dem Speicher gelöscht werden. Es ist nur so, falls es passiert Muss Verwerfen Sie diese Seiten irgendwann in der Zukunft, es muss nicht darauf warten, dass sie auf die Festplatte geschrieben werden, weil sie schon da sind.

Der Grund dafür, dass Sie nicht genügend Arbeitsspeicher haben, liegt wahrscheinlich daran, dass Ihr Computer bereits hart arbeitet und Sie ihn nicht zusätzlich mit dem Austausch belasten möchten. Lieber das Tauschen, wenn die Maschine nichts macht.

Aus einem ähnlichen Grund sollte Ihr Speicher immer voll sein. Speicherseiten, Dateisystem-Cache, tmpfsEs gibt so viel Zeug, das man in Erinnerung behalten kann. Wirklich, du solltest besorgt sein, wenn dein Gedächtnis leer ist; immerhin hat man dafür viel Geld bezahlt (zumindest im Vergleich zum gleichen Speicherplatz), also sollte es besser genutzt werden!


25
2018-01-13 00:02



Jorg, die Seiten, die der Kernel präventiv auf Platten schreibt, sind keine Auslagerungsseiten, sind schmutzige Plattencacheseiten. Der vm.dirty_background _... tunnables steuert das. Die Auslagerungsaktivität startet entsprechend der taubaren Swapiness-Funktion und wartet nicht auf Leerzeiten. - Lucas


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

Die Kolumne getauscht ist überhaupt kein Problem. Nicht Nullwerte in den Spalten si und so sind für die Serverleistung tödlich. Besonders diejenigen mit viel RAM.

Es ist am besten, Swapiness auf Rechnern mit mehreren GB RAM zu deaktivieren:

sysctl -w vm.swappiness=0

Dies wird den Swap nicht deaktivieren. Es wird Linux nur anweisen, den Swap als letztes Mittel zu verwenden. Das wird einige MB Programme verschwenden, die nicht im RAM sein müssen ... Aber es ist vorzuziehen, die aufgeblähten Festplattenzugriffsschlangen zu tauschen.

Edit 1: Warum ist der Standardwert der Swappiness nicht optimal?

Wir erinnern uns, dass vor zwei Jahrzehnten ein großer 486 nur 32 MB RAM hatte. Swap-Algorithmen wurden entwickelt, wenn das gesamte RAM in einem Bruchteil einer Sekunde auf die Festplatte verschoben werden konnte. Selbst mit den langsameren Festplatten dieser Zeit. Aus diesem Grund sind Standard-Swap-Richtlinien so aggressiv. RAM war der Flaschenhals dieser Tage. Seitdem hat sich die RAM-Größe mehr als 10.000 Mal erhöht, und die Geschwindigkeit der Festplatte ist weniger als 10 Mal. Dies verlagerte den Engpass auf die Festplattenbandbreite.

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

Si und so Aktivität auf Maschinen mit Tonnen von RAM ist tödlich, weil das System mit sich selbst für RAM kämpft. Was passiert, ist, dass Festplatten, sogar große Speicher im Vergleich zu RAMs zu langsam sind. Aggressiver Swap bevorzugt den Kernel-Festplatten-Cache über Anwendungsdaten und ist die häufigste Quelle für RAM-Bekämpfung. Da das Betriebssystem den Festplattencache für alle freigeben muss si, die Lebensdauer des zusätzlichen Caches, den Swap zur Verfügung stellt, ist zu niedrig, um trotzdem nützlich zu sein. Das Ergebnis ist, dass Sie Festplattenbandbreite zum Speichern von Cache nehmen, die wahrscheinlich nicht verwendet wird, und Ihre Programme warten auf die si Seiten. Dies bedeutet, dass viele kritische Ressourcen mit wenig oder keinem Nutzen für die Anwendungen verbraucht werden.

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 in Zukunft, wenn intelligentere Swap-Algorithmen in den Betriebssystemen entwickelt werden.

Edit 3: "kalte" Seiten

Die Leute romantisieren den Swap-Algorithmus. Einige sagen "es braucht weniger benutzte Seiten des RAM", aber das ist nicht, was der Kernel überhaupt tut. Die Sache ist schwer zu verstehen, wenn Swap ist, der Kernel weiß nicht, was eine "kalte Seite" ist. Der Kernel hat keine gute Metrik, um festzustellen, ob die Seite in naher Zukunft verwendet wird oder wahrscheinlich verwendet wird. Um zu vermeiden, dass der Kernel Seiten mehr oder weniger zufällig in den Tausch einfügt, bleiben dort Seiten, die nicht benötigt werden. Das Problem dieses Algorithmus besteht darin, dass Seiten zum Austausch gehen müssen, um zu wissen, ob sie von den Anwendungen benötigt werden. Und das bedeutet, dass viele "heiße" Seiten zum Tausch gehen werden. Das Problem dabei ist, dass Festplatten im Vergleich zu RAM zu langsam sind. Die Konsequenz daraus ist, dass beim Swapping alle Anwendungen auf zufällige Pausen warten, die auf die Festplatten warten, was die Latenz und den Durchsatz beeinträchtigt.

Ich habe meinen eigenen Benchmark erstellt, der ein realistisches Szenario ist, das in vielen Anwendungen mit einem anständigen Volumen sehr häufig vorkommt. Von meinen Tests habe ich keine Vorteile beim Durchsatz oder der Latenz gesehen, wenn Swaps verwendet werden. Weit davon entfernt. Wenn Swapping gestartet wird, verlangsamt es 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 gedacht ist. Swaps sind nur für Notfälle gedacht. Die Momente, in denen zu viele Anwendungen gleichzeitig laufen und Sie einen Memory Spike bekommen. Ohne Swap würde dies zu Fehlern im Arbeitsspeicher führen. Ich halte Swap-Nutzung für ein Versagen der Entwicklungs- und Produktionsteams. Dies ist nur eine Meinung, die weit über das hinausgeht, was wir hier besprochen haben, aber das ist, was ich denke. Natürlich verfügen meine Anwendungen über eine ausgezeichnete Speicherverwaltung.


10
2018-01-12 19:27



"Am besten Swappiness deaktivieren" Am besten, warum? (Am besten zu welchem ​​Zweck?) Der Standard ist möglicherweise nicht für alle Anwendungen geeignet, aber ich brauche immer noch einen Grund, ihn zu ändern. - jpaugh
Wie ist si tödlicher für Ihren Server als bi? Beides bedeutet, dass ein Programm auf 4096 Byte wartet, um von der Festplatte in den Speicher gelesen zu werden. Das bi ist aus jeder Datei und si aus einer bestimmten engen Kategorie von Dateien (aber ihre Bytes bewegen sich genauso schnell durch genau den gleichen Weg). - kubanczyk
Ein 486 mit 128 MB RAM war sehr selten und wäre als Mainframe oder Supercomputer betrachtet worden - also wäre die CPU wahrscheinlich 486 gewesen. Meine alten 486 hatten 4 MB RAM und ich war neidisch auf die Maschine meines Freundes mit 16 MB RAM (große Server hatte 16 bis 32 MB RAM). Schneller Vorlauf zum Pentium und wir sehen 8 bis 16 MB als normal. Als Pentium3 zum ersten Mal erschien (wenn CPUs normalerweise 1 GHz überstiegen), waren 32 MB normal und Webserver hatten typischerweise 64 bis 128 MB. - slebetman
swappiness=0 scheint für Server völlig ungeeignet. Sie könnten es für ein interaktives Desktop-System in Erwägung ziehen (aber selbst dann swappiness=1 ist eine bessere Wahl, um wirklich kalte Seiten auszutauschen). Sehen Kommentare zu einer anderen Antwort. swappiness=7 oder etwas wird die Swap-Aktivität dramatisch reduzieren, ohne kalte Seiten bis OOM in den RAM zu pinnen, und es lohnt sich, darüber nachzudenken, wenn Sie denken 60 ist zu swappy für einen bestimmten Server. - Peter Cordes
@ Kubanczyk: Ich denke si ist schlimmer als bi. Die meisten Server-Software basiert auf der Annahme, dass E / A von Festplatte möglicherweise langsam ist, und verwendet Threads, asynchrone E / A oder eine andere Technik, um während des Wartens auf E / A im Allgemeinen zu reagieren. Ein Seitenfehler kann überall auftreten. Im schlimmsten Fall könnte nach einer Sperre ein langsamer Seitenfehler auftreten, der alle anderen Threads daran hindert, für ~ 10 ms in den kritischen Abschnitt einzutreten (mit Swap bei langsamer Rotation). Dies kann plausibel sein, wenn ein kritischer Abschnitt Daten von einer gemeinsam genutzten Datenstruktur auf eine potenziell kalte Seite kopiert. - Peter Cordes


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, 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 bei modernen Linux-Systemen, die systemd verwenden, die user-space / tmp-Overlays mit tmpfs erstellen.


8
2018-01-12 18:09



Nettes Skript. Sieh dir auch smeam an. - Iain
Ich denke, dass Sie das viel effizienter schreiben könnten (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


Ich habe festgestellt, dass die MySQL Cluster-Replikation langsamer wird oder fehlschlägt, wenn die Agenten stark ausgelagert werden. Vielleicht haben einige Anwendungen nichts dagegen oder profitieren vielleicht sogar von einem Tausch, aber Datenbanken scheinen darunter zu leiden. Jedoch diskutieren viele Diskussionen, die ich in Foren gesehen habe, den Tausch, der von der spezifischen Arbeitslastdiskussion entkontextualisiert wurde.

In der DBA-Welt scheint der Konsens zu sein: "Wenn Sie MySQL (oder wirklich jedes andere DBMS) betreiben, sollten Sie keine I / O in Ihrem Swap-Space sehen. Skalieren der Cachegröße (mit innodb_buffer_pool_size im Fall von MySQL) ist Standard, um sicherzustellen, dass genügend freier Speicher vorhanden ist, so dass kein Swapping benötigt wird.

Aber was passiert, wenn Sie einen Fehler oder eine Fehleinschätzung machen und ein Austausch stattfindet? Wie stark beeinflusst es die Leistung? Dies ist genau das, was ich untersuchen wollte. "

Ich hoffe, Leser finden die folgenden Links passend.

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
2018-03-24 15:13



Willkommen bei Serverfehler! Während dies theoretisch die Frage beantworten könnte, es wäre vorzuziehen um die wesentlichen Teile der Antwort hier einzubeziehen und den Link als Referenz bereitzustellen. - Frederik Nielsen