Warum wird Swap verwendet, wenn genügend freier Speicher verfügbar ist?

35

Ich habe einen ziemlich guten (dedizierten) Webserver mit guten Speicherressourcen:

System information
Server load     2.19 (8 CPUs)   
Memory Used     29.53% (4,804,144 of 16,267,652)    
Swap Used   10.52% (220,612 of 2,097,136)   

Wie Sie sehen, verwendet mein Server Swap, wenn genügend freier Speicher verfügbar ist.

Ist das normal oder stimmt etwas mit der Konfiguration oder der Codierung nicht?

NB
Mein MySQL-Prozess verbraucht aus irgendeinem Grund über 160% der CPU-Leistung. Ich weiß nicht warum, aber ich habe nicht mehr als 70 gleichzeitige Benutzer ...

user1179459
quelle
Anwendungen können über 100% der CPU unter Linux nutzen? Ähm ...
BlueRaja
5
@BlueRaja: Ja, da in Linux die CPU-Auslastung relativ zu einer einzelnen CPU gemessen wird, nicht zu allen CPUs in Ihrem System. In einer Maschine mit 8 CPUs steht Ihnen also maximal 800% CPU zur Verfügung.
Daniel Pryden
Welche Version von MySQL benutzt du ???
RolandoMySQLDBA
@RolandoMySQLDBA Version 5.5
user1179459

Antworten:

61

Das ist völlig normal.

Beim Systemstart wird eine Reihe von Diensten gestartet. Diese Dienste initialisieren sich selbst, lesen Konfigurationsdateien ein, erstellen Datenstrukturen und so weiter. Sie verbrauchen etwas Gedächtnis. Viele dieser Dienste werden während der gesamten Systemlaufzeit nicht mehr ausgeführt, da Sie sie nicht verwenden. Einige von ihnen können in Stunden, Tagen oder Wochen ausgeführt werden. All diese Daten befinden sich jedoch im physischen Speicher.

Natürlich kann das System diese Daten nicht wegwerfen. Es kann nicht nachgewiesen werden, dass buchstäblich nie darauf zugegriffen werden kann. Einer dieser Dienste kann beispielsweise der sein, der Ihnen den Fernzugriff auf die Box ermöglicht. Sie haben es vielleicht seit einer Woche nicht mehr benutzt, aber wenn Sie es benutzen, hat es besser funktioniert.

Das System weiß jedoch, dass es diesen physischen Speicher möglicherweise für Dinge wie einen Festplatten-Cache oder auf andere Weise verwenden möchte, die die Leistung verbessern. Es wird also opportunistisch getauscht. Wenn nichts Besseres zu tun ist, werden Daten, die lange nicht mehr verwendet wurden, mit Swap Space auf die Festplatte geschrieben. Die Seiten bleiben jedoch im physischen Speicher. Sie sind also weiterhin verfügbar, ohne dass Sie sie austauschen müssen.

Wenn das System später diesen physischen Speicher für etwas anderes benötigt, kann es diese Seiten einfach wegwerfen, da es sie bereits zum Auslagern geschrieben hat. Dies gibt dem System das Beste aus beiden Welten. Die Daten bleiben im Speicher erhalten, sodass auf sie zugegriffen werden kann, ohne dass sie von der Festplatte gelesen werden müssen. Wenn das System diesen Speicher jedoch für einen anderen Zweck benötigt, muss er nicht zuerst ausgeschrieben werden. Rundum großer Gewinn.

David Schwartz
quelle
In diesem Fall erklären Sie bitte, warum manchmal der Swap-Bereich überhaupt nicht verwendet wird. Mem: 49554484k gesamt, 4087592k verwendet, 45466892k frei, 349244k Puffer Swap: 94204k gesamt, 0k gebraucht, 94204k frei, 1113644k zwischengespeichert
ananthan
4
@ananthan: Es kann viele Gründe geben. Am wahrscheinlichsten ist, dass das System selbst aufgrund von gepufferten Schreibvorgängen nie unter Speicherdruck stand, sodass der opportunistische Auslagerungscode möglicherweise nie ausgelöst wurde. Es könnte auch sein, dass jemand eine schlechte Swap-Nutzung vermutet und das System so falsch eingestellt hat, dass es nicht opportunistisch tauscht (durch Reduzierung der Swap- Fähigkeit ).
David Schwartz
6

Dies kann vorkommen, wenn Sie in der Vergangenheit mehr Arbeitsspeicher als physischen Arbeitsspeicher auf dem Computer benötigt haben. Zu diesem Zeitpunkt wurden einige Daten in den Swap Space geschrieben.

Wenn später Speicher freigegeben wird, werden Daten aus dem Swap nicht automatisch in den RAM zurückgelesen. Dies geschieht nur, wenn die Daten im Swap tatsächlich von einem bestimmten Prozess benötigt werden. Das ist völlig normal.

Wie für Ihren Mysql-Prozess: Dies hängt alles von der Art der Abfragen ab, die Sie ausführen. Theoretisch könnten 2 sehr komplexe Abfragen ausreichen, um eine solche Last zu erhalten, unabhängig von der Anzahl Ihrer Benutzer. Sie können das Protokoll für langsame Abfragen aktivieren, um einen besseren Einblick in die lastintensiven Abfragen zu erhalten.

brain99
quelle
No-Swap-Nutzung ist keine High-Water-Marke. Wenn ausgelagerte Seiten wieder zugeordnet werden, werden die Festplattenseiten als nicht verwendet markiert (enthalten jedoch möglicherweise noch Daten).
Symcbean
Ich erwähnte nur ein Szenario, in dem Sie Swap-Nutzung haben können, aber dies ist in der Tat nicht immer symptomatisch für nicht genügend physisches Gedächtnis - wie auch von David Schwartz oben erklärt
brain99
3

Sie können dieses Verhalten auch ändern, indem Sie sysctl -w vm.swappiness=10den Einsatz von Swap so lange reduzieren, bis er tatsächlich benötigt wird.

Haben Sie für MySQL mindestens einen Basiskonfigurationstest mit dem Skript tuning-primer.sh durchgeführt ?

Dämon des Chaos
quelle
1
Dies erhöht die Tendenz, dass Cache / Puffer zurückgefordert werden. Leider geht aus der ursprünglichen Frage nicht hervor, ob die Zahl von 29,53% Puffer / Cache enthält. Andernfalls wirkt sich die Änderung, die Sie vorschlagen, nachteilig auf die Leistung aus. Wenn dieses dbms Innodb ausgiebig benutzt, dann ist es wahrscheinlich schlecht konfiguriert (obwohl eine einzelne 8-Kern-16-GB-Box zur Verwendung als Webserver eine schlechte Entscheidung ist)
symcbean
warum sagst du seine schlechte Wahl für Webserver? Ich benutze nicht viel Innodb Ich bevorzuge immer noch Myisam, weil meine Lesungen 70% und schreibt nur 30% ...
User1179459
1

Dies ist wahrscheinlich, wie David erklärte, ein normales Verhalten des Linux-Kernels, kann aber auch ein Problem mit dem MySQL-Tausch-Wahnsinn sein . In Ihrem Fall (8 CPU, 16 GB RAM insgesamt, 5 GB verwendet) sollte Ihr Computer ein NUMA-System mit 4 Knoten (Sockets) und 4 GB RAM pro Knoten und einem MySQL InnoDB-Pufferpool von 4 sein GB.

Kurz gesagt (Sie sollten den Link oben lesen, um die vollständigen Details zu erfahren), ist dies der Fall:

  1. Wenn Ihr System gestartet wird, werden Prozesse auf alle NUMA-Knoten verteilt, wobei ein Teil ihres Speichers verwendet wird.
  2. Beim Start von MySQL werden 4 GB für den InnoDB-Pufferpool reserviert, der RAM eines NUMA-Knotens wird gefüllt und auf anderen Knoten wird RAM verwendet.
  3. Der Linux-Kernel, der den zugewiesenen Arbeitsspeicher nicht von einem NUMA-Knoten auf einen anderen verschieben kann, hält es für sinnvoll, Seiten vom ausgehungerten Knoten auszutauschen (oder Seiten auszutauschen, weil Seiten eingelagert werden mussten).

Um dies zu vermeiden, ändern Sie die Speicherzuordnung für MySQL, um allen Kernen RAM zuzuweisen (weitere Informationen finden Sie unter dem obigen Link).

jfg956
quelle