12 votos

Cómo encontrar lo que es el uso de swap de linux o lo que es en el intercambio?

He virtual de linux (Fedora 17) servidor con 28GB de RAM y 2 gb de swap. Se está ejecutando el servidor de base de datos mysql que está configurado para utilizar la mayoría de las RAM.

Después de algún tiempo de ejecutar el servidor inicia el uso de swap para intercambiar unsued páginas. Que está bien como a mi el swappiness es el valor por defecto 60 y es el comportamiento esperado.

Lo extraño es que el número en la parte superior/meminfo no se corresponde con la información de los procesos. I. e. el servidor de informes de 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 yo uso el script de http://serverfault.com/a/423603/98204 se informa de un número razonable (unos MBs intercambiado por bash es, systemd, etc) y una gran asignación de mysql: (yo no se incluye un montón de 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

Así que si me la salida de secuencia de comandos a la derecha el total de intercambio de uso debe ser 449264K=cca 440MB con mysql usando cca 90% de la permuta.

La pregunta es por qué esto difiere mucho de la parte superior y meminfo números? Es allí cualquier manera de cómo "volcado" de intercambio de info para ver lo que realmente está en que en lugar de sumar el intercambio de los usos de todos los procesos?

Al analizar el problema que se me ocurrió con ideas diferentes, pero todos ellos parece estar equivocado:

  1. La salida de secuencia de comandos no está en KB. Aunque sería de 512 o de 4 kb de unidades no coinciden. En realidad, la relación (1200:440) es de aproximadamente 3:1, que es "extraño" el número.
  2. Hay algunas páginas en el espacio de intercambio que están de alguna manera compartida entre procesos, como se menciona en http://serverfault.com/a/477664/98204 . Si esto es cierto, ¿cómo puedo saber el número real de memoria utilizado como esta? Quiero decir que sería necesario hacer cca 800 MB de diferencia. Y que no suena bien en este escenario.
  3. Hay algunos "viejos" de las páginas en el espacio de intercambio utilizado por los procesos que ya ha terminado. No me importaría que si yo fuera capaz de averiguar de cuánto es este "freeable" de intercambio.
  4. Hay páginas en el espacio de intercambio que se ha cambiado de nuevo a la memoria y en el espacio de intercambio en caso de que no cambie en la memoria RAM y la necesidad de cambiarse de nuevo como se mencionó en http://serverfault.com/a/100636/98204 . Pero el SwapCached el valor es de sólo 24 MB.

Lo extraño es que el swap uso está aumentando lentamente, mientras que la suma de la salida de la secuencia de comandos es aproximadamente la misma. En los últimos 3 días el swap se utiliza el aumento de 1100MB actual 1230MB mientras que la suma mayor de 430MB actual 449MB (cca).

El servidor tiene enoough libre(capaz) de RAM para que yo pudiera desactivar el swap y encenderlo de nuevo.O tal vez podría establecer el swappiness a 0 por lo que el swap obtener utiliza sólo si no hay otra manera. Pero me gustaría resolver el problema o al menos averiguar cuál es la causa de esto.

9voto

rickhg12hs Puntos 280

Fedora 18 y hasta tienen smem en los repositorios. Puede descargar el script de python y instalar desde el código fuente.

Aquí se muestra un ejemplo de salida (algo corta y anónimos) 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 smemcap que se almacenan todos los datos pertinentes a fin de que smem se puede ejecutar en él más tarde.

   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.

7voto

Walter Mundt Puntos 9160

Usted debe revisar esta secuencia de comandos en otra máquina, porque mi sistema muestran un correcto intercambio de uso:

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

Muy cerca de 111280 ~= 120368.

También, busque en esta secuencia de comandos:

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

A partir de este hilo:

http://unix.stackexchange.com/questions/71714/linux-total-swap-used-swap-used-by-processes

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: