Temos um servidor web debian linux. Está apenas rodando o apache2. Nosso servidor mysql está em outro host. No entanto, às vezes executamos tarefas cron no servidor web para realizar tarefas regulares.
No entanto, recentemente, uma das tarefas cron apresentou um bug e começou a consumir memória. O assassino OOM do Linux matou o Apache. O que, claro, derrubou nosso site. O cron com fome de memória continuou funcionando. No entanto, neste caso, eu gostaria que o assassino OOM matasse esse script, enãoapache.
Existe alguma maneira de configurar o kernel para que eu possa dizernãomatar processos chamados 'apache2' (ou pelo menos fazer com que o apache2 seja odurarcoisa que mata)? Tanto o apache quanto os crons regulares são executados como o mesmo usuário (www-user).
Responder1
Não parece que você esteja abordando a causa raiz do problema depurando por que esse cron job está usando tanta memória.
Você pode tentar definir esta opção
eco 1 > /proc/sys/vm/oom_kill_allocating_task
que dirá ao assassino OOM para encerrar o processo que acionou a condição OOM, mas não é garantido que este seja seu cron job. Você também pode usar "ulimit -m" em seu script para definir a quantidade máxima de memória residente a ser usada. Acho que sua melhor aposta seria avaliar por que o cronjob está usando tanta memória e se talvez seja mais adequado para outro host ou para ser reescrito para consumir menos memória.
Responder2
O OOM Killeréconfigurável até certo ponto. Depois de iniciar um processo, você pode definir o valor de /proc/<pid>/oom_adj
como um número inteiro negativo. Isso afetará a afinidade do OOMKiller com o processo e seus filhos. Quando o seu sistema atinge uma condição de falta de memória, outros processos serão eliminados.
Responder3
Você também pode alterar o comportamento de confirmação da memória virtual. Por exemplo, você pode alterar o valor de /proc/sys/vm/overcommit_memory para '2' - o que significa NÃO alocar memória demais. (Não basta alterar esse valor sem entender o que ele faz.)
No modo 'sem overcommit', qualquer novo processo que solicite mais memória RAM receberá um erro ao tentar alocar. Então, em vez de fazer com que o assassino do OOM destrua seu (s) processo (s) antigo (s) de longa execução, o novo cara que pede RAM recebe um 'não'.
...e então você precisa consertar seu problema de memória. Encontre o vazamento, redesenhe o processo que consome memória, adicione mais memória RAM à caixa, etc.
Responder4
Diz aqui que você pode definir um "sinalizador" OOM_DISABLE em um processo: http://linux-mm.org/OOM_Killer