Abbiamo un server web apache di fronte a Tomcat ospitato su EC2, il tipo di istanza è molto grande con una memoria di 34 GB.
La nostra applicazione si occupa di molti servizi Web esterni e abbiamo un servizio Web esterno molto scadente che impiega quasi 300 secondi per rispondere alle richieste nelle ore di punta.
Nelle ore di punta il server si blocca a circa 300 processi httpd. ps -ef | grep httpd | wc -l = 300
Ho cercato su Google e ho trovato numerosi suggerimenti, ma nulla sembra funzionare. Di seguito sono riportate alcune configurazioni che ho preso direttamente dalle risorse online.
Ho aumentato i limiti di connessione massima e numero massimo di client sia in Apache che in Tomcat. ecco i dettagli di configurazione:
// apache
<IfModule prefork.c>
StartServers 100
MinSpareServers 10
MaxSpareServers 10
ServerLimit 50000
MaxClients 50000
MaxRequestsPerChild 2000
</IfModule>
// Tomcat
<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
Ho provato numerosi suggerimenti ma invano .. come risolvere questo problema? Sono sicuro che il server m2xlarge dovrebbe servire più richieste di 300, probabilmente potrei sbagliare con la mia configurazione.
Il server si blocca solo durante le ore di punta e quando ci sono 300 richieste simultanee in attesa che il servizio web [300 secondi in ritardo] risponda.
Stavo solo monitorando le connessioni tcp con netstat
ho trovato circa 1000 connessioni nello stato TIME_WAIT, non ho idea di cosa significherebbe in termini di prestazioni, sono sicuro che si deve aggiungere al problema.
Uscita di 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
Anche nelle ore di punta ci sono circa 10-15k tcp di connessioni al server membase [locale]
ALCUNI ERRORI IN MODJK LOG, spero che questo faccia luce sulla questione.
[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
// Risolto
grazie a tutti per i vostri preziosi suggerimenti .. Ho perso le impostazioni di maxThreads per il connettore AJP 1.3 .. Ora tutto sembra sotto controllo.
Vorrei anche iniziare a guardare anche i server basati come nginx.
top
aspetto ha l'output di questi tempi? Che ne dici free -m
? E infine iostat
?