Como posso determinar o tamanho ideal dos maxThreads do meu conector NIO / APR para o Tomcat?

5

Estou usando o conector NIO / APR para o Tomcat7.

Por exemplo,

<Connector port="8080" 
        protocol="org.apache.coyote.http11.Http11AprProtocol" 
        connectionTimeout="3000"
        redirectPort="8443" 
        URIEncoding="UTF-8" 
        maxPostSize="0"
        maxThreads="200"
        enableLookups="false"
        disableUploadTimeout="false"
        maxKeepAliveRequests="-1"
        useBodyEncodingForURI="true"
        compression="on"
        compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"   
        />
  1. Como posso determinar o tamanho ideal dos maxThreads do meu NIO / APR Connector para Tomcat?

  2. Qual é um bom valor inicial para maxThreads?

por confile 16.08.2013 / 05:21

2 respostas

4

A configuração OOTB é tipicamente de 150 a 200 threads de aceitação total para cada conector. Esse padrão é destinado a aplicativos de carga / complexidade média em hardware "médio".

Como regra geral, um aplicativo leve e de alto desempenho deve usar um máximo de 150 (aceitar) encadeamentos por núcleo da CPU (portanto, um total de 600 em uma caixa de 4 núcleos). Uma configuração mais conservadora, para aplicativos mais pesados, seria de 300 threads aceitos. Eu esperaria que a maioria dos requisitos estivesse em algum lugar no meio (mas isso precisaria de algumas análises), mas isso é altamente situacional - veja a resposta de @ zagrimsan.

Obviamente, o HTTPS tem uma sobrecarga um pouco maior, portanto, a prática padrão é reduzir o número de threads aceitos de acordo.

O uso do conector nativo / APR pode melhorar o rendimento, mas o fator limitante geralmente é o perfil do aplicativo, portanto, novamente, não há números mágicos.

O perigo de usar uma configuração de thread muito alta é que o servidor pode ficar “ocupado terminalmente” - onde tanto tempo gasta gerenciando threads e demandas de aplicativos, tudo o mais sofre (GC sendo notavelmente um sintoma). Parece contra-intuitivo, mas geralmente menos é mais.

Um servidor ocupado com a contagem de linha configurada corretamente será degradado normalmente sob carga pesada. Muito alto e vai cair!

Agora, há várias configurações relacionadas (contagem de aceitação, threads mín., espera etc.) que também precisam ser ajustadas, mas isso está além do escopo dessa resposta.

    
por 28.05.2015 / 15:14
-1

A resposta depende da carga que você espera veicular.

Citando a resposta aceita do um thread do StackOverflow que, embora Ele fala sobre uma configuração com o Tomcat e Apache, aplica-se aqui também:

You should consider the workload the servers might get.

The most important factor might be the number of simultaneously connected clients at peak times. Try to determine it and tune your settings in a way where:

  • there are enough processing threads [...] that they don't need to spawn new threads when the server is heavily loaded
  • there are not way more processing threads in the servers than needed as they would waste resources.

[...]

For example consider an application where you have ~300 new requests/second. Each request requires on average 2.5 seconds to serve. It means that at any given time you have ~750 requests that need to be handled simultaneously. In this situation you probably want to tune your servers so that they have ~750 processing threads at startup and you might want to add something like ~1000 processing threads at maximum to handle extremely high loads.

    
por 19.08.2013 / 14:41