Tomcat - maxThreads vs maxConnections

82

W Tomcat, server.xmlco jest maxThreadsversusmaxConnections

Rozumiem, że maxConnectionsjest to liczba otwartych połączeń z serwerem

A maxThreadsto maksymalna liczba wątków przetwarzających żądania

Ale jak te dwa parametry konfiguracyjne współpracują ze sobą, oczywiście nie ustawisz maxConnectionsna 1000 i maxThreadsna 10

Jaka jest zależność między tymi dwoma parametrami konfiguracyjnymi?

<Connector 
    port="8443" 
    protocol="org.apache.coyote.http11.Http11Protocol"
    maxThreads="250" 
    SSLEnabled="true" 
    scheme="https" secure="true"
    clientAuth="false" 
    sslProtocol="TLS" 
    connectiontimeout="20000"
/>
JavaSheriff
źródło

Odpowiedzi:

116

Tomcat może pracować w 2 trybach:

  • BIO - blokowanie I / O (jeden wątek na połączenie)
  • NIO - nieblokujące I / O (dużo więcej połączeń niż wątków)

Tomcat 7 jest domyślnie BIO , chociaż wydaje się, że konsensus brzmi „nie używaj Bio, ponieważ Nio jest lepszy pod każdym względem”. Ustawia się to za pomocą protocolparametru w server.xmlpliku.

  • BIO będzie HTTP/1.1luborg.apache.coyote.http11.Http11Protocol
  • NIO będzie org.apache.coyote.http11.Http11NioProtocol

Jeśli używasz BIO, to uważam, że powinny być mniej więcej takie same.

Jeśli używasz NIO, to faktycznie "maxConnections = 1000" i "maxThreads = 10" mogą być nawet rozsądne. Wartości domyślne to maxConnections = 10 000 i maxThreads = 200. Dzięki NIO każdy wątek może obsługiwać dowolną liczbę połączeń, przełączając się tam iz powrotem, ale zachowując połączenie, więc nie musisz wykonywać wszystkich zwykłych uzgadniania, co jest szczególnie czasochłonne w przypadku HTTPS, ale nawet problem z HTTP. Możesz dostosować parametr „keepAlive”, aby utrzymywać połączenia na dłużej, co powinno przyspieszyć wszystko.

Tim Cooper
źródło
Wydaje się, że domyślnym protokołem jest „HTTP / 1.1”, który używa mechanizmu automatycznego przełączania ( tomcat.apache.org/tomcat-7.0-doc/config/http.html ) ”… aby wybrać blokujący łącznik oparty na języku Java lub Łącznik APR / natywny. Jeśli zmienne środowiskowe PATH (Windows) lub LD_LIBRARY_PATH (w większości systemów unix) zawierają natywną bibliotekę Tomcat, zostanie użyty łącznik APR / natywny. Jeśli nie można znaleźć biblioteki natywnej, blokujący łącznik oparty na języku Java zostanie użyty ”
alpa
13

Z dokumentacji Tomcat , w przypadku blokowania we / wy (BIO), domyślną wartością maxConnectionsjest wartość, maxThreadschyba że używany jest Executor (pula wątków), w którym to przypadku zostanie użyta wartość „maxThreads” z Executora. W przypadku nieblokujących operacji we / wy nie wydaje się być zależny od maxThreads.

Swapnil
źródło
7
Nie jestem przeciwnikiem, ale myślę, że nie odpowiedziałeś na pytanie. Po prostu wyjaśniłeś, jakie są wartości domyślne, nie ucząc pytającego pojęć, a pytanie dotyczy pojęć.
Tim Cooper
2
Rozumiem. Przyjąłem pytanie jako pytanie o relację między nimi, a nie o to, co tak naprawdę oznaczają.
Swapnil
1
Ta odpowiedź była również przydatna, ponieważ wyjaśnia, że ​​nawet z BIO maxConnections może być większe niż maxThreads (myślę, że to nowość w Tomcat 7)
Ivan