Cent OS: ¿Cómo apago o reduzco el compromiso excesivo de memoria, y es seguro hacerlo?

20

De vez en cuando "mi" servidor se detiene porque se queda sin memoria y espacio de intercambio. (sigue respondiendo al ping pero nada más que eso, ni siquiera ssh).

Me han dicho que Linux tiene un compromiso excesivo de memoria, que hasta donde yo entiendo es lo mismo que hacen los bancos con el dinero: otorga a los procesos más memoria de la que está realmente disponible, suponiendo que la mayoría de los procesos no usen toda la memoria que piden, en al menos no todos al mismo tiempo.

Suponga que esta es realmente la causa por la que mi sistema se bloquea ocasionalmente, no discutamos aquí si este es el caso (consulte ¿Qué puede causar que TODOS los servicios en un servidor se caigan, y aún así responda al ping? Y cómo averiguarlo ) .

Asi que,

  1. ¿Cómo deshabilito o reduzco drásticamente el exceso de memoria en CentOS? He leído que hay dos configuraciones llamadas vm.overcommit_memory (valores 0, 1 o 2) y vm.overcommit_ratiom pero no tengo idea de dónde tengo que encontrarlas y cambiarlas (algunos archivos de configuración con suerte), ¿qué valores debo probar? y si necesito reiniciar el servidor para que los cambios sean efectivos.

  2. y es seguro ¿Qué efectos secundarios puedo esperar? Cuando busco en Google overcommit_memory, encuentro cosas aterradoras como que la gente dice que su servidor ya no puede arrancar ...

Dado que lo que causa el aumento repentino en el uso de la memoria es mysql debido a las consultas realizadas por php, que a su vez se llama mientras se atienden las solicitudes http, esperaría que solo algunos script php no se completen y, por lo tanto, algunas respuestas de 500 de vez en cuando el servidor está demasiado ocupado, lo cual es un riesgo que puedo tomar (ciertamente mejor que el servidor completo se vuelva inaccesible y tenga que reiniciarlo).

¿O realmente puede hacer que mi servidor no pueda reiniciarse si elijo la configuración incorrecta?

matteo
fuente
1
Deshabilitar el exceso de compromiso no te ayudará cuando realmente te estés quedando sin memoria. Sin embargo, agregar RAM al servidor podría ayudar.
Michael Hampton
2
Desactivar el sobrecompromiso no será la solución final, pero sí ayudará mucho, si en algún momento el servidor se queda sin memoria (que es solo de vez en cuando durante unos segundos), solo tengo algunas solicitudes http rechazadas (o mal servido), en lugar de hacer que mi servidor muera por completo y para siempre (hasta que lo reinicie)
matteo

Respuestas:

30

El exceso de memoria se puede deshabilitar vm.overcommit_memory=2

0 es el modo predeterminado, donde el núcleo determina heurísticamente la asignación calculando la memoria libre en comparación con la solicitud de asignación que se realiza. Y establecerlo en 1 habilita el modo de asistente, donde el núcleo siempre anuncia que tiene suficiente memoria libre para cualquier asignación. La configuración a 2 significa que los procesos solo pueden asignar hasta una cantidad configurable ( overcommit_ratio) de RAM y comenzarán a recibir errores de asignación o mensajes OOM cuando superen esa cantidad.

¿Es seguro hacerlo, no? No he visto ningún caso de uso adecuado en el que la desactivación de la sobrecompromiso de memoria realmente haya ayudado, a menos que esté 100% seguro de la carga de trabajo y la capacidad del hardware. En caso de que esté interesado, instale el kernel-docspaquete y vaya /Documentation/sysctl/vm.txta leer más, o léalo en línea .

Si lo configura vm.overcommit_memory=2, se comprometerá en exceso hasta el porcentaje de RAM física configurada en vm.overcommit_ratio(el valor predeterminado es 50%).

echo 0/1/2 > /proc/sys/vm/overcommit_memory 

Esto no sobrevivirá a un reinicio. Para persistencia, ponga esto en el /etc/sysctl.confarchivo:

vm.overcommit_memory=X

y ejecutar sysctl -p. No es necesario reiniciar.

Soham Chakraborty
fuente
la parte que no respondió es en qué archivo cambio esa configuración de vm.memory_overcommit y especialmente si necesito reiniciar (o qué más) para que tenga efecto
matteo
2
echo 0/1/2> / proc / sys / vm / overcommit_memory Esto no sobrevivirá a un reinicio. Para persistencia, ponga esto en el archivo /etc/sysctl.conf vm.overcommit_memory = X y ejecute sysctl -p. No es necesario reiniciar
Soham Chakraborty
Muchas gracias. Puede agregar esto al cuerpo de la respuesta para que pueda "aceptarlo" formalmente.
matteo
1
Se agregó la nueva parte.
Soham Chakraborty
44
"overcommit_ratio" tiene un efecto importante cuando se usa overcommit_memory = 2: determina el porcentaje de RAM física que se puede asignar. Entonces, si la relación <100, dejará algo de RAM sin asignar, tal vez para caché de disco o similar. ¡La proporción predeterminada es del 50%, por lo que solo usará el 50% de la RAM física si no cambia esto!
David Gardner
6

Declaración totalmente no calificada: deshabilitar la sobrecarga de memoria es definitivamente "más seguro" que habilitarlo.

$ customer lo configuró en unos pocos cientos de servidores web y ayudó mucho con los problemas de estabilidad. Incluso hay un cheque de Nagios llamando al fuego realmente fuerte si alguna vez NO está deshabilitado.

Por otro lado, las personas podrían no considerar "seguro" que sus procesos se queden sin memoria cuando les gustaría comprometerse demasiado con un pequeño ram y nunca lo usarían realmente. (es decir, SAP sería un muy buen ejemplo)

Entonces, has vuelto a ver si mejora las cosas para ti. Como ya lo está investigando para deshacerse de los problemas relacionados, creo que podría ayudarlo.

(Sé que arriesgaré un voto negativo de alguna persona gruñona)

Florian Heigl
fuente
3

Estoy de acuerdo en que deshabilitar el exceso de compromiso es más seguro que habilitarlo en algunas circunstancias. Si el servidor ejecuta solo unos pocos trabajos de memoria grandes (como las simulaciones de circuitos en mi caso), es mucho más seguro negarle a la aplicación la solicitud de memoria por adelantado en lugar de esperar un evento OOM (que seguramente seguirá en breve) Muy a menudo vemos servidores teniendo problemas después de que el asesino de OOM haya hecho su trabajo.

usuario185690
fuente