Eu tenho um servidor linux virtual (Fedora 17) com 28 GB de RAM e 2 GB de swap. O servidor está executando um banco de dados MySQL configurado para usar a maior parte da RAM.
Depois de algum tempo em execução, o servidor começa a usar swap para trocar páginas não usadas. Isso é bom, pois meu swappiness está no padrão 60 e é o comportamento esperado.
O estranho é que o número no topo / meminfo não corresponde às informações dos processos. Ou seja, o servidor está relatando esses números:
/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 eu usar o script de /server//a/423603/98204, ele reportará números razoáveis (poucos MBs trocados por bash'es, systemd etc.) e uma grande alocação do MySQL (omiti muitas linhas de saída ):
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
Portanto, se eu obtiver a saída do script corretamente, o uso total da troca deve ser 449264K = ca. 440MB com mysql usando ca. 90% do swap.
A questão é por que isso difere tanto dos números superiores e das meminfo? Existe alguma maneira de "despejar" as informações de troca para ver o que realmente está em vez de somar os usos de troca de todos os processos?
Ao analisar o problema, tive idéias diferentes, mas todas parecem estar erradas:
- A saída do script não está em KB. Mesmo se estivesse em unidades de 512 ou 4KB, não corresponderá. Na verdade, a proporção (1200: 440) é de cerca de 3: 1, que é o número "estranho".
- Existem algumas páginas no swap que são de alguma forma compartilhadas entre processos, conforme mencionado em /server//a/477664/98204 . Se isso for verdade, como posso encontrar o número real de memória usado assim? Quero dizer, precisaria fazer cca 800MB de diferença. E isso não parece certo neste cenário.
- Existem algumas páginas "antigas" em troca usadas por processos que já foram concluídos. Eu não me importaria se fosse capaz de descobrir quanto é essa troca "liberável".
- Existem páginas no swap que foram trocadas de volta à memória e estão no swap apenas no caso de não terem mudado na RAM e precisarem ser trocadas novamente, conforme mencionado em /server//a/100636/98204 . Mas o valor SwapCached é de apenas 24 MB.
O estranho é que o uso da troca está aumentando lentamente, enquanto a saída da soma do script é aproximadamente a mesma. Nos últimos 3 dias, a troca usada aumentou de 1100MB para 1230MB atuais, enquanto a soma aumentou de 430MB para 449MB atuais (ca.).
O servidor tem RAM livre (capaz) suficiente para que eu pudesse desligar e trocar a troca. Ou eu provavelmente poderia definir o swappiness como 0, para que o swap fosse usado apenas se não houvesse outra maneira. Gostaria de resolver o problema ou, pelo menos, descobrir qual é a causa disso.