¿Incrementar constantemente el tamaño de intercambio en Linux y no se reclama el espacio de intercambio?

10

Tengo una caja de Linux RAM de 8GB en la que se ejecutan 4 servidores tomcat. Uno de ellos está configurado en 3000MB de memoria (configuración jvm -Xms y -Xmx) y otros están configurados en 1500MB. La partición de intercambio también se establece en 8Gigs. Cuando inicio estos servidores, el uso del archivo de intercambio es bajo. Pero durante un período de días y durante ciertos momentos en que uno / todos los servidores están en actividad máxima, el uso de intercambio comienza a aumentar. Aquí hay una salida típica de sar -r.

kbmemfree kbmemused% memused kbbuffers kbcached kbswpfree kbswpused % swpused kbswpcad

48260 8125832 99.41 196440 2761852 7197688 1190912 14.20 316044

75504 8098588 99.08 198032 2399460 7197688 1190912 14.20 316032

Muestra 14.2% de intercambio utilizado actualmente. Lo curioso es que este% NUNCA disminuye . Continúa aumentando y llegando hasta 30-40% . Reiniciamos nuestros servidores semanalmente.

Supongo que el % swpused aumenta durante los períodos de actividad máxima y disminuye durante los períodos de baja actividad ... O al menos permanece constante. Parece que el sistema operativo nunca recupera el espacio de intercambio.

Salida de free: free -m total utilizado buffers compartidos gratuitos en caché Mem: 7982 7937 45 0 32 2088 - / + buffers / caché: 5816 2166 Swap: 8191 1163 7028

Así que hay al menos 2 g de Ram gratis. Entonces, la pregunta es ¿Por qué el espacio de intercambio continúa aumentando y el SO no lo reclama? O cómo depurar esto para descubrir qué está pasando ...

Zenil
fuente

Respuestas:

12

Si la información se cambia al disco y luego se vuelve a leer en la memoria, a menudo se dejará asignada en el área de intercambio hasta que el espacio de intercambio se agote. Eso significa que si la misma información necesita intercambiarse nuevamente más tarde y no ha cambiado, el sistema operativo puede simplemente soltar las páginas de la RAM asignada sin necesidad de escribir nada en el disco para ahorrar tiempo.

El intercambio asignado a cosas que se han leído de nuevo en la memoria se liberará

  1. cuando las páginas relevantes ya no son necesarias (es decir, son liberadas por la aplicación)
  2. cuando se cambian las páginas relevantes (por lo que la copia en el disco ya no está actualizada)
  3. la máquina se queda sin espacio de intercambio, por lo que borra algunas cosas que ya están en la RAM para hacer espacio

Busque /proc/meminfouna línea llamada "SwapCached". Esta entrada cuenta las páginas que se encuentran tanto en RAM como en particiones de intercambio. Por ejemplo, al elegir una pequeña VM al azar, el /proc/meminfoarchivo virtual que muestra una de mis VM:

SwapTotal:        698816 kB
SwapFree:         624520 kB
SwapCached:        17232 kB

indicando que se asignan 74268K de espacio de intercambio, pero que el valor de 17232K de esas páginas también está actualmente asignado a la RAM (por lo que podría ser desasignado del intercambio en cualquier momento si algo más necesita el espacio).

También, sin duda, habrá páginas que se intercambiaron hace años y que nunca más se volvieron a usar. El kernel no volverá a cargar páginas de intercambio solo porque hay algo de RAM libre para volver a leer, ya que esa RAM libre podría usarse mejor para caché o buffers; las páginas escritas para intercambiar generalmente solo se vuelven a leer la próxima vez que se necesitan.

Si desea borrar lo que está en el intercambio, siempre y cuando tenga suficiente libre y / o libre (es decir, libre + caché + buffers (menos aquellas partes de los recuentos de c + b que no se pueden liberar RightThisInstant)), solo gírelo apagado y encendido nuevamente con swapoff -a && swapon -a.

Por supuesto, también podría tener una pérdida de memoria en algún lugar, pero esa no es la única explicación del comportamiento que está viendo.

David Spillett
fuente
Excelente respuesta, gracias. Por lo tanto, mi sistema muestra SwapTotal: 8388600 kB SwapFree: 7197688 kB SwapCached: 595724 kB So Real Swap Free = 7197688 + 595724 = 7793412. Actul Swap Used = 8388600 - 7793412 = 595188 == 581MB. Supongo que 581 MB de uso de archivos de intercambio es razonable para un sistema de 8 GB con 4 aplicaciones en ejecución. Permítanme monitorear esto durante los próximos días y ver si la cifra swapCached sigue aumentando proporcionalmente a% swapUsed.
Zenil
2

Básicamente, no necesita preocuparse por esto. Lo importante es saber cuánto va IO al intercambio (eche un vistazo al comando 'vmstat'). Tener más cosas en el intercambio no cuesta nada. El único costo es poner cosas en el intercambio (página de entrada) o sacarlo (página de salida). Por lo tanto, es perfectamente razonable que el sistema operativo permita que el intercambio crezca.

Guillaume
fuente
1
Es importante saber averiguar por qué el intercambio está creciendo y nunca disminuyendo ... ¿Qué pasa si permitimos que nuestros servidores continúen funcionando durante semanas? ¿El intercambio crecerá más allá del límite y resultará en problemas de memoria? El swapin / swapout parece "razonable". Durante los períodos de actividad máxima hay un alto swapin / swapout (y también aumenta el% swapused). Durante los períodos normales el swapin / swapout es mínimo pero el% swapused no disminuye
Zenil
0

siempre que tenga espacio de intercambio disponible, no es necesario que el sistema operativo libere espacio de intercambio. Se liberará cuando no quede espacio. Pero cuando te encuentras en esta situación definitivamente tienes un problema.

cristiano
fuente
0

No hay forma de saber si esto eventualmente se convertirá en un problema a menos que ejecute un servidor el tiempo suficiente para ver si se convierte en un problema.

Básicamente, el sistema operativo intercambiará cosas que no se están utilizando para mantener algo de memoria libre en todo momento, en caso de que se inicie un nuevo programa. El espacio de intercambio no se liberará hasta que sea necesario, lo que significa que puede utilizar el 100% de espacio de intercambio y no tener problemas de rendimiento. Lo que debe preocuparse es si esto se debe a una pérdida de memoria. No es necesariamente una pérdida de memoria, pero podría serlo.

Java no es propenso a pérdidas de memoria, pero puede ocurrir especialmente con aplicaciones complicadas.

Joshua Nurczyk
fuente