Demasiadas coletas de lixo importantes: Adicionar espaço de pilha ou adicionar outra VM?

1

Ainda não estamos com erros de aplicativo, mas nossas ferramentas de monitoramento indicam que nosso aplicativo está sendo executado nos limites de seus recursos. Devemos primeiro adicionar mais heap ou adicionar uma VM adicional?

Temos um aplicativo em execução no WebLogic / JRockit em um cluster gerenciado.

Temos AppDynamics monitorando este aplicativo e mostra que grandes coletas de lixo estão acontecendo com frequência (a cada 1-2 minutos em média !!!). Quando uma coleta de lixo principal é executada, ela recupera espaço e o intervalo mais baixo no uso de heap é razoavelmente baixo, mesmo depois de o sistema estar ativo por um tempo (semanas / meses). Além disso, executamos a detecção de vazamentos das coleções do AppDynamics em relação à produção e não encontramos vazamentos. (Não foi possível executar o monitoramento personalizado porque não é suportado com o JRockit.) Mas, no geral, parece claro que não há vazamentos importantes, apenas que o sistema requer mais recursos do que o atual.

Temos dois ambientes de não produção também executando esse aplicativo com recursos reduzidos e carga reduzida (dev e teste). O ambiente de teste tem 2 / 3rds o número de VMs e 1/2 o heap por VM. Fizemos alguns testes de carga nesse ambiente, mas os resultados não foram muito úteis. Embora possamos recriar o número de usuários usando scripts automatizados, os dados em nosso ambiente de teste são muito diferentes - as consultas estão retornando ordens de magnitude menos dados etc. (Criar um ambiente de teste de carga melhor é certamente na lista de tarefas, mas improvável de fato acontecer em breve por razões de burocracia.) Mesmo com tudo o que pudéssemos lançar, o ambiente de teste não suava muito.

Duas opções, A) Adicione mais heap. Parece que isso ajudaria com certeza, mas fazer isso exigirá muita documentação (seria necessário adicionar mais memória aos servidores físicos, o que significa reinicializações do servidor envolvendo muitos outros aplicativos, etc.). Além disso, não tenho ideia de quanto mais memória adicionar e não podemos apenas "testar em prod". B) Adicione outra VM (ou duas) para este aplicativo. Isso seria bastante fácil, temos espaço em outro servidor físico, para que pudéssemos fazê-lo rapidamente. Mas eu não tenho certeza se isso ajudaria muito, e se isso não ajudar, voltar para a opção A mais tarde seria ainda mais difícil.

Questões específicas: 1) Ou uma das opções acima é obviamente melhor (e por quê)? 2) Se nenhum deles é obviamente melhor, que testes, etc., eu faria para decidir qual é o melhor? 3) Como devo decidir e justificar quantos recursos adicionais adicionar (heap ou VMs)? (Pontos de bônus aqui se envolver as ferramentas que já temos disponíveis.)

Atualizações:

  • 3 JVMs em um cluster, cada JVM está em uma VM separada.
  • Eles estão por trás de um balanceador de carga Apache, cada servidor recebe aproximadamente carga igual.
  • Cada JVM possui um heap de 1 GB.
  • Não é FMW.
por user3067860 30.12.2016 / 18:19

2 respostas

0

Acabamos fazendo os dois (adicionando mais espaço de heap de 1 GB a 1,5 GB e adicionando mais nós gerenciados de 3 nós a 5).

O heap foi aumentado cerca de uma hora antes de os novos nós serem adicionados e, por si só, foi suficiente para reduzir significativamente o número de coletas de lixo e o tempo gasto na coleta de lixo.

A adição de mais nós causou apenas uma pequena melhoria, mas é difícil determinar se realmente não foi muito útil, ou se simplesmente não houve muito espaço para melhorias após aumentar o heap.

    
por 01.02.2017 / 23:40
0

Supondo que o aplicativo tenha sido completamente desenvolvido e não haja vazamentos de memória (como parece ser o caso), é necessário trabalhar com a premissa de que os objetos que estão sendo criados no heap são devidos à atividade normal do objeto. aplicação.

Evitando otimizações de código e / ou ainda mais ajuste fino do heap de memória com base no tamanho e no ciclo de vida dos objetos que estão sendo criados (que por sua vez estão sujeitos à JVM específica usada), não há muito espaço para melhorias do que adicionar mais nós gerenciados ao seu domínio.

Isso pode ser facilmente alcançado usando uma ferramenta já presente em todas as instalações do WebLogic, ou seja, o WLST.

Está bem documentado como criar nós gerenciados e seus respectivos gerenciadores de nó para um cluster existente usando o WLST.

    
por 30.12.2016 / 21:04