Cloud Computing

12 jul, 2017

Disparando alertas para o OOM Killer em contêineres

Publicidade

A utilização racional de memória é um dos princípios mais influentes para a definição do custo benefício e confiabilidade do host da sua aplicação. No entanto, configurar a utilização apropriada da RAM pode tornar-se mais complicado do que parece a princípio. Existem vários pontos onde podemos tropeçar e que deveriam ser considerados para evitar que sejam excedidos os limites de memória.

Portanto, se você ignorar problemas, configurações de memória incorretas ou não otimizadas poderão deixar seu contêiner propenso ao uso excessivo de memória. Desse modo, quando os limites de memória do servidor atingem o limite, o sistema normalmente tenta mantê-lo funcionando ao fazer uma chamada do Out-of-Memory (OOM) Killer. Para liberar as capacidades necessárias, essa ferramenta comumente utilizada analisa todos os processos do contêiner e os ordena por prioridade/consumo de recursos. Então, ele suspende os serviços atuais que não sejam importantes para manter os mais importantes. No entanto, como parte dos processos é eliminado, a aplicação não pode ser considerada completamente funcional e normalmente exige algum envolvimento manual para ser restaurada.

Problemas com falta de memória são comuns para quase todas as pilhas de softwares e linguagens de programação – por exemplo, recentemente examinamos algumas especificações do Java para alocação de memória dentro dos contêineres Docker, onde um algoritmo errado para determinação do escopo da memória RAM disponível geralmente causa a eliminação do processo principal do Java pelo kernel.

Se isso se tornar comum em seu servidor, acontecer frequentemente problemas de falta de memória pode causar uma séria preocupação para revisar o código e as configurações da sua aplicação. O estado persistente de falta de memória pode implicar não somente na falta de recursos, mas na existência de alguns problemas escondidos ou configurações erradas que atrapalham a utilização eficiente da memória.

Dessa maneira, em um esforço para facilitar o tratamento de tais problemas, o Jelastic PaaS fornece um monitoramento diferenciado para a atividade do OOM Killer dentro dos seus contêineres enviando as mensagens apropriadas por e-mail sobre suas execuções. Isso possibilita que você esteja ciente das necessidades de recursos de sua aplicação para se livrar de possíveis falhas de memória revelando a causa raiz da falta de memória. Então, abaixo consideramos como recuperar as informações necessárias sobre o uso excessivo da RAM pelos contêineres para definir a solução apropriada, e vamos simular um problema de falta de memória para vermos o sistema completo em ação.

Alertas do OOM Killer

Os alertas de execução do OOM Killer estão automaticamente habilitados para todas as novas instâncias recentemente criadas nas plataformas Jelastic das versões 5.0.5 e superiores. Para contêineres legados (ou no caso de a funcionalidade apropriada não ser oferecida como padrão devido a alguma configuração específica do servidor de hospedagem), os alertas necessários podem ser adicionados manualmente, assim como os que são padrão – desabilitando e reconfigurando.

Para acessar as opções de gerenciamento e revisar a lista dos gatilhos de notificação já configurados, nas configurações do seu ambiente, mude para a sessão Monitoramento > Carregar Alertas.

Aqui, os gatilhos dedicados ao OOM Killer (se houver algum) poderão ser reconhecidas pela condição OOM Kill.

Use “Adicionar/Editar” no topo do painel para criar um novo alerta ou modificar um existente.

Aqui, cada notificação do OOM Kill é definida com as seguintes opções:

  • Nome (Name): denominação do alerta, que será utilizado pela interface de usuário da plataforma e mensagens de e-mail subsequentes;
  • Nós (Nodes): camada do ambiente a ser monitorada por eventos de falta de memória (você pode aplicar um gatilho para qualquer camada do ambiente escolhido);
  • Quando (Whenever): Selecione a condição para execução do gatilho do OOM Killer.
  • Frequência de notificação (Notification Frequency): configure um intervalo (em horas) para as mensagens serem enviadas, ou seleciona “imediatamente” para receber uma mensagem cada vez que um processo for eliminado.

Assim que for confirmado com o botão “Adicionar” (Add), você começará a receber e-mails para todos os problemas de falta de memória para os contêineres do tipo escolhido. Tais notificações contém informações sobre a quantidade de RAM consumida para realizar a chamada do OOM Killer, uma tabela com os detalhes dos processos eliminados e algumas recomendações gerais para solucionar e prevenir-se de tais problemas.

———–

Tradução do texto da imagem:

O alerta OOM Kill foi executado. Os nós ubuntu:latest no ambiente my-project tentaram utilizar mais memória RAM do que é fornecido (512 MB por nó) pelo limite de cloudlets que você configurou (4 cloudlets por nó).

Como resultado, os seguintes processos foram eliminados pelo OOM Killer no contêiner ubuntu:latest 

Atualmente o ubuntu:latest consome 2 cloudlets (aproximadamente 169,54 MB), que é 33,2% dos recursos disponíveis. 

Nota: Durante uma falta emergencial de memória, o OOM Killer tenta liberar o máximo de memória eliminando o mínimo de processos possível. Por isso, os processos eliminados podem não indicar os processos que estavam causando um aumento inesperado no carregamento da memória. 

Ações recomendadas 

  • Revisar o histórico de alertas OOM Killer em seu painel de controle;
  • Verificar se sua aplicação foi afetada pelos processos eliminados;
  • Aumentar o limite de cloudlets para permitir ao ubuntu:latest acessar mais RAM quando necessário;
  • Reiniciar my-project para garantir que todos os processos necessários estão sendo executados. 

O guia mais detalhado para o processo afetado, como analisar o problema com mais detalhes, e como evitar isso no futuro podem ser encontrados em nossa documentação.

Nota: Mensagens futuras sobre o OOM Killer no ubuntu:latest será suprimido pela próxima 1 hora para evitar encher sua caixa de mensagens. Você pode ajustar esse intervalo dentro das configurações de carregamento de alertas no painel de controle.

———–

Na maioria dos casos, receber tais alertas implica que você tem que investigar a causa raiz do problema e aplicar alguma solução. As recomendações mais comuns são:

  • Revisar o código da sua aplicação para possíveis problemas para a falta de memória;
  • Aumentar a quantidade de recursos alocados e/ou instâncias para um servidor com o escalonamento automático vertical/horizontal do Jelastic (pois sua aplicação pode somente necessitar de mais capacidade para operar apropriadamente)

Visando ajudar você a resolver os eventos de falta de memória mais rápido, nós já analisamos os problemas mais comumente encontrados e reunimos as mais eficientes maneiras de corrigi-los dentro do guia Resolvendo Problemas com o OOM Killer. Lá, todas as eliminações possíveis são divididas em 3 grupos principais:

  • Casos comuns: os processos que são executados como padrão em um contêiner Jelastic e podem ser eliminados pela ferramenta OM Killer.
  • Processos de alto risco: problemas presumidos de memória, que exigem ações especiais ou otimização do código do aplicativo; são ordenados baseados por tipo de pilha e linguagem de programação, onde cada sessão fornece as recomendações gerais de acordo com o motor utilizado, assim como eliminar processos específicos.
  • Processos que não causam problemas de memória: operações que podem ser eliminadas pelo OOM Killer embora não representem a raiz do problema; a solução geral para todos os problemas é reiniciar o contêiner para restaurar os processos correspondentes.

Então, para descobrir a solução necessária, pegue o nome do processo, que você recebeu por e-mail e procure por ele nos documentos descritos acima.

E abaixo, vamos considerar os mecanismos descritos acima, de alerta e execução do OOM Killer, em prática, enquanto simulamos o consumo anormal de RAM por um processo pesado dentro do contêiner.

Simulação para disparar o alerta do OOM Killer

Vamos simular o problema de falta de memória em um contêiner para invocar o serviço OOM Killer e verificar seu comportamento. Para isso, vamos gerar alguma carga no servidor com uma ferramenta simples de teste de stress.

Nota: Executando o Stress dentro de um contêiner exige permissões de administrador completas, por isso, ou você vai precisar de um nó VPS ou um Contêiner do Docker para o exemplo abaixo.

1. Conecte ao contêiner apropriado via SSH Gate realizando as seguintes operações:

2. Quando acessar, execute um dos comandos a seguir de acordo com a distribuição de sistema operacional está sendo executada em seu servidor para a instalação da nossa ferramenta.

  • Apt-get install stress – para Ubunto / Debian
  • Yum install stress – para o CentOS / Fedora

Inicie o teste de stress com os parâmetros apropriados para simular a falta de memória:

Stress -m {workers} -t {timeout}

Onde:

  • {workers}: número de consumidores para consumir a RAM (256MB por consumidor, por padrão)
  • {timeout}: número de segundos que o teste vai durar (ex.: 30s)

Como você pode ver, a ação chamada falhou devido à falta de memória RAM no contêiner.

4. Agora, retorne ao painel de controle e verifique a aba Monitoring > Histórico de Eventos

Para encontrar os alertar necessários mais rápido, utilize as opções dentro da sessão “Filtros”:

  • Tipo (Type): Escolha “Carregar Alertas” (A segunda opção é dedicada a eventos de Escalonagem Horizontal)
  • Nós (Nodes): selecione a camada do ambiente para a qual você gostaria de ver as informações pela lista extraída automaticamente extraída dos tipos de servidores (a menos que você prefira gerar para todos)
  • Gatilho (Trigger): Selecione o tipo de gatilho OOM (Out-of-Memory)
  • De/Para (From/To): especifique o intervalo para que sejam exibidas as execuções do OOM Killer nesse período.

Para informações adicionais sobre um evento OOM particular (como Identificação do Processo, Identificação do Nó onde ele foi executado, etc.), leve o mouse até o registro da informação apropriada ou revise a notificação que você recebeu por e-mail

5. Também, os administradores de clustersI (ex.: quem gerencia instalações separadas de Jelastic) tem acesso à estatísticas sobre a atividade do OOM Killer dentro da plataforma inteira – Os dados relacionados são armazenados na sessão JCA > Relatórios > OOM Killer

Para coletar as informações necessárias e limitar a lista (ex.: Identificação de usuário, conforme exibido acima), utilize os filtros no topo da página.

Dessa maneira, você poderá monitorar as atividades do OOM Killer dentro dos seus contêineres para eficientemente utilizar a memória sem comprometer a performance da aplicação. Teste agora mesmo absolutamente gratuitamente durante duas semanas em qualquer uma das nossas plataformas na nuvem.

 

***

Tetiana Markova faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: http://blog.jelastic.com/2017/06/07/oom-killer-for-automatic-memory-cleaning/