En nuestro clúster, estamos restringiendo nuestros recursos de procesos, por ejemplo, memoria ( memory.limit_in_bytes
).
Creo que, al final, esto también se maneja a través del asesino OOM en el kernel de Linux (parece que se lee el código fuente ).
¿Hay alguna forma de obtener una señal antes de que se cierre mi proceso? (Al igual que la -notify
opción para SGEqsub
, que se enviará SIGUSR1
antes de que finalice el proceso).
Leí acerca de /dev/mem_notify
aquí pero no lo tengo, ¿hay algo más hoy en día? También leí esto que parece algo relevante.
Quiero poder al menos volcar un pequeño seguimiento de pila y tal vez alguna otra información útil de depuración, pero tal vez incluso pueda recuperarme liberando algo de memoria.
Una solución alternativa que estoy usando actualmente es este pequeño script que con frecuencia comprueba si estoy cerca (95%) del límite y, de ser así, envía el proceso a SIGUSR1
. En Bash, estoy comenzando este script en segundo plano ( cgroup-mem-limit-watcher.py &
) para que busque otros procs en el mismo cgroup y se cierre automáticamente cuando el proceso Bash principal muere.
fuente
Respuestas:
Es posible registrarse para recibir una notificación cuando el uso de memoria de un cgroup supera un umbral. En principio, establecer el umbral en un punto adecuado por debajo del límite real le permitiría enviar una señal o tomar otras medidas.
Ver:
https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt
fuente
OOM killer envía un SIGKILL ya que de lo contrario sería contraproducente dejar que el programa problemático elija continuar.
Esto significa que no hay absolutamente ninguna manera para que un proceso sepa cuándo está a punto de ser asesinado por él.
La gestión de tales problemas generalmente implica hacer correcciones a los programas o su configuración. A veces, dependiendo de la configuración del sistema, simplemente aumentar el espacio de intercambio puede dar al sistema operativo más flexibilidad de administración de memoria para evitar medidas tan drásticas.
fuente