Uso ineficiente da CPU pelo Tomcat

2

Estou usando o tomcat para converter pdf em png. Eu estava usando o Jmeter para carregar / throughput testar o aplicativo usando um servidor Intel Xeon (R) X5550 @ 2.67GHz que tem 16 núcleos hyper-threaded. O Tomcat6 tinha 2gigs de memória heap alocados e o conector foi configurado para lidar com 1.000 conexões simultâneas. Durante o teste de carga, descobri que, à medida que aumentava os usuários, o tempo de resposta se deteriorava, o que é normal. A média de carga, no entanto, foi muito baixa (cerca de 1 para uma máquina de 16 núcleos), e o uso da CPU foi de cerca de 60%. Eu estava monitorando a instância do tomcat com o jconsole por meio do JMX e descobri que o uso da memória não era um problema. Para manter o tempo de resposta baixo, criei cerca de 8 instâncias do tomcat em 8 portas diferentes e fiz com que um balanceador de carga equilibrasse a carga entre todas as 8 portas durante meu teste de carga. Desta vez, descobri que o servidor era capaz de lidar com muito mais conexões simultâneas sem tempo de resposta reduzido. A média de carga também foi alta em 7. Então, parece que o tomcat não está usando a CPU eficientemente quando configurado com apenas uma instância (eu até tentei criar vários conectores em portas diferentes).

Parece que precisamos executar várias instâncias do tomcat em uma única máquina para extrair o máximo de desempenho. Fazer essa configuração não é ideal, pois criar várias instâncias em um pool de servidores e mantê-la será uma tarefa difícil.

A minha pergunta é que é possível configurar o tomcat de tal forma que uma única instância use tanto CPU quanto possível com uma alta média de carga?

Por favor, comente se você tem alguma dúvida sobre a configuração.

Eu apreciaria qualquer ajuda / ponteiro.

    
por Mir 29.09.2011 / 22:40

1 resposta

2

Parece-me que o aplicativo tem o gargalo. Eu acho que use apenas um thread para converter os pdfs.

O Tomcat executa servlets em paralelo, mas quando os servlets chamam uma biblioteca de um encadeamento, seu aplicativo da Web se torna um aplicativo de um encadeamento. Você precisa modificar seu aplicativo para usar mais threads.

Uma solução não muito boa está executando tantas instâncias do Tomcat quanto o núcleo que você possui e fazendo o balanceamento de carga das solicitações para elas (como você mencionou na pergunta).

    
por 30.09.2011 / 00:50