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?
Respuestas:
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
rlimit
y / oulimit
) 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.
fuente
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.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.
fuente
Este es un error conocido desde 2007: consulte Congelación del sistema en uso de memoria alta .
En esta situación, Windows muestra un cuadro de diálogo que advierte al usuario que cierre una o más aplicaciones.
fuente
Si tiene ganas de volver a compilar el kernel, puede probar el parche en la
EDIT
sección de esta pregunta: /programming//q/52067753/10239615No 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
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.
fuente