Wir haben einen Apache-Webserver vor Tomcat, der auf EC2 gehostet wird. Der Instanztyp ist mit 34 GB Speicher besonders groß.
Unsere Anwendung beschäftigt sich mit vielen externen Webservices und wir haben einen sehr miesen externen Webservice, der fast 300 Sekunden benötigt, um auf Anfragen während der Stoßzeiten zu antworten.
Während der Stoßzeiten drosselt der Server bei nur etwa 300 httpd-Prozessen. ps -ef | grep httpd | wc-l = 300
Ich habe gegoogelt und zahlreiche Vorschläge gefunden, aber nichts scheint zu funktionieren. Im Folgenden sind einige Einstellungen aufgeführt, die ich vorgenommen habe und die direkt aus Online-Ressourcen entnommen wurden.
Ich habe die Grenzen von max connection und max clients in Apache und Tomcat erhöht. Hier sind die Konfigurationsdetails:
//Apache
<IfModule prefork.c>
StartServers 100
MinSpareServers 10
MaxSpareServers 10
ServerLimit 50000
MaxClients 50000
MaxRequestsPerChild 2000
</IfModule>
//Kater
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="600000"
redirectPort="8443"
enableLookups="false" maxThreads="1500"
compressableMimeType="text/html,text/xml,text/plain,text/css,application/x-javascript,text/vnd.wap.wml,text/vnd.wap.wmlscript,application/xhtml+xml,application/xml-dtd,application/xslt+xml"
compression="on"/>
//Sysctl.conf
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
fs.file-max = 5049800
vm.min_free_kbytes = 204800
vm.page-cluster = 20
vm.swappiness = 90
net.ipv4.tcp_rfc1337=1
net.ipv4.tcp_max_orphans = 65536
net.ipv4.ip_local_port_range = 5000 65000
net.core.somaxconn = 1024
Ich habe zahlreiche Vorschläge ausprobiert, aber vergebens. Wie kann ich das beheben? Ich bin sicher, m2xlarge Server sollte mehr Anfragen als 300 bedienen, wahrscheinlich kann ich mit meiner Konfiguration etwas falsch machen.
Der Server drosselt nur zu Spitzenzeiten und wenn 300 gleichzeitige Anforderungen auf die Antwort des Webservices [300 Sekunden verzögert] warten.
Ich habe gerade die TCP-Verbindungen mit netstat überwacht
Ich habe ungefähr 1000 Verbindungen im TIME_WAIT-Status gefunden, keine Ahnung, was dies für die Leistung bedeuten würde. Ich bin mir sicher, dass es das Problem noch verschlimmert.
Ausgabe von TOP
8902 root 25 0 19.6g 3.0g 12m S 3.3 8.8 13:35.77 java
24907 membase 25 0 753m 634m 2528 S 2.7 1.8 285:18.88 beam.smp
24999 membase 15 0 266m 121m 3160 S 0.7 0.3 51:30.37 memcached
27578 apache 15 0 230m 6300 1536 S 0.7 0.0 0:00.03 httpd
28551 root 15 0 11124 1492 892 R 0.3 0.0 0:00.25 top
Output of free -m
total used free shared buffers cached
35007 8470 26536 0 1 61
8407 26599
15999 15 15984
output of iostat
avg-cpu: %user %nice %system %iowait %steal %idle
26.21 0.00 0.48 0.13 0.02 73.15
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda1 14.36 4.77 329.37 9005402 622367592
sdb 0.00 0.00 0.00 1210 48
Auch in der Spitzenzeit gibt es ca. 10-15k TCP-Verbindungen zum membase-Server [local].
EINIGE FEHLER IM MODJK-PROTOKOLL, ich hoffe, das wirft ein Licht auf das Problem.
[Wed Jul 11 14:39:10.853 2012] [8365:46912560456400] [error] ajp_send_request::jk_ajp_common.c (1630): (tom2) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=110)
[Wed Jul 11 14:39:18.627 2012] [8322:46912560456400] [error] ajp_send_request::jk_ajp_common.c (1630): (tom2) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=110)
[Wed Jul 11 14:39:21.358 2012] [8351:46912560456400] [error] ajp_get_reply::jk_ajp_common.c (2118): (tom1) Tomcat is down or refused connection. No response has been sent to the client (yet)
[Wed Jul 11 14:39:22.640 2012] [8348:46912560456400] [error] ajp_get_reply::jk_ajp_common.c (2118): (tom1) Tomcat is down or refused connection. No response has been sent to the client (yet)
~
Worker.properties
workers.tomcat_home=/usr/local/tomcat/
worker.list=loadbalancer
worker.tom1.port=8009
worker.tom1.host=localhost
worker.tom1.type=ajp13
worker.tom1.socket_keepalive=True
worker.tom1.connection_pool_timeout=600
worker.tom2.port=8109
worker.tom2.host=localhost
worker.tom2.type=ajp13
worker.tom2.socket_keepalive=True
worker.tom2.connection_pool_timeout=600
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tom1,tom2
worker.loadbalancer.sticky_session=True
worker.tom1.lbfactor=1
worker.tom1.socket_timeout=600
worker.tom2.lbfactor=1
worker.tom2.socket_timeout=600
// Gelöst
Vielen Dank für Ihre wertvollen Vorschläge. Ich habe die maxThreads-Einstellungen für den AJP 1.3-Anschluss verpasst. Jetzt scheint alles unter Kontrolle zu sein.
Ich würde auch anfangen, auch basierende Server wie Nginx zu suchen.
top
in diesen Zeiten aus? Wie wäre es free -m
? Und zuletzt iostat
?