Disponemos de un servidor web Debian Linux. Simplemente está ejecutando apache2. Nuestro servidor MySQL está en otro host. Sin embargo, a veces ejecutamos tareas cron en el servidor web para realizar tareas habituales.
Sin embargo, recientemente una de las tareas cron tuvo un error y comenzó a consumir la memoria. El asesino de Linux OOM mató a Apache. Lo que por supuesto hizo caer nuestro sitio web. El cron hambriento de memoria siguió ejecutándose. Sin embargo, en este caso, me gustaría que el asesino de OOM elimine ese script ynoapache.
¿Hay alguna forma de configurar el kernel para poder decirnoeliminar procesos llamados 'apache2' (o al menos hacer que apache2 sea elúltimocosa que mata)? Tanto Apache como los crons normales se ejecutan como el mismo usuario (www-user).
Respuesta1
No parece que esté abordando la causa raíz del problema al depurar por qué este trabajo cron está consumiendo tanta memoria.
Puedes intentar configurar esta opción.
eco 1 > /proc/sys/vm/oom_kill_allocating_task
lo que le indicará al asesino de OOM que finalice el proceso que desencadenó la condición de OOM, pero no se garantiza que este sea su trabajo cron. También puede usar "ulimit -m" en su script para establecer la cantidad máxima de memoria residente a usar. Creo que lo mejor sería evaluar por qué el cronjob está consumiendo tanta memoria y si quizás sea más adecuado para otro host o reescribirlo para consumir menos memoria.
Respuesta2
El asesino de OOMesconfigurable hasta cierto punto. Después de haber iniciado un proceso, puede establecer el valor de /proc/<pid>/oom_adj
en un entero negativo. Esto afectará la afinidad de OOMKiller hacia el proceso y sus hijos. Cuando su sistema llega a una condición de falta de memoria, se eliminarán otros procesos.
Respuesta3
También puede cambiar el comportamiento de confirmación de la memoria virtual. Por ejemplo, puede cambiar el valor de /proc/sys/vm/overcommit_memory a '2', lo que significa NO comprometer excesivamente la memoria. (No cambie simplemente este valor sin comprender lo que hace).
En el modo 'sin sobrecompromiso', cualquier proceso nuevo que solicite más RAM recibirá un error cuando intente asignar. Entonces, en lugar de que el asesino de OOM vaya y destruya sus procesos antiguos y de larga ejecución, al nuevo tipo que solicita RAM se le dice "no".
...y luego necesitas solucionar tu problema de memoria. Encuentre la fuga, rediseñe el proceso que consume memoria, agregue más RAM a la caja, etc.
Respuesta4
Aquí dice que puede establecer una "bandera" OOM_DISABLE en un proceso: http://linux-mm.org/OOM_Killer