Ho un server Linux virtuale (Fedora 17) con 28 GB di RAM e 2 GB di swap. Il server esegue un DB MySQL impostato per utilizzare la maggior parte della RAM.
Dopo un po 'di tempo in esecuzione, il server inizia a utilizzare lo scambio per scambiare pagine senza coda. Va bene dato che la mia swappiness è di default 60 ed è il comportamento previsto.
La cosa strana è che il numero in alto / meminfo non corrisponde alle informazioni dai processi. Cioè il server sta segnalando questi numeri:
/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
Se uso lo script da /server//a/423603/98204 riporta numeri ragionevoli (pochi MB scambiati da bash'es, systemd, ecc.) E una grande allocazione da MySQL (ho omesso molte linee di output ):
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
Quindi, se ottengo l'output dello script corretto, l'utilizzo totale dello swap dovrebbe essere 449264K = ca. 440 MB con mysql usando ca. 90% dello swap.
La domanda è: perché questo differisce così tanto dai numeri top e meminfo? Esiste un modo per "scaricare" le informazioni di scambio per vedere cosa contiene effettivamente invece di sommare gli utilizzi di scambio da tutti i processi?
Quando ho analizzato il problema, mi sono venute in mente idee diverse, ma tutte sembrano sbagliate:
- L'output dello script non è in KB. Anche se sarebbe in unità da 512 o 4KB non corrisponderebbe. In realtà il rapporto (1200: 440) è di circa 3: 1 che è un numero "strano".
- Ci sono alcune pagine in scambio che sono in qualche modo condivise tra i processi come menzionato in /server//a/477664/98204 . Se questo è vero, come posso trovare il numero effettivo di memoria utilizzata in questo modo? Voglio dire che dovrebbe fare la differenza di cca 800 MB. E questo non suona proprio in questo scenario.
- Esistono alcune "vecchie" pagine in swap utilizzate da processi già terminati. Non mi dispiacerebbe che se fossi in grado di scoprire quanto è questo scambio "libero".
- Ci sono pagine di swap che sono state ricambiate in memoria e sono in swap nel caso in cui non siano cambiate nella RAM e debbano essere scambiate di nuovo come menzionato in /server//a/100636/98204 . Ma il valore di SwapCached è solo 24 MB.
La cosa strana è che l'utilizzo dello swap sta lentamente aumentando mentre l'output della somma dallo script è approssimativamente lo stesso. Negli ultimi 3 giorni lo swap utilizzato è aumentato da 1100 MB agli attuali 1230 MB, mentre la somma è aumentata da 430 MB agli attuali 449 MB (ca.).
Il server ha abbastanza RAM libera (in grado) in modo da poter semplicemente disattivare lo scambio e riaccenderlo. Oppure potrei probabilmente impostare lo swappiness su 0 in modo che lo swap venga utilizzato solo se non è diversamente. Ma vorrei risolvere il problema o almeno scoprire qual è la causa di questo.