¿Por qué se utiliza Swap cuando queda mucha memoria libre?

35

Tengo un buen servidor web (dedicado) con buenos recursos de memoria:

System information
Server load     2.19 (8 CPUs)   
Memory Used     29.53% (4,804,144 of 16,267,652)    
Swap Used   10.52% (220,612 of 2,097,136)   

Como puede ver, mi servidor está utilizando el intercambio cuando hay mucha memoria libre disponible.

¿Es esto normal o hay algo mal con la configuración o la codificación?

NB
Mi proceso MySQL está utilizando más del 160% de la potencia de la CPU por alguna razón; No sé por qué, pero no tengo más de 70 usuarios simultáneos ...

usuario1179459
fuente
¿Las aplicaciones pueden usar más del 100% de la CPU en Linux? Erm ...
BlueRaja
55
@BlueRaja: Sí, porque en Linux la utilización de la CPU se mide en relación con una sola CPU, no todas las CPU de su sistema. Entonces, en una máquina con 8 CPU, tiene un máximo de 800% de CPU disponible.
Daniel Pryden
¿Qué versión de MySQL estás usando?
RolandoMySQLDBA
@RolandoMySQLDBA versión 5.5
user1179459

Respuestas:

61

Esto es perfectamente normal.

Al inicio del sistema, se inician varios servicios. Estos servicios se inicializan, leen archivos de configuración, crean estructuras de datos, etc. Usan algo de memoria. Muchos de estos servicios nunca volverán a ejecutarse durante todo el tiempo que el sistema esté activo porque no los está utilizando. Algunos de ellos pueden correr en horas, días o semanas. Sin embargo, todos estos datos están en la memoria física.

Por supuesto, el sistema no puede descartar estos datos. No puede probar que literalmente nunca se accederá a él. Uno de esos servicios, por ejemplo, podría ser el que le proporciona acceso remoto a la caja. Es posible que no lo haya usado en una semana, pero si lo usa, será mejor que funcione.

Pero el sistema sabe que le gustaría usar esa memoria física para cosas como un caché de disco o de otras maneras que mejoren el rendimiento. Entonces hace un intercambio oportunista. Cuando no tiene nada mejor que hacer, escribe datos que no se han utilizado en mucho tiempo en el disco, utilizando el espacio de intercambio. Sin embargo, aún mantiene las páginas en la memoria física. Por lo tanto, aún se puede acceder sin tener que intercambiarlos.

Ahora, si el sistema luego necesita esa memoria física para otra cosa, simplemente puede tirar esas páginas porque ya las ha escrito para intercambiar. Esto le da al sistema lo mejor de ambos mundos. Los datos aún se mantienen en la memoria, por lo que se puede acceder sin tener que leerlos desde el disco. Pero si el sistema necesita esa memoria para otro propósito, no tendrá que escribirla primero. Gran victoria por todas partes.

David Schwartz
fuente
En ese caso, ¿puede explicar por qué a veces el espacio de intercambio no se utiliza en absoluto? Mem: 49554484k total, 4087592k usado, 45466892k gratis, 349244k buffers Intercambio: 94204k total, 0k usado, 94204k gratis, 1113644k en caché
ananthan
44
@ananthan: Podría haber muchas razones. Lo más probable es que el sistema nunca estuvo bajo presión de memoria, incluso debido a las escrituras almacenadas en el búfer, por lo que el código de intercambio oportunista puede que nunca se haya activado. También podría ser que alguien pensara que cualquier uso de intercambio era malo y por lo tanto ajustó mal el sistema para no intercambiar de manera oportunista (al reducir el intercambio ).
David Schwartz
6

Esto puede suceder si en algún momento en el pasado necesitabas más memoria de la que tienes RAM física en la máquina. En ese momento, algunos datos se habrán escrito en el espacio de intercambio.

Cuando la memoria posterior se libera, los datos del intercambio no se vuelven a leer automáticamente en la RAM: esto solo ocurre cuando algún proceso necesita realmente los datos del intercambio. Esto es perfectamente normal.

En cuanto a su proceso mysql: todo esto depende del tipo de consultas que ejecute. En teoría, 2 consultas muy complejas probablemente podrían ser suficientes para obtener tal carga, independientemente de su número de usuarios. Puede habilitar el registro lento de consultas para obtener más información sobre qué consultas requieren mucha carga.

brain99
fuente
No, el uso de intercambio no es una marca de límite superior. Cuando las páginas intercambiadas se asignan de nuevo, las páginas del disco se marcan como no utilizadas (pero aún pueden contener datos).
symcbean
Solo mencioné un escenario en el que puedes usar el intercambio, pero esto no siempre es sintomático de no tener suficiente memoria física, como también explica David Schwartz anteriormente
brain99
3

También puede cambiar este comportamiento sysctl -w vm.swappiness=10, lo que reducirá en gran medida el uso de intercambio hasta que sea realmente necesario.

En cuanto a MySQL, ¿ha realizado al menos una prueba de configuración de línea de base utilizando el script tuning-primer.sh ?

Daemon of Chaos
fuente
1
Esto aumentará la tendencia a recuperar caché / búferes. Desafortunadamente, de la pregunta original no queda claro si la cifra del 29,53% incluye buffers / caché; si no es así, hacer el cambio que sugieres tendrá un impacto negativo en el rendimiento. Si este dbms usa innodb ampliamente, entonces probablemente esté mal configurado (aunque una sola caja de 8 núcleos de 16 gb para usar como servidor web es una MALA elección para comenzar)
symcbean
¿Por qué dices que es una mala elección para el servidor web? No utilizo innodb tanto yo prefiero myisam porque mi lecturas son 70% y escribe sólo el 30% ....
user1179459
1

Este es probablemente, como explicó David, un comportamiento normal del kernel de Linux, pero también puede ser una ocurrencia del problema de "locura de intercambio" de MySQL . En su caso (8 CPU, 16 GB de RAM en total, 5 GB utilizados), para que eso suceda, su computadora debe ser un sistema NUMA con 4 nodos (sockets) y 4 GB de RAM por nodo y un grupo de búferes MySQL InnoDB de 4 GB.

En resumen (debe leer el enlace de arriba para obtener detalles completos), esto es lo que sucede:

  1. Cuando se inicia el sistema, los procesos se distribuyen en todos los nodos NUMA utilizando parte de su memoria.
  2. Cuando se inicia MySQL, asigna 4 GB para el grupo de búferes InnoDB, llena la RAM de un nodo NUMA y usa algo de RAM en otros nodos.
  3. Luego, el kernel de Linux, que no puede mover la RAM asignada de un nodo NUMA a otro, cree que es una buena idea intercambiar páginas del nodo muerto de hambre (o necesita intercambiar páginas porque las páginas debían intercambiarse).

Para evitar eso, cambie la asignación de memoria para MySQL para asignar RAM en todos los núcleos (consulte el enlace anterior para obtener más detalles).

jfg956
fuente