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 ...
Respuestas:
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.
fuente
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.
fuente
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 ?
fuente
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:
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).
fuente