¿Cómo le vuelvo a dar los dientes asesinos a OOM?

12

En el pasado solía maldecir al asesino de OOM por ser demasiado agresivo y matar aplicaciones que estaba usando. Ahora, mientras miro periódicamente mi sistema agitarse durante 15 minutos debido a algún programa que se comporta mal, y finalmente recurro a un apagado forzado porque no responde al teclado, me doy cuenta de que lo tuve mejor de lo que pensaba en aquel momento.

¿Cómo restauro al OOM-killer a sus formas antiguas y sedientas de sangre?

Avdi
fuente
1
Eche un vistazo a los programas que causan un problema y limite la cantidad de memoria que pueden absorberlimits.conf
LawrenceC

Respuestas:

4

Disminuiría la cantidad de espacio de intercambio que tiene disponible. Las instalaciones típicas en estos días intentan asignar tanto intercambio como memoria física (o, a veces, el doble). El problema con esto es que cuando algo va mal, el sistema entra en una espiral de muerte de intentar "shuffle" cosas de la memoria en el disco, y la espalda, y se empieza a hacer así que gran parte de que no tiene tiempo para responder a la entrada del usuario.

En los buenos días, los procesos completos se intercambiaban en el disco (y viceversa), por lo que se necesitaban grandes intercambios.

En los sistemas modernos de memoria virtual, la memoria se intercambia en bloques (en lugar de procesos completos), por lo que puede sobrevivir con intercambios más pequeños. En su situación, sería mejor que se maten los procesos, por lo que ejecutar con un intercambio más pequeño hará que OOM comience a matar los procesos antes (en lugar de hacer que el sistema gaste cantidades excesivas de tiempo intercambiando cosas hacia / desde el disco).

Brian Stevens
fuente
Tengo cero intercambio, y mi sistema se bloquea durante más de 20 minutos cuando tengo un bucle infinito de javascript en cromo que empuja a una matriz o algo así. Necesito OOMK para disparar antes de que mi sistema sea inútil, no mucho después.
JasonWoof
0

Esto es lo que funcionó para mí:

echo 1 > /proc/sys/vm/oom_kill_allocating_task

Eso es solo por esta bota. Puede probar ejecutando lo siguiente en la pestaña de la consola del inspector de su navegador:

a = []; while (true) { a.push(1); }

Si está satisfecho con esta configuración, puede realizar el ajuste predeterminado para todas las botas futuras:

echo "vm.oom_kill_allocating_task=1" >> /etc/sysctl.conf
JasonWoof
fuente