¿Cómo encontrar qué está usando el intercambio de Linux o qué hay en el intercambio?

12

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:

  1. 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".
  2. 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.
  3. 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".
  4. 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.

Radek Hladík
fuente
Como usted dice, debería configurar vm.swappiness = 0 (o 1) e intercambiar && swapon
HTTP500
Pero eso no resolvería el problema. Supongo que el intercambio comenzaría a aumentar nuevamente si configuro los swappines nuevamente a 60 o no se usaría si lo mantengo en 0 o 1 (a menos que el servidor se quede sin memoria)
Radek Hladík
Si se trata de un servidor de base de datos, solo debe usar el intercambio en una emergencia, por lo que siempre debe establecerlo en 0 (o 1).
HTTP500
Eso es cierto y eso es probablemente lo que voy a hacer si no encuentro la causa de este problema ... Por otro lado, hay muchas DB pequeñas en el servidor que se usan de forma muy esporádica y me gustó la idea de que sean intercambiados por el sistema cuando no están en uso ... Sin embargo, supongo que MySQL podrá manejarlo por sí solo ...
Radek Hladík
Mysql hace un trabajo bastante bueno al administrar sus propios cachés, pero eso se basa en suposiciones sobre lo que de hecho está en la memoria y lo que no. Si intentas adivinarlo dos veces usando memoria de intercambio, solo estás perjudicando la capacidad de mysql para decidir qué se debe almacenar en caché y qué no. Desactiva el intercambio. Si presiona cambiar, es un error de ajuste. Ajuste el tamaño de su caché para que el intercambio nunca ocurra, pero para eso, desea utilizar toda la memoria física disponible.
mc0e

Respuestas:

9

Fedora 18 y superior tienen smemen 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:

# 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 

La fuente también proporciona smemcapque almacenará todos los datos relevantes para que se pueda ejecutar smem más adelante.

   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
fuente
1
Smem del repositorio F17 no funcionó (mostró una lista vacía) pero el de la fuente funcionó y muestra casi los mismos números que los demás :-) mysql 358.1M de un total de 392.6M, mientras que la parte superior muestra 1191224k utilizado
Radek Hladík
4

Debe verificar este script en otra máquina, porque mi sistema muestra el uso correcto de intercambio:

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

Muy cerca 111280 ~ = 120368.

Además, mira este script:

para proc en / proc / *; do cat $ proc / smaps 2> / dev / null | awk '/ Swap / {swap + = $ 2} END {print swap "\ t' readlink $proc/exe'"}'; hecho | ordenar -n | awk '{total + = $ 1} / [0-9] /; END {print total "\ tTotal"}'

De este hilo:

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

hebra
fuente
El script mencionado devuelve los mismos resultados ... 364920 / usr / libexec / mysqld 400372 Total
Radek Hladík
Cuando probé el script en otro servidor con un uso de intercambio muy bajo (50 MB), reportó aproximadamente 72 MB en total :-) Necesitaré simularlo en algún servidor que no sea de producción más tarde ...
Radek Hladík