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"/>
quelle
Antworten:
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
acceptCount
von 100. Ihr Tomcat kann also 500 Anforderungen verarbeiten - zumindest: JVM- und plattformabhängig können noch mehr Verbindungsanforderungen in die Warteschlange gestellt werden... 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=2500
nur noch eine halbe Sekunde setzen.socket_timeout
kann 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
MaxClients
in 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.c
undworker.c
in httpd.conf gleichzeitig konfiguriert . Ich denke,prefork.c
ist der aktive, wieMaxClients
auf 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.
quelle
MaxClients
auf 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?)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.
quelle
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.