¿Es posible activar OOM-killer en el intercambio forzado?

26

¿Es posible hacer que el sistema intercambie de manera preventiva páginas inactivas ( vm.swappiness), pero invoque al oom-killer cuando el sistema se queda sin RAM (en lugar de quedarse sin memoria) y se ve obligado a cambiar?

El objetivo final es evitar que el sistema se detenga cuando comienza a agitar el disco debido a fallas importantes en la página, pero aún así permite que las páginas inactivas se intercambien.

Otro deseo sería configurar la cantidad de memoria de intercambio que el sistema se ve obligado a usar antes de que se active Oom-Killer. De esta manera, el sistema puede sumergirse en el intercambio solo un poco, siempre que no vaya demasiado lejos. O podría establecer dicho umbral para activar oom-killer antes de usar toda la RAM para que siempre haya espacio para la caché del sistema de archivos (y así evitar más agitación del disco).

No parece que esto sea tan difícil de hacer. Parece que podrías decirle al asesino de Oom que se dispare cuando el sistema tiene X ram usado / libre. Pero es por eso que pregunto; No lo sé.

Para aclarar, no estoy buscando desactivar el intercambio o ajustar el vm.swappinessparámetro

Patricio
fuente
3
Curiosamente, sucede incluso cuando no hay un archivo de intercambio. Aparentemente, los archivos mapeados de memoria de solo lectura (como ejecutables, bibliotecas, quizás recursos gráficos) se intercambian en su lugar.
WGH
El oomd de Facebook es un demonio de espacio de usuario diseñado para eliminar procesos basados ​​en el rendimiento general del sistema (es decir, solo cuando se agita). Pero parece bastante complicado configurarlo para computadoras de escritorio / estaciones de trabajo (que probablemente no están poniendo tareas en cgroups o contenedores).
Jeffrey Bosboom

Respuestas:

22

También luché con ese problema. Solo quiero que mi sistema permanezca receptivo, pase lo que pase, y prefiero perder procesos que esperar unos minutos. Parece que no hay forma de lograr esto usando el kernel oom killer.

Sin embargo, en el espacio del usuario, podemos hacer lo que queramos. Así que escribí el Early OOM Daemon ( https://github.com/rfjakob/earlyoom ) que matará el proceso más grande (por RSS) una vez que la RAM disponible sea inferior al 10%.

Sin Earlyoom, ha sido fácil bloquear mi máquina (8 GB de RAM) iniciando http://www.unrealengine.com/html5/ varias veces. Ahora, las pestañas del navegador culpable se matan antes de que las cosas se salgan de control.

Jakob
fuente
1
Gracias, eso es exactamente lo que estaba buscando. Ahora puedo seguir ejecutándome column -t -s,en algunos archivos csv enormes y dejar que lo earlyoommate cuando eso no sea posible, antes de notar cualquier falta de respuesta.
henfiber
4

Esto suena como una solución demasiado elaborada. Sugeriría (y hago esto en máquinas que configuro que no necesitan hibernar) simplemente asignando una pequeña cantidad de espacio de intercambio (128-256MiB). De esta manera, el núcleo puede intercambiar algunas páginas, pero el asesino OOM se invoca antes de que las cosas se pongan mal.

Si realmente desea hacer esto, creo que necesitará escribir su propio script / programa que supervise el uso del intercambio e invoque al asesino de OOM utilizando la tecla Magic SysReq (que se puede hacer mediante programación escribiendo /proc/sysrq-trigger).

mgorven
fuente
1
Yo diría que tener un pequeño intercambio no es una solución muy elegante. Básicamente terminas limitando la utilidad de tu intercambio. ¿Qué sucede si tiene muchas páginas inactivas y se beneficiaría de tener 10 gb de intercambio? Tengo cajas con ~ 100 gb de ram donde 10 gb de intercambio no es una idea descabellada. Y escribir una aplicación para hacer esto en el espacio de usuario está abierto a problemas (en comparación con nativamente en el núcleo).
Patrick
Porque, en esencia, se necesita un mecanismo para distinguir el "intercambio bueno" del "intercambio malo", y ese es un algoritmo difícil de idear. La cantidad de intercambio que es apropiada obviamente depende de la cantidad de RAM y la carga de trabajo que esté ejecutando, por lo que si 10GiB es apropiado para sus máquinas, entonces asigne eso :-)
mgorven
¿Por qué sería eso difícil? Solo hay 2 tipos de intercambio, intercambio preventivo debido vm.swappinesse intercambio forzado debido a la falta de memoria RAM. Todo lo que necesita suceder es cuando el núcleo se ve obligado a intercambiar, para desencadenar la muerte. Y 10 gb también deja toneladas de espacio para el intercambio forzado para golpear el disco.
Patrick