Wie finde ich heraus, was Linux Swap verwendet oder was sich im Swap befindet?

12

Ich habe einen virtuellen Linux-Server (Fedora 17) mit 28 GB RAM und 2 GB Swap. Auf dem Server wird eine MySQL-Datenbank ausgeführt, die so eingerichtet ist, dass sie den größten Teil des Arbeitsspeichers verwendet.

Nach einiger Zeit beginnt der Server mit dem Auslagern von nicht verwendeten Seiten. Das ist in Ordnung, da meine Swap-Fähigkeit standardmäßig 60 ist und es das erwartete Verhalten ist.

Das Seltsame ist, dass die Nummer in top / meminfo nicht mit Informationen aus Prozessen übereinstimmt. Dh der Server meldet diese Nummern:

/proc/meminfo:
SwapCached:        24588 kB
SwapTotal:       2097148 kB
SwapFree:         865912 kB

top:
Mem:  28189800k total, 27583776k used,   606024k free,   163452k buffers
Swap:  2097148k total,  1231512k used,   865636k free,  6554356k cached

Wenn ich das Skript von /server//a/423603/98204 verwende , werden angemessene Zahlen (wenige MB, die durch Bashes, Systemd usw. ausgetauscht wurden) und eine große Zuweisung von MySQL gemeldet (ich habe viele Ausgabezeilen ausgelassen) ):

892        [2442] qmgr -l -t fifo -u
896        [2412] /usr/libexec/postfix/master
904        [28382] mysql -u root
976        [27559] -bash
984        [27637] -bash
992        [27931] SCREEN
1000       [27932] /bin/bash
1192       [27558] sshd: admin@pts/0
1196       [27556] sshd: admin [priv]
1244       [1] /usr/lib/systemd/systemd
9444       [26626] /usr/bin/perl /bin/innotop
413852     [31039] /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/data/mysql/err --open-files-limit=8192 --pid-file=/data/mysql/pid --socket=/data/mysql/mysql.sock --port=3306
449264   Total Swap Used

Wenn ich also die Skriptausgabe richtig mache, sollte die gesamte Auslagerungsnutzung 449264K = ca. betragen. 440MB mit MySQL mit ca. 90% des Swaps.

Die Frage ist, warum dies so sehr von den Top- und Meminfo-Zahlen abweicht. Gibt es eine Möglichkeit, Swap-Informationen zu "sichern", um zu sehen, was tatsächlich darin enthalten ist, anstatt die Swap-Verwendungen aller Prozesse zu summieren?

Bei der Analyse des Problems bin ich auf verschiedene Ideen gestoßen, aber sie scheinen alle falsch zu sein:

  1. Die Skriptausgabe erfolgt nicht in KB. Selbst wenn es in 512 oder 4KB Einheiten wäre, passt es nicht zusammen. Tatsächlich ist das Verhältnis (1200: 440) ungefähr 3: 1, was eine "seltsame" Zahl ist.
  2. Wie in /server//a/477664/98204 erwähnt, gibt es einige Seiten im Swap, die auf irgendeine Weise von Prozessen gemeinsam genutzt werden . Wenn dies zutrifft, wie kann ich dann die tatsächlich verwendete Speichergröße ermitteln? Ich meine, es müsste ca. 800 MB Unterschied machen. Und das klingt in diesem Szenario nicht richtig.
  3. Es gibt einige "alte" Seiten im Swap, die von bereits abgeschlossenen Prozessen verwendet werden. Es würde mir nichts ausmachen, wenn ich herausfinden könnte, wie viel dieser "frei verfügbare" Tausch kostet.
  4. Es gibt Seiten im Auslagerungsmodus, die zurück in den Arbeitsspeicher ausgelagert wurden und nur für den Fall ausgelagert werden, dass sie sich nicht im Arbeitsspeicher geändert haben und erneut ausgelagert werden müssen (siehe /server//a/100636/98204) . Der SwapCached-Wert beträgt jedoch nur 24 MB.

Das Seltsame ist, dass die Swap-Nutzung langsam zunimmt, während die Summenausgabe des Skripts in etwa gleich ist. In den letzten 3 Tagen hat sich der Swap von 1100 MB auf aktuell 1230 MB erhöht, während sich die Summe von 430 MB auf aktuell 449 MB (ca.) erhöhte.

Der Server verfügt über genügend freien (verfügbaren) RAM, sodass ich den Swap einfach ausschalten und wieder einschalten kann. Oder ich könnte wahrscheinlich swappiness auf 0 setzen, damit der Swap nur verwendet wird, wenn das nicht anders ist. Aber ich möchte das Problem lösen oder zumindest herausfinden, woran das liegt.

Radek Hladík
quelle
Wie du sagst, solltest du nur vm.swappiness = 0 (oder 1) und swapoff && swapon
HTTP500
Aber das würde das Problem nicht lösen. Ich gehe davon aus, dass der Swap wieder zunimmt, wenn ich die Swap-Einstellungen auf 60 zurücksetze, oder dass er überhaupt nicht verwendet wird, wenn ich ihn bei 0 oder 1 halte (es sei denn, der Server hat nicht genügend Speicher)
Radek Hladík,
Wenn es sich um einen DB-Server handelt, sollte der Swap nur im Notfall verwendet werden, sodass Sie ihn immer auf 0 (oder 1) setzen sollten.
HTTP500
Das stimmt und das ist wahrscheinlich, was ich tun werde, wenn ich die Ursache für dieses Problem nicht finde ... Andererseits gibt es viele kleine DBs auf dem Server, die sehr sporadisch verwendet werden, und ich mochte die Idee, dass sie sind Das System tauscht sie aus, wenn sie nicht verwendet werden. Allerdings wird MySQL das wohl alleine schaffen.
Radek Hladík,
Mysql verwaltet seine eigenen Caches ziemlich gut, aber das basiert auf Annahmen darüber, was sich tatsächlich im Speicher befindet und was nicht. Wenn Sie versuchen, es mithilfe des Swap-Speichers zu erraten, beeinträchtigen Sie lediglich die Fähigkeit von mysql, zu entscheiden, was zwischengespeichert werden muss und was nicht. Swap ausschalten. Wenn Sie Swap drücken, ist dies ein Abstimmungsfehler. Passen Sie die Cachegrößen so an, dass kein Auslagerungsvorgang stattfindet. Zu diesem Zweck möchten Sie jedoch den gesamten verfügbaren physischen Speicher nutzen.
mc0e

Antworten:

9

Fedora 18 und höher haben smemin den Repos. Sie können das Python-Skript herunterladen und von der Quelle installieren .

Hier ist eine Beispielausgabe (etwas abgeschnitten und anonymisiert) von meinem Computer:

# smem -s swap -t -k -n
  PID User     Command                         Swap      USS      PSS      RSS 
20917 1001     bash                               0     1.1M     1.1M     1.9M 
28329 0        python /bin/smem -s swap -t        0     6.3M     6.5M     7.4M 
 2719 1001     gnome-pty-helper               16.0K    72.0K    73.0K   516.0K 
  619 0        @sbin/mdadm --monitor --sca    28.0K    72.0K    73.0K   248.0K 

[big snip]

32079 42       gnome-shell --mode=gdm         41.9M     1.9M     2.0M     5.0M 
32403 1001     /opt/google/chrome/chrome -    43.1M   118.5M   119.4M   132.3M 
 4844 1002     /opt/google/chrome/chrome      48.1M    38.1M    41.9M    51.9M 
 5411 1002     /opt/google/chrome/chrome -    54.6M    33.4M    33.5M    36.8M 
 5624 1002     /opt/google/chrome/chrome -    72.4M    54.9M    55.5M    65.7M 
24328 1002     /opt/Adobe/Reader9/Reader/i    77.5M     1.9M     2.0M     5.2M 
 4921 1002     /opt/google/chrome/chrome -   147.2M   258.4M   259.4M   272.0M 
-------------------------------------------------------------------------------
  214 14                                       1.1G     1.1G     1.2G     1.7G 

Die Quelle bietet außerdem die Möglichkeit smemcap, alle relevanten Daten zu speichern, damit smem später darauf ausgeführt werden kann.

   To  capture  memory statistics on resource-constrained systems, the the
   smem source includes a utility named  smemcap.   smemcap  captures  all
   /proc entries required by smem and outputs them as an uncompressed .tar
   file to STDOUT.  smem can analyze the output using the --source option.
   smemcap is small and does not require Python.
rickhg12hs
quelle
1
Smem von F17 Repo hat nicht funktioniert (zeigte eine leere Liste), aber die von der Quelle hat funktioniert und zeigt fast die gleichen Zahlen wie die anderen :-) mysql 358.1M von insgesamt 392.6M, während oben 1191224k verwendet zeigt
Radek Hladík
4

Sie sollten dieses Skript auf einem anderen Computer überprüfen, da auf meinem System die korrekte Auslagerungsnutzung angezeigt wird:

# Your_script.sh
111280   Total Swap Used
# free
Swap:     33551716     120368   33431348

Ganz in der Nähe 111280 ~ = 120368.

Schauen Sie sich auch dieses Skript an:

für proc in / proc / *; do cat $ proc / smaps 2> / dev / null | awk '/ Swap / {swap + = $ 2} END {print swap "\ t' readlink $proc/exe'"}'; fertig | sort -n | awk '{total + = $ 1} / [0-9] /; END {print total "\ tTotal"}'

Aus diesem Thread:

/unix/71714/linux-total-swap-used-swap-used-by-processes

Strand
quelle
Das erwähnte Skript gibt dieselben Ergebnisse zurück ... 364920 / usr / libexec / mysqld 400372 Gesamt
Radek Hladík
Als ich das Skript auf einem anderen Server mit sehr geringer Swap-Auslastung (50 MB) ausprobierte, wurden insgesamt ca. 72 MB gemeldet :-) Ich muss es später auf einem Nichtproduktionsserver simulieren ...
Radek Hladík