named é morto

2

De vez em quando, meu servidor irá matar o named. Isso é registrado:

Apr 16 17:00:08 li127-203 kernel: Out of memory: Kill process 15723 (named) score 38 or sacrifice child
Apr 16 17:00:08 li127-203 kernel: Killed process 15723 (named) total-vm:92096kB, anon-rss:5492kB, filers:0kB

Parece que estou ficando sem memória, mas por que é sempre o nome que é morto e não algum outro processo? Existe alguma maneira de evitar isso?

Estou rodando o CentOS 6.2 em um Linode VPS.

    
por edc1591 16.04.2012 / 23:13

2 respostas

3

O assassino da OOM é uma amante inconstante. O BIND está sendo segmentado porque é considerado o melhor alvo pela lógica do assassino da OOM. Está bem explicado no comentário do código na página vinculada, mas é preciso colar:

/*
 * oom_badness - calculate a numeric value for how bad this task has been
 * @p: task struct of which task we should calculate
 * @p: current uptime in seconds
 *
 * The formula used is relatively simple and documented inline in the
 * function. The main rationale is that we want to select a good task
 * to kill when we run out of memory.
 *
 * Good in this context means that:
 * 1) we lose the minimum amount of work done
 * 2) we recover a large amount of memory
 * 3) we don't kill anything innocent of eating tons of memory
 * 4) we want to kill the minimum amount of processes (one)
 * 5) we try to kill the process the user expects us to kill, this
 *    algorithm has been meticulously tuned to meet the principle
 *    of least surprise ... (be careful when you change it)
 */

Mas isso apenas informa por que ele segmentou o BIND. A solução provavelmente não é "conseguir para alvejar outra coisa", já que qualquer outra coisa que esteja sugando muita memória provavelmente também é importante. É mais provável que a solução seja "não acione o killer da OOM".

Você pode aumentar a memória ou o espaço de troca disponível para este sistema ou diminuir a memória usada por outros processos? O que mais está sendo executado neste sistema? O BIND é configurado como autoritativo ou recursivo (o que permitiria limitar o uso da memória cache)?

    
por 16.04.2012 / 23:23
0

Na verdade, existe um arquivo na árvore de processos que permite desabilitar ou alterar o comportamento do OOM, localizado em /proc/PROCESS_ID/oom_adj ( documentação ). Para desativar, você pode fazer:

echo 17 > /proc/PROCESS_ID/oom_adj

Então, se você quiser sempre aplicar isso a named , poderá usar:

echo 17 > /proc/$(pidof named)/oom_adj

Tenha em mente, porém, que $(pidof named) pode retornar mais do que executar pid, embora eu pense que named tenha apenas um processo em execução.

Espero que isso ajude!

    
por 16.04.2012 / 23:23