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:
- 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.
- 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.
- 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.
- 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.