automaticamente mata / reinicia processo (s) quando a memória está criticamente baixa

1

Eu tenho uma caixa do Debian Wheezy VPS onde estou executando alguns aplicativos do Django em produção. Idealmente, teria tentado resolver meus problemas atuais de memória, otimizando os aplicativos, adicionando mais RAM ou aumentando com o Swap. Mas o problema é que eu duvido que haja muita otimização de memória que eu sugiro ao otimizar os aplicativos do Django (a pilha é de código aberto e robusta), e adicionar RAM é uma restrição de custo para mim (também é um VPS remoto). o host não oferece opções para usar o Swap!

Assim, enquanto aguardo para garantir mais recursos para ter mais memória RAM, desejo atenuar os cenários em que o servidor executa a memória para que eu tenha que solicitar uma reinicialização do VPS (como em ponto, eu não posso nem mesmo SSH na caixa!).

Então, o que eu adoraria em uma solução é a capacidade de detectar quando um processo (ou geralmente, o uso total da memória do sistema) excede uma certa quantidade crítica (por exemplo, a RAM GRATUITA cai para dizer 10%) - Eu notei que ocorre depois que o VPS está funcionando por muito tempo, e quando o tráfego também é repentinamente grande para alguns dos aplicativos pesados (a maioria está apenas preparando aplicativos de qualquer maneira).

Então, eu desejo poder matar / reiniciar o (s) processo (s) ofensivo (s) - provavelmente o Apache. Qual solução, quando feita manualmente nessas situações, restaurou os níveis de uso de memória sã - uma sugestão de que possivelmente um ou mais dos aplicativos do Django tenham vazamento de memória?

Em resumo:

  1. Monitorar o uso geral de RAM do sistema
  2. Quando a RAM GRATUITA cai abaixo de um determinado limiar crítico (digamos abaixo de 10%), mate / reinicie o (s) processo (s) ofensivo (s) - ou mais simples, se o Apache for frequentemente o agressor, então mate / reinicie.
  3. Enxágüe e repita ...
por nemesisfixx 20.08.2014 / 19:46

3 respostas

3

O kernel do Linux tem um chamado OOM Killer embutido. É o "Out of memory killer". Então, quando sua caixa tiver esgotado seu RAM & swap, o kernel irá começar a matar coisas para tornar o servidor acessível.

Você pode ajustar as prioridades dos processos para determinar a "probabilidade" de um processo ser eliminado. Leia mais em este link , consulte a seção "Configurando o OOM Assassino ".

Basicamente, você ajusta a probabilidade no arquivo / proc / * / oom_adj. Por exemplo. aumentar a probabilidade de matar qualquer uma das instâncias do apache atualmente em execução?

pgrep apache2 |sudo xargs -I %PID sh -c 'echo 10 > /proc/%PID/oom_adj'

Ou diminua a probabilidade de o SSH ser morto:

pgrep sshd |sudo xargs -I %PID sh -c 'echo -17 > /proc/%PID/oom_adj'

Eu também recomendo desabilitar completamente o swap em um servidor onde você tem esse problema, porque o swap é tão lento que pode atrapalhar o servidor, embora ainda haja troca de espaço, assim nunca acionando o killer da OOM.

    
por 20.08.2014 / 21:28
1

Se esses aplicativos estiverem sendo executados em um servidor apache2 , você poderá ajustar o servidor. Considere:

  • Limite o MaxRequestWorkers (Isso limita o número de trabalhadores que usam memória).
  • Limite o MaxConnectionsPerChild (Isso recicla os servidores para que eles não consumam muita memória. Isso é útil se os aplicativos estiverem vazando memória.

Se seus processos estiverem vazando memória, você poderá usar /etc/security/limits.conf para limitar a quantidade de memória que um servidor pode conter. Isso impedirá que os servidores fiquem muito grandes. O mesmo efeito pode ser alcançado temporariamente usando o comando ulimit . Pode ser melhor usar ulimit para descobrir um tamanho apropriado e, em seguida, definir esses valores no arquivo limits.conf . Se o seu servidor suportar, solte um arquivo em /etc/security/limits.d em vez de editar /etc/security/limits.conf .

    
por 21.08.2014 / 05:12
1
Primeiro de tudo, eu diria que reiniciar não é um problema de solução e a melhor maneira é encontrar o processo ofensivo e por que ele está consumindo muita memória. Como mencionado acima, o linux já tem o mecanismo OOM para encontrar o processo ofensivo e matá-lo para liberar a pressão da memória

Outra maneira de descobrir isso usando o Kdump, configure este parâmetro vm.panic_on_oom = 1 (/etc/sysctl.conf), isso irá gerar vmcore quando o sistema estiver saindo da memória.Você pode encontrar mais informações sobre isso aqui

link

Também o limits.conf tem muita limitação, melhor Solução é usar cgroups para restringir a utilização da memória por processo

Então em /etc/cgconfig.conf você pode definir o grupo de controle como este (aqui estou restringindo meu aplicativo para usar apenas 256MB de memória)

    group test {
                 memory {
                         memory.limit_in_bytes = 256m;
                 }
          }

e, em seguida, em /etc/cgrules.conf eu posso definir que o seu aplicativo appzation (no seu caso django não pode exceder além de 256)

    *:django        memory          test/

Para mais informações sobre o cgroup, você pode se referir

link

Mas a ideia de reiniciar o aplicativo parece ser ruim.

    
por 21.08.2014 / 12:49