Como posso monitorar a memória da JVM de maneira adequada?


9

Estou pensando em como fazemos o monitor de memória JVM de forma indireta no ambiente de produção, mesmo sob horas ocupadas.

Suponha que eu tenha dois servidores de aplicativos tomcat em produção, com saldo de carga configurado atrás deles. Se eu conseguir ver as estatísticas de memória da jvm, posso dizer ao balanceamento de carga para parar de enviar a solicitação ao servidor que encontrará o problema do OOM. Isso faz sentido? Jconsole ou VisualVM consome mais recursos de desempenho não é minha escolha.



Respostas:



1

Outros forneceram sugestões sobre como monitorar o uso da memória ...

Suponha que eu tenha dois servidores de aplicativos tomcat em produção, com saldo de carga configurado atrás deles. Se eu conseguir ver as estatísticas de memória da jvm, posso dizer ao balanceamento de carga para parar de enviar a solicitação ao servidor que encontrará o problema do OOM. Isso faz sentido?

Tipo de. Mas não é necessariamente a melhor maneira de resolver seu problema.

Vamos voltar para a raiz do problema ... os OOMEs. No contexto do Tomcat, os OOMEs provavelmente serão causados ​​por um dos seguintes:

  • vazamentos de memória no seu aplicativo (ou possivelmente no próprio Tomcat),
  • tentando processar muitas solicitações em paralelo em cada Tomcat ou
  • solicitações individuais que precisam de muita memória durante o processamento.

Para resolver seu problema, primeiro você precisa descobrir qual deles está acontecendo ... porque a solução é diferente para cada um deles.

1) Para verificar se há vazamento de memória, é necessário usar uma ferramenta de análise de memória para examinar os padrões de uso de memória de longo prazo. Provavelmente isso mostrará um padrão de dente de serra ... o que é normal. O que você precisa procurar é o nível da parte inferior dos "dentes" tendendo para cima ao longo do tempo. Isso indica que algo está criando lixo que não pode ser coletado; isto é, um vazamento de memória.

Se houver um vazamento de memória, a melhor solução é descobrir qual parte do seu código é responsável e corrigi-lo. Qualquer outra coisa ... incluindo o balanceamento de carga ... é uma solução bandaid e pode levar a problemas piores no caminho.

2) Após eliminar vazamentos de memória, é necessário descobrir se o problema é que você está processando muitas solicitações de uma só vez. Não tenho certeza da melhor maneira de fazer isso, mas se esse é o problema (ou você suspeita que seja), existem algumas soluções possíveis:

  • Ajuste a configuração do servidor Tomcat para reduzir o número de threads de trabalho.

  • Se suas solicitações estiverem vinculadas à E / S, outra possibilidade seria examinar o suporte de manipulação de solicitações assíncronas disponível em versões recentes da especificação do Servlet - consulte http://docs.oracle.com/javaee/7/tutorial/doc/ servlets012.htm . Mas isso será mais trabalho.

3) Se o problema é que certas solicitações estão usando muita memória, você precisa descobrir como detectar essas solicitações antecipadamente e "lidar com elas". Detectar e lidar com essas solicitações pode ser difícil ... e é difícil aconselhar sem detalhes da sua aplicação. Mas algumas soluções pragmáticas são:

  • Encaminhe as solicitações anômalas para outro servidor com muita pilha ... onde os OOMEs não interferirão nas solicitações "normais".

  • Aumente o tamanho da pilha. Se você tiver memória física suficiente, executar com um heap maior pode realmente tornar seus servidores Tomcat mais eficientes ... além de evitar OOMEs.


Em resumo, em vez de tentar equilibrar a carga para evitar OOMEs, sugiro que você descubra por que está recebendo OOMEs ... e tente lidar diretamente com a causa dos OOMEs.


0

Talvez o jvmtop valha uma olhada para você.

Ele mostra de maneira "top-like" em uma base por jvm, monitorando métricas como consumo de memória, utilização da CPU, contagem de threads, etc.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.