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.