Pergunta

Estou desenvolvendo um serviço web RESTful que é executado como um servlet (usando o bloqueio IO) em Jetty. Descobrir a configuração ideal para tópicos max parece difícil.

Existe uma fórmula pesquisados ??para decidir o número máximo de threads de algumas características facilmente mensuráveis ??do resto da configuração?

Foi útil?

Solução

Muito simples e primitivo:

= max_number_of_threads number_of_CPUs * C

Onde C depende de outros fatores de sua aplicação: -)

Pergunte a si mesmo as seguintes questões:

  • Será que a sua aplicação seja intensivo da CPU (inferior C) ou gastar mais tempo de espera para um terceiro sistemas (maior C)?
  • Você precisa de mais rápido tempo de resposta (menor C) ou ser capaz de servir muitos usuários múltiplos de uma só vez, mesmo se cada pedido leva mais tempo (maior C).

Geralmente I definida C bastante baixo, por exemplo 2 -. 10

Outras dicas

Não, não é. Mantê-lo número de segmentos limitados e sob controle, para não exceder os recursos do sistema, o limite de Java é geralmente em torno de 100-200 tópicos ao vivo.

Uma boa forma de fazer isso é usando Executores de java.util.concurrent .

Eu entendo que no momento em que esta questão foi perguntado, Servlet 3.0 não foi para fora. Mas eu pensei que eu deveria gravar, nesta questão, a possibilidade de fazer o processamento assíncrono no recipiente Servlet usando Servlet 3.0. Isso pode ajudar alguém que se depara com esta questão. Escusado será dizer que, há recursos suficientes para Servlet 3.0 que apontam que os principais tópicos de servlet são agora menos sob pressão! E Jetty tem homólogos assíncronas, no caso de um não querer usar Servlet API 3.0, per se.

A resposta depende do número máximo de conexões simultâneas que você espera de manusear. Você deve permitir que o maior número de tópicos como conexões que você espera.

andreasmk2 está incorreta sobre o número de threads. Eu executar aplicativos com threads de 1000 e não tinha problema com os recursos do sistema; é claro que depende das especificidades do seu sistema. Você iria correr em um sistema limitação, não um Java limitação.

O meu problema é que eu não sei como formar uma expectativa razoável para o número de conexões simultâneas. Presumivelmente em alguns ponto é melhor recusar novas conexões do que deixar tudo mais lento, pois há também fazer pedidos que estão sendo atendidas.

cargas de trabalho realistas são difíceis de simular, que é por isso que eu estou procurando uma fórmula já pesquisou por outra pessoa.

(O óbvio limite superior é tamanho da pilha máximo dividido pela quantidade mínima de memória necessária para atender a um pedido, mas mesmo isso é difícil de medir em um ambiente com um coletor de lixo.)

Graças. Eu li isso como não haver qualquer fórmula fácil. : - (

(Meu aplicativo é um validador HTML5. Às vezes, ele está esperando claramente em servidores externos. No entanto, é difícil identificar quando é realmente quer por sua própria ou através do coletor de lixo no limite da CPU.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top