¿Cómo uso oom_score_adj?

24

El 11.04, /proc/[pid]contiene oom_score_adj, pero man procdescribe el viejo oom_adj. Busqué en Google sin éxito ninguna información sobre cómo usar esto.

Lo que necesito arreglar es que los procesos iniciados por 'pbs' o 'gridengine' se eliminen antes de que se elimine cualquier otra cosa. ¿Cómo puedo hacer eso?

bmargulies
fuente
Para que este cambio sea permanente para los servicios administrados por Upstart: ¿Cómo establecer ajustes asesinos OOM para los demonios de forma permanente? .
gertvdijk
Ya es una respuesta. Se vincula a ella. :)
gertvdijk
Pero no en este sitio :-)
bmargulies

Respuestas:

13

Basado en mis propias preguntas y respuestas sobre Unix y Linux sobre una pregunta similar.

Como Stuart señaló muy bien en su respuesta , los valores válidos son enteros en el rango de -1000 a 1000 para oom_score_adj. Cuanto más bajo es el valor, menor es la probabilidad de que sea asesinado.

Es muy inconveniente tener que cambiar este valor una y otra vez una vez que reinicia la aplicación. La información simplemente se pierde después de que el proceso ha finalizado. Upstart (el demonio init en Ubuntu), tiene una buena opción para que esto se configure para demonios para asegurarse de que esté configurado cada vez que se haya (re) iniciado:

oom score

[...] recorte [...]

Ejemplo:

# this application is a "resource hog"
oom score 1000

expect daemon
respawn
exec /usr/bin/leaky-app

Entonces, básicamente, puede editar el /etc/init/myservice.confarchivo de configuración para los servicios que desea cambiar, para incluir una línea oom score -1000. Supongo que los servicios 'pbs' o 'gridengine' de los que habla en su pregunta están habilitados para Upstart, de lo contrario, necesitará otra forma de cambiar esto permanentemente.

gertvdijk
fuente
7

Si puede modificar el script de inicio generando el proceso que desea priorizar para oom-killer, agregue lo siguiente al script de inicio:

echo 1000 > /proc/self/oom_score_adj

El valor se hereda para los procesos secundarios.

usuario1338062
fuente
6

Si establece un valor alto (ish) para oom_adj o oom_score_adj, se eliminarán primero. p.ej

echo 15 > /proc/[pid]/oom_adj

oom_adj va de -16 a 15 y, como se mencionó anteriormente, oom_score_adj acepta -1000 a 1000

Stuart
fuente
Necesitas ser root para hacer esto. sudo sh -c "echo -1000 > /proc/[PID]/oom_score_adj"
Adil
2
En realidad, puede aumentar la puntuación de sus procesos sin root ("sí, esto puede ser eliminado"). La disminución (por debajo de 0) necesita raíz.
Piskvor
5

Examinar el código siempre es una buena idea. Normalmente uso la función de búsqueda de kernel.org, pero actualmente no funciona. Github también hace un buen trabajo. Encontré esto:

En cambio, se agrega un nuevo sintonizable, / proc / pid / oom_score_adj, que varía de -1000 a +1000. Se puede usar para polarizar la heurística de modo que ciertas tareas nunca se consideren para matar oom mientras que otras siempre se pueden considerar. El valor se agrega directamente al puntaje badness (), por lo que un valor de -500, por ejemplo, significa descontar el 50% de su consumo de memoria en comparación con otras tareas en el sistema, vinculadas a la mempolítica, en el cpuset o compartiendo el mismo controlador de memoria.

Desde https://github.com/mirrors/linux-2.6/commit/a63d83f427fbce97a6cea0db2e64b0eb8435cd10#include/linux/oom.h

falstaff
fuente
Gracias por el puntero, pero espero que alguien conduzca y presente una receta para todo el problema, lo que parece estar arreglando que este valor se establezca para el demonio ejecutivo de pbs antes de que se bifurca.
bmargulies