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

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

Tengo un servidor web (dedicado) bastante bueno 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 utiliza swap cuando hay mucha memoria libre disponible.

¿Es esto normal o hay algún problema con la configuración o la codificación?

NB:
Mi proceso MySQL utiliza más del 160% de la potencia de la CPU por algún motivo; No sé por qué, pero no tengo más de 70 usuarios simultáneos…

Respuesta1

Esto es perfectamente normal.

Al iniciar el sistema, se inician una serie de servicios. Estos servicios se inicializan solos, 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 ejecutarse en horas, días o semanas. Sin embargo, todos estos datos están en la memoria física.

Por supuesto, el sistema no puede desechar estos datos. No puede probar que, literalmente, nunca se accederá a él. Uno de esos servicios, por ejemplo, podría ser el que le proporcione acceso remoto a la caja. Puede que no lo hayas usado en una semana, pero si lo usas, 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. Por eso hace intercambios oportunistas. Cuando no tiene nada mejor que hacer, escribe en el disco datos que no se han utilizado durante mucho tiempo, utilizando el espacio de intercambio. Sin embargo, todavía mantiene las páginas en la memoria física. Por lo tanto, aún se puede acceder a ellos sin tener que cambiarlos.

Ahora, si el sistema luego necesita esa memoria física para otra cosa, simplemente puede desechar esas páginas porque ya las ha escrito para intercambiar. Esto le da al sistema lo mejor de ambos mundos. Los datos todavía se guardan en la memoria, por lo que se puede acceder a ellos 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 todos lados.

Respuesta2

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

Cuando más tarde se libera la memoria, los datos del intercambio no se vuelven a leer automáticamente en la RAM: esto solo sucede cuando algún proceso realmente necesita 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 de consultas lentas para obtener más información sobre qué consultas requieren una carga intensiva.

Respuesta3

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

En cuanto a MySQL, ¿ha realizado al menos una prueba de configuración básica utilizando eltuning-primer.sh¿guion?

Respuesta4

Probablemente, como explicó David, esto sea un comportamiento normal del kernel de Linux, pero también puede deberse a laProblema de “locura de intercambio” de MySQL. En su caso (8 CPU, 16 GB de RAM en total, 5 GB usados), 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 buffer 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 su 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úfer de InnoDB, llenando la RAM de un nodo NUMA y usando 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, piensa que es una buena idea intercambiar páginas del nodo hambriento (o necesita intercambiar páginas porque es necesario intercambiar páginas).

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

información relacionada