¿Cómo evito que Linux se congele cuando no tengo memoria?

25

Hoy (accidentalmente) ejecuté algún programa en mi caja de Linux que rápidamente usó mucha memoria. Mi sistema se congeló, dejó de responder y, por lo tanto, no pude matar al delincuente.

¿Cómo puedo evitar esto en el futuro? ¿No puede al menos mantener un núcleo receptivo o algo funcionando?

johv
fuente
Duplicado del sistema que se cuelga cuando se queda sin memoria , y es un error
Dan Dascalescu

Respuestas:

15

Apuesto a que el sistema en realidad no se "congeló" (en el sentido de que el núcleo se colgó), sino que simplemente no respondió. Lo más probable es que se intercambiara muy duro, lo que provocó que el rendimiento interactivo y el rendimiento del sistema cayeran como una piedra.

Usted podría desactivar el intercambio, sino que simplemente cambia el problema del bajo rendimiento de los procesos de OOM-muerto (y toda la diversión que las causas), junto con una disminución del rendimiento debido a la caché de disco menos disponibles.

Alternativamente, puede usar los límites de recursos por proceso (comúnmente conocidos como rlimity / o ulimit) para eliminar la posibilidad de que un solo proceso tome una cantidad ridícula de memoria y cause un intercambio, pero eso simplemente lo empuja a un territorio entretenido con procesos que mueren en momentos incómodos porque querían un poco más de memoria de la que el sistema estaba dispuesto a darles.

Si sabía que iba a hacer algo que probablemente causaría un uso masivo de la memoria, probablemente podría escribir un programa contenedor que hiciera un mlockall()y luego ejecutara su shell; eso lo mantendría en la memoria, y sería lo más parecido a "mantener un núcleo receptivo" que probablemente obtendrá (porque no es que la CPU esté siendo sobreutilizada, ese es el problema).

Personalmente, me suscribo al método de control de recursos "no hagas tonterías". Si tienes root, puedes hacer todo tipo de daños a un sistema, y ​​hacer cualquier cosa de la que no conozcas los resultados probables es un negocio arriesgado.

womble
fuente
2
Desafortunadamente, "no hacer cosas estúpidas" no ayuda a los usuarios que ejecutan aplicaciones que acaparan la memoria como Chrome (vea los problemas 134612 , 393395 ).
Dan Dascalescu
1
@DanDascalescu Y no siempre es obvio que estás haciendo algo estúpido. Mi máquina se colgó el otro día porque cambié una "UNIÓN" en una consulta SQLite (complicada) a "UNIÓN TODO".
Michael
Los programas con errores conocidos pueden (y deberían) ejecutarse en una configuración de recursos limitados ulimit, o incluso cgroups en estos días, si eres un joven moderno, hace el trabajo bastante bien. Si está realizando cambios en las consultas en producción sin validar sus efectos en un entorno no crítico, ese es su problema de causa raíz.
womble
8

Como se mencionó anteriormente en el comentario de Tronic, es posible llamar a OOM-killer (asesino sin memoria) directamente por la combinación de teclado SysRq- F.

SysRqLa tecla generalmente se combina dentro de la PrtSctecla en los teclados.

OOM-killer mata algunos procesos (-es) y el sistema vuelve a responder. El acceso directo a OOM-killer puede no estar habilitado de forma predeterminada, por favor revise esta pregunta para saber cómo verificar su estado y / o habilitarlo.

PD: Esto me ayudó mucho. Estoy de acuerdo con la opinión de que este es el consejo más útil sobre ese problema si es causado por Chrome o cualquier software codicioso de memoria. Pero debe tener en cuenta que OOM-killer podría matar algún proceso realmente importante, úselo con cuidado.

Arkemlar
fuente
0

Si tiene ganas de volver a compilar el kernel, puede probar el parche en la EDITsección de esta pregunta: /programming//q/52067753/10239615
No desaloja las Active(file)páginas durante la presión de memoria alta y por lo tanto permite OOM-killer para activarse casi instantáneamente porque el núcleo ya no necesita pasar minutos de relectura constante desde el disco de las páginas de códigos ejecutables de cada proceso que causan un sistema operativo congelado.


fuente
-1

Esto es algo particularmente difícil de prevenir. Es porque el núcleo comienza a intercambiarse. Una solución es desactivar el intercambio. Cuando el sistema se queda sin memoria, en lugar de comenzar a intercambiar, el núcleo matará algunos procesos; por lo general, toma el proceso correcto para matar, pero de todos modos es mejor matar un proceso aleatorio que tener un sistema que no responde.

Esta puede ser una solución particularmente buena para los servidores, porque los servidores a menudo tienen suficiente RAM y cuando comienzan a usar el espacio de intercambio significa que algo está mal de todos modos. Sin embargo, los escritorios generalmente necesitan el espacio de intercambio, por lo que creo que no hay una buena solución para los escritorios. A menudo apago el espacio de intercambio en los servidores, especialmente cuando hay sospechas de una pérdida de memoria.

Antonis Christofides
fuente
44
Desactivar el intercambio en cualquier sistema es una mala idea, ya que no permite que las páginas no utilizadas se intercambien y el espacio libre utilizado para la memoria caché del disco. Esto es especialmente cierto cuando hay una pérdida de memoria.
womble
2
Y con el intercambio desactivado, el sistema aún puede ralentizarse debido a la paginación. Simplemente buscará páginas limpias locamente en lugar de páginas sucias. (Dado que, sin intercambio, nunca puede desalojar una página sucia, siempre tendrá que desalojar las páginas limpias.)
David Schwartz
Tengo un servidor que tiene una pérdida de memoria. La primera vez que sucedió, tuve que presionar el botón de reinicio, porque el servidor dejó de responder. Pero ahora que he desactivado el intercambio, el servidor simplemente mata al niño apache si se vuelve demasiado grande (es una protección además de MaxRequestsPerChild). El resultado es que el servidor se ejecuta sin problemas. De todos modos, no tiene muchas páginas sin usar, y ciertamente no está buscando locamente páginas limpias.
Antonis Christofides
@AntonisChristofides: No estoy seguro de lo que piensas que es la lección para llevar de eso. Su solución es ciertamente mala porque obstaculiza el rendimiento debido a la incapacidad de expulsar de la memoria física las páginas sucias a las que rara vez se accede, no resolvió el problema subyacente y corre el riesgo de que el asesino OOM pueda matar un proceso crítico. Por casualidad no encontraste el peligro particular del que estaba advirtiendo, pero aún estás en riesgo porque no tienes intercambio.
David Schwartz
8
Con o sin intercambio, todavía se congela antes de que el asesino OOM se ejecute automáticamente. Esto es realmente un error del kernel que debería corregirse (es decir, ejecutar OOM killer antes, antes de eliminar todo el caché de disco). Desafortunadamente, los desarrolladores de kernel y muchas otras personas no pueden ver el problema. Las sugerencias comunes tales como deshabilitar / habilitar el intercambio, comprar más RAM, ejecutar menos procesos, establecer límites, etc. Mientras tanto, sugiero ejecutar el asesino OOM manualmente (SysRq-F) cuando el sistema se congela, ya que eso hará que se recupere más rápido.
Tronic