Prioridade do aplicativo com pouca memória

5

Estou executando o Debian em uma máquina que possui memória limitada e nenhuma opção para adicionar espaço de troca. A máquina serve como um servidor web e de banco de dados. O problema que estou vendo é que quando várias solicitações da Web entram, meu banco de dados pára de aceitar conexões e às vezes até falha porque o sistema não tem mais RAM disponível.

É possível dizer ao Linux para matar processos específicos (no meu caso, o Apache) caso outro processo (no meu caso, o Firebird) solicite memória e não haja o suficiente? Se não for possível fazer nativamente, talvez haja alguma ferramenta para me ajudar a conseguir isso?

    
por Rytis 03.05.2009 / 13:34

2 respostas

10

Você pode ajustar o assassino da OOM para preferir certos processos. Cada processo tem uma pontuação que indica a probabilidade de o processo ser eliminado caso o sistema seja executado em situação de OOM. Você pode ver a pontuação de um processo em /proc/${PID}/oom_score . Você pode influenciar a decisão do assassino da OOM usando /proc/${PID}/oom_adj : um valor alto aumenta a probabilidade de que o assassino da OOM mate $ {PID}. O valor de oom_adj é herdado por filhos, portanto, basta configurá-lo no processo mestre do apache na inicialização (nesse caso, você deve hava um watchdog que reinicia o apache); Uma alternativa é deixar o processo mestre em seu nível padrão e ajustar cada filho para que o mestre permaneça ativo e reproduza novamente os filhos conforme necessário (nesse caso, você precisa de um daemon externo que verifique novos filhos e ajuste oom_adj ). É claro que isso pressupõe que você esteja usando o multiprocessador; -)

Por favor, note que o intervalo normal de valores de oom_adj (-16,15) é apenas um viés, a heurística do assassino de OOM ainda pode escolher outro processo se sua pontuação for alta o suficiente. O valor especial -17 torna o processo inutilizável pelo killer da OOM, mas é perigoso, porque se o processo não-faturável (por exemplo, seu banco de dados) ficar frenético, o kernel pode ser incapaz de se recuperar da falta de memória.

    
por 03.05.2009 / 16:30
4

Se você estiver usando uma VM alugada, basta adicionar um arquivo de troca em vez de uma partição de troca. Menor desempenho, mas pelo menos você terá a memória disponível quando necessário:)

Como criar um arquivo de troca?

sudo dd if=/dev/zero of=/swapfile bs=1024 count=1000000

Isto irá criar um arquivo (/ swapfile) de tamanho 1GB (redondo)

sudo mkswap /swapfile

adicione este arquivo ao seu pool de swap

sudo swapon /swapfile

Isso fará o trabalho, agora você tem um Gb extra de memória swap.

    
por 03.05.2009 / 13:42