Tengo un servidor virtual Linux (Fedora 17) con 28 GB de RAM y 2 GB de intercambio. El servidor ejecuta una base de datos MySQL que está configurada para usar la mayor parte de la RAM.
Después de un tiempo de ejecución, el servidor comienza a usar el intercambio para intercambiar páginas no publicadas. Eso está bien ya que mi intercambio es por defecto 60 y es el comportamiento esperado.
Lo extraño es que el número en top / meminfo no se corresponde con la información de los procesos. Es decir, el servidor informa estos 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
Si uso el script de /server//a/423603/98204 , informa números razonables (pocos MB intercambiados por bash'es, systemd, etc.) y una gran asignación de MySQL (omití muchas líneas de salida ):
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
Entonces, si obtengo el resultado correcto del script, el uso de intercambio total debería ser 449264K = ca. 440MB con mysql usando ca. 90% del canje.
La pregunta es ¿por qué esto difiere tanto de los números superiores y meminfo? ¿Hay alguna forma de "volcar" la información de intercambio para ver qué contiene realmente en lugar de sumar los usos de intercambio de todos los procesos?
Al analizar el problema, se me ocurrieron diferentes ideas, pero todas parecen estar equivocadas:
- La salida del script no está en KB. Incluso si estuviera en unidades de 512 o 4KB, no coincidirá. En realidad, la proporción (1200: 440) es aproximadamente 3: 1, que es un número "extraño".
- Hay algunas páginas en el intercambio que de alguna manera se comparten entre procesos como se menciona en /server//a/477664/98204 . Si esto es cierto, ¿cómo puedo encontrar la cantidad real de memoria utilizada de esta manera? Quiero decir que necesitaría hacer una diferencia de 800 MB cca. Y eso no suena bien en este escenario.
- Hay algunas páginas "antiguas" en el intercambio utilizadas por procesos que ya han finalizado. No me importaría si pudiera averiguar cuánto es este intercambio "liberable".
- Hay páginas en intercambio que se han cambiado nuevamente a la memoria y están en intercambio en caso de que no cambien en la RAM y necesiten cambiarse nuevamente como se menciona en /server//a/100636/98204 . Pero el valor de SwapCached es de solo 24 MB.
Lo extraño es que el uso de intercambio aumenta lentamente mientras que la salida de la suma del script es aproximadamente la misma. En los últimos 3 días, el intercambio utilizado aumentó de 1100 MB a 1230 MB actuales, mientras que la suma aumentó de 430 MB a 449 MB actuales (ca.).
El servidor tiene suficiente RAM (capaz) libre, así que podría apagar el intercambio y volver a encenderlo. O probablemente podría establecer swappiness en 0 para que el swap se use solo si no es de otra manera. Pero me gustaría resolver el problema o al menos averiguar cuál es la causa de esto.
Respuestas:
Fedora 18 y superior tienen
smem
en los repositorios. Puede descargar el script de Python e instalarlo desde la fuente .Aquí hay una salida de muestra (algo cortada y anónima) de mi máquina:
La fuente también proporciona
smemcap
que almacenará todos los datos relevantes para que se pueda ejecutar smem más adelante.fuente
Debe verificar este script en otra máquina, porque mi sistema muestra el uso correcto de intercambio:
Muy cerca 111280 ~ = 120368.
Además, mira este script:
De este hilo:
/unix/71714/linux-total-swap-used-swap-used-by-processes
fuente