Wie kann verhindert werden, dass langsam reagierende Tomcat Apache langsam reagiert?

7

Ich habe eine Seite, die hauptsächlich aus statischen HTML-Seiten mit gelegentlichen Ajax-Anfragen besteht. Die Site läuft auf Apache, Ajax wird von Tomcat verwaltet.

Wenn Tomcat nur langsam reagiert (Java kann aus irgendeinem Grund keine Verbindung zu einem Datenbankserver herstellen oder nur eine lange Zeit zum Verarbeiten einer Anfrage benötigen), wird die gesamte Site heruntergefahren: Das Laden aller statischen HTML-Seiten dauert sehr lange (dasselbe) mit Bildern, CSS, JS).

Wenn ich den Tomcat nur manuell stoppe, funktioniert immer noch alles einwandfrei - die Site ist schnell und reaktionsschnell, nur Ajax-Anfragen funktionieren nicht.

Wie kann ich dafür sorgen, dass Tomcat langsam reagiert und nicht alle Apache-Ressourcen verwendet, sodass statische Seiten immer funktionieren, unabhängig davon, was mit Tomcat geschieht? Responsive HTML-Seiten sind in meinem Fall viel wichtiger als nicht Ajax zu funktionieren.

httpd.conf :

Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15

<IfModule prefork.c>
StartServers       16 
MinSpareServers   10 
MaxSpareServers   40
ServerLimit      512 
MaxClients       512
MaxRequestsPerChild  4000
</IfModule>

Arbeiter.Eigenschaften

worker.worker1.port=8888
worker.worker1.reply_timeout=120000
worker.worker1.socket_timeout=150000

server.xml

 <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8081" />

<Connector port="8888" scheme="http" protocol="AJP/1.3" redirectPort="8889" minSpareThreads="100"  maxThreads="400" connectionTimeout="20000" acceptorThreadCount="2"/>
serg
quelle
Ich gehe davon aus, dass Sie Ihre Apache- und Tomecat-Instanzen auf demselben Server ausführen. Stimmt das?
Jesse Webb
@ Jesse Ja, beide auf demselben Server und ich würde es vorziehen, wenn es so bleibt.
Serg
Was ist Ihre Apache-Konfiguration: Welches Worker-Modell, wie viele Threads? Timeouts für mod_jk gesetzt? Übrigens: Diese Frage passt besser zu ServerFault.com
Robert
... und natürlich die Tomcat-Konfiguration ... und geben Sie auch einige Details zu der Situation an, in der das Problem auftritt: Steht es unter schwerer Last? Oder passiert es auch, wenn nur jede Anfrage an Tomcat lange dauert? dauert es auch lange, eine Anfrage zu stellen, sagen wir mal eine CSS- oder statische Bilddatei allein?
@ Robert Bitte beachten Sie die beigefügte Konfiguration.
Serg

Antworten:

8

Wenn Tomcat aus irgendeinem Grund Ihre Ajax-Anfragen nicht schnell bearbeitet, reduziert dies die Anzahl der Anfragen, die Ihr Apache verarbeiten kann. Tomcat ist so konfiguriert, dass 400 Anforderungen parallel verarbeitet werden, und es gibt auch eine Standardeinstellung acceptCountvon 100. Ihr Tomcat kann also 500 Anforderungen verarbeiten - zumindest: JVM- und plattformabhängig können noch mehr Verbindungsanforderungen in die Warteschlange gestellt werden.

worker.worker1.reply_timeout=120000
worker.worker1.socket_timeout=150000

.. sagt mod_jk, dass es ungefähr 1,7 Tage (socket_timeout in Sekunden) auf Socket-Operationen und 2 Minuten auf einzelne Netzwerkpakete von Tomcat warten soll . Sie sollten diese Werte anpassen, damit mod_jk so früh wie möglich einen Fehler zurückgibt, wenn tomcat langsam ist.

Nehmen wir an, Ihre Ajax-Anforderungen werden normalerweise innerhalb einer Sekunde mit Ausreißern von bis zu zwei Sekunden verarbeitet. Nach der Bearbeitung wird die Antwort sofort zurückgesendet. Dann darf man worker.worker1.reply_timeout=2500nur noch eine halbe Sekunde setzen. socket_timeoutkann sogar weggelassen werden, da es sich nur um einen groben Wert handelt. socket_connect_timeout, das definiert, wie lange es dauern kann, bis eine Verbindung von apache / mod_jk zu tomcat hergestellt ist, sollte zu worker.properties hinzugefügt und auf einen sehr niedrigen Wert gesetzt werden, z. B. 100. da beide auf demselben Server sitzen. Weitere Informationen finden Sie unter Die Apache Tomcat Connector-Referenz .

Jede Anfrage, die von Apache an Tomcat geht, zählt für das, was Sie MaxClientsin httpd.conf konfiguriert haben. Je mehr Anfragen in Tomcat stecken bleiben, desto weniger kann von Apache für statischen Inhalt verarbeitet werden. Wenn Sie Tomcat in dieser Situation herunterfahren, wird statischer Inhalt schnell wieder bereitgestellt, da Ressourcen für die Anforderungsverarbeitung in mod_jk und apache frei werden.

Sie haben prefork.cund worker.cin httpd.conf gleichzeitig konfiguriert . Ich denke, prefork.cist der aktive, wie MaxClientsauf 512 eingestellt und dies würde Ihren Beobachtungen und meiner Interpretation entsprechen .. ;-)

Es kann sehr hilfreich sein, mod_jk zu sagen, dass er lange laufende Anfragen an Tomcat früher aufgeben soll. Sie sollten jedoch auch darüber nachdenken, die Anzahl der von apache ( MaxClients) verarbeiteten Client-Anfragen und die Anzahl der <connector maxThreads=...parallel von Tomcat verarbeiteten Anfragen ( ) anzupassen . Diese Zahlen müssen auf das abgestimmt werden, was während des normalen Betriebs passiert. Eine gewisse Verfolgung der Seitenladevorgänge kann hilfreich sein, um festzustellen, in welchem ​​Verhältnis diese Werte sein sollten. Der absolute Wert hängt von Ihren Serverspezifikationen, der Netzwerksituation, der Anzahl der Clients usw. ab.

Wenn die absolute Anzahl möglicher paralleler Anforderungen zu niedrig ist, beschweren sich Benutzer über langsame Seitenladevorgänge, während Ihr Server nicht an die Kapazität gewöhnt ist. Wenn es viel zu hoch ist, verbraucht es mehr Speicher als wirklich benötigt, verlangsamt sich sogar und erholt sich nicht schnell von Problemen mit Subsystemen - z. B. der Datenbank. Wenn Apache weitaus mehr Anfragen an Tomcat sendet, als es rechtzeitig verarbeiten würde, werden einige von ihnen eine Zeitüberschreitung feststellen, während andere in akzeptabler Zeit verarbeitet werden. Es ist keine schlechte Idee, mit ähnlichen Werten bei Apache und Tomcat zu beginnen, solange die Timeout-Einstellungen sicherstellen, dass ein langsamer oder nicht reagierender Tomcat kein Mühlstein am Hals von Apache ist.

Arne
quelle
Gute Antwort, aber wenn Sie bitte auch bessere Parameterwerte empfehlen oder erklären könnten, wie Parameter (ohne zu raten) eingestellt werden, wäre dies perfekt. Was soll ich zum Beispiel tun - MaxClientsauf 1000 erhöhen oder Tomcat-Threads auf 100 reduzieren? Welche Symptome deuten darauf hin, dass ein Parameterwert zu niedrig oder zu hoch ist? (Was würde zum Beispiel passieren, wenn Apache-Clients auf 1 Mil eingestellt sind?)
Serg
Und Sie hatten Recht mit Prefork - es ist das, was aktiv ist.
Serg
Ich habe zwei Absätze zum Finden von Werten hinzugefügt.
Arne
"Beachten Sie, dass socket_timeout in Sekunden und socket_connect_timeout in Millisekunden ist", haben Sie ein socket_timeout von fast 2 Tagen ...
mikejonesey
0

Sie scheinen nur einen Arbeiter definiert zu haben. Das bedeutet, dass Apache nur über diese eine Instanz mit Tomcat kommunizieren kann. Eine normale JK-Konfiguration enthält 8-16 Worker. Schauen Sie sich die Standard-JK-Konfigurationsdatei an, die Sie herunterladen können.

user207421
quelle
Laut worker.properties connection_pool_size sollte die Konfiguration nicht mit Werten über 1 für Apache 2.x und 1.3.x verwendet werden. Dies ist der Standardwert, und der tatsächliche Wert wird zur Laufzeit erkannt.
Arne
@Arne Ich verstehe die Relevanz nicht. Er hat die Größe des Verbindungspools überhaupt nicht definiert.
user207421
Ich dachte, Sie haben es verwirrt, da die Anzahl der Arbeiter (Tomcat-Instanzen) hier offensichtlich eins ist.
Arne
@Aren, ja, das habe ich gesagt. Ich weiß nicht, wovon Sie ehrlich sprechen.
user207421
Die Anzahl der Arbeiter muss hier eins sein, da es offensichtlich nur einen Kater gibt. Ich dachte, Sie haben das mit der connection_pool_size verwechselt. Aber das sollte auch einer sein. Siehe den Link zur Konfiguration, den allerersten Satz und die Definition des Parameters connection_pool_size.
Arne