Wie kann ich die optimale Größe der maxThreads meines NIO / APR-Connectors für Tomcat ermitteln?

7

Ich verwende NIO / APR Connector für Tomcat7.

Z.B

<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. Wie kann ich die optimale Größe der maxThreads meines NIO / APR-Connectors für Tomcat ermitteln?

  2. Was ist ein guter Startwert für maxThreads?

konfile
quelle

Antworten:

7

Die OOTB-Konfiguration beträgt in der Regel 150 bis 200 Akzeptanz-Threads für jeden Connector. Diese Standardeinstellung ist für Anwendungen mit mittlerer Last / Komplexität auf „durchschnittlicher“ Hardware vorgesehen.

Als Faustregel gilt, dass eine leichte, leistungsstarke Anwendung maximal 150 (Akzeptier-) Threads pro CPU-Kern verwenden sollte (also insgesamt 600 auf einer 4-Kern-Box). Eine konservativere Einstellung für schwerere Anwendungen wäre 300 Akzeptieren von Threads. Ich würde erwarten, dass die meisten Anforderungen irgendwo in der Mitte liegen (dies erfordert jedoch eine Analyse), aber dies ist sehr situativ - siehe @ zagrimsans Antwort.

Offensichtlich hat HTTPS einen etwas höheren Overhead, daher besteht die Standardpraxis darin, die Anzahl der akzeptierten Threads entsprechend zu reduzieren.

Die Verwendung des APR / nativen Connectors kann den Durchsatz verbessern, aber der begrenzende Faktor ist normalerweise das Anwendungsprofil, also wiederum keine magischen Zahlen.

Die Gefahr der Verwendung einer zu hohen Thread-Einstellung besteht darin, dass der Server "terminal ausgelastet" wird. Wenn so viel Zeit für die Verwaltung von Threads und Anwendungsanforderungen aufgewendet wird, leidet alles andere (GC ist insbesondere ein Symptom). Es scheint nicht intuitiv zu sein, aber im Allgemeinen ist weniger mehr.

Ein ausgelasteter Server mit der korrekt konfigurierten Thread-Anzahl wird unter starker Last ordnungsgemäß beeinträchtigt. Zu hoch und es wird umfallen!

Nun gibt es eine Reihe verwandter Einstellungen (Anzahl akzeptieren, minimale Threads, Warten usw.), die ebenfalls angepasst werden müssen, aber das geht über den Rahmen dieser Antwort hinaus.

Michael
quelle
-2

Die Antwort hängt von der Last ab, die Sie voraussichtlich bedienen werden.

Das Zitieren der akzeptierten Antwort aus einem Thread von StackOverflow, der, obwohl es sich um ein Setup mit Tomcat und Apache handelt, auch hier gilt:

Sie sollten die Arbeitslast berücksichtigen, die die Server möglicherweise erhalten.

Der wichtigste Faktor könnte die Anzahl gleichzeitig verbundener Clients zu Spitzenzeiten sein. Versuchen Sie es zu bestimmen und passen Sie Ihre Einstellungen so an, dass:

  • Es gibt genügend [...] Verarbeitungsthreads, die keine neuen Threads erzeugen müssen, wenn der Server stark ausgelastet ist
  • Es gibt nicht viel mehr Verarbeitungsthreads auf den Servern als benötigt, da sie Ressourcen verschwenden würden.

[...]

Stellen Sie sich zum Beispiel eine Anwendung vor, bei der Sie ca. 300 neue Anforderungen pro Sekunde haben. Jede Anfrage benötigt durchschnittlich 2,5 Sekunden. Dies bedeutet, dass Sie zu einem bestimmten Zeitpunkt ~ 750 Anfragen haben, die gleichzeitig bearbeitet werden müssen. In dieser Situation möchten Sie Ihre Server wahrscheinlich so optimieren, dass sie beim Start ~ 750 Verarbeitungsthreads haben, und Sie möchten möglicherweise maximal ~ 1000 Verarbeitungsthreads hinzufügen, um extrem hohe Lasten zu bewältigen.

Zagrimsan
quelle