Nous avons un serveur web apache devant Tomcat hébergé sur EC2, le type d'instance est extra large avec 34GB de mémoire.
Notre application traite avec de nombreux services Web externes et nous avons un service Web externe très mauvais qui prend presque 300 secondes pour répondre aux demandes pendant les heures de pointe.
Pendant les heures de pointe, le serveur s'étouffe à environ 300 processus httpd. ps -ef | grep httpd | wc -l =300
J'ai cherché sur Google et trouvé de nombreuses suggestions mais rien ne semble fonctionner. Voici quelques configurations que j'ai faites et qui sont directement tirées de ressources en ligne.
J'ai augmenté les limites de connexion maximale et de clients maximaux dans apache et tomcat. Voici les détails de la configuration :
//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
J'ai essayé de nombreuses suggestions mais en vain comment résoudre ce problème ? Je suis sûr que le serveur m2xlarge devrait servir plus de requêtes que 300, il se peut que je me trompe dans ma configuration
Le serveur ne s'arrête que pendant les heures de pointe et lorsqu'il y a 300 demandes simultanées qui attendent la réponse du service Web [avec un retard de 300 secondes].
Je surveillais les connexions tcp avec netstat.
J'ai trouvé environ 1000 connexions dans l'état TIME_WAIT, aucune idée de ce que cela signifie en termes de performance, je suis sûr que cela doit ajouter au problème.
Sortie du 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
En outre, aux heures de pointe, il y a environ 10-15k connexions tcp au serveur membase [local].
QUELQUES ERREURS DANS LE LOG MODJK, j'espère que cela va éclairer le problème
[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
//Solved
Merci à tous pour vos précieuses suggestions J'ai oublié les paramètres maxThreads pour le connecteur AJP 1.3 Maintenant tout semble sous contrôle.
Je commencerais aussi à regarder les serveurs basés sur le pair comme nginx.