Evite que o OOM do Linux mate o apache em nosso servidor

6

Nós temos um servidor web debian linux. Está apenas executando o apache2. Nosso servidor mysql está em outro host. No entanto, às vezes, executamos tarefas do cron no servidor da Web para executar tarefas comuns.

No entanto, recentemente, uma das tarefas do cron teve um bug e começou a devorar a memória. O matador do Linux OOM matou o apache. Que, claro, derrubou o nosso site. O cron com fome de memória continuou correndo. No entanto, neste caso, gostaria que o OOM killer matasse esse script e não o apache.

Existe alguma maneira de configurar o kernel para que eu possa dizer que não mate processos chamados 'apache2' (ou pelo menos faça o apache2 ser o último mata)? Tanto o apache quanto o crons regulares são executados como o mesmo usuário (www-user).

    
por Rory 21.01.2010 / 16:51

5 respostas

3

Não parece que você esteja lidando com a causa raiz do problema, depurando, na verdade, por que essa tarefa do cron está usando tanta memória.

Você pode tentar definir essa opção

echo 1 > / proc / sys / vm / oom_kill_allocating_task

que irá dizer ao OOM killer para matar o processo que desencadeou a condição OOM, mas isso não é garantido para ser seu trabalho cron. Você também pode usar "ulimit -m" no seu script para definir a quantidade máxima de memória residente a ser usada. Eu acho que sua melhor aposta seria avaliar por que o cronjob está usando tanta memória e se é talvez mais adequado para outro host ou para ser reescrito para consumir menos memória.

    
por 21.01.2010 / 20:20
3

O OOMKiller é configurável até certo ponto. Depois de ter iniciado um processo, você pode definir o valor de /proc/<pid>/oom_adj para um 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.

    
por 21.01.2010 / 20:36
1

Você também pode alterar a memória virtual em relação ao comportamento de confirmação. Por exemplo, você pode alterar o valor de / proc / sys / vm / overcommit_memory para '2' - ou seja, NÃO comprometa a memória. (Não apenas altere esse valor sem entender o que ele faz.)

No modo 'sem sobrecarga', qualquer novo processo que peça mais memória RAM, receberá um erro quando tentar alocar. Então, ao invés de ter o killer da OOM e adotar seu (s) antigo (s) longo (s) processo (s) longo (s), o novo cara que pede a RAM é informado 'não'.

... e, em seguida, você precisa corrigir seu problema de memória. Encontre o vazamento, redesenhe o processo de consumo de memória, adicione mais memória RAM à caixa, etc.

    
por 12.05.2013 / 13:06
0

Resposta curta: Não, o OOM-killer não é configurável, e há / tem havido resistência em mudar isso.

Apenas algumas ideias do topo da minha cabeça:

  1. Aumente o espaço de troca - se os scripts forem de 32 bits, será fácil dar a eles muito espaço para esgotar.

  2. Aumenta a memória física. Em 1 praticamente.

  3. Use ulimit para restringir a quantidade de memória que os scripts podem receber.

por 21.01.2010 / 19:40
0

Aqui diz que você pode definir um "sinalizador" OOM_DISABLE em um processo: link

    
por 11.05.2013 / 03:42