web-dev-qa-db-fra.com

Comment éviter de répondre lentement Tomcat de rendre Apache lentement à répondre?

J'ai un site qui consiste principalement à des pages HTML statiques avec des demandes AJAX occasionnelles. Le site fonctionne sur Apache, Ajax est géré par Tomcat.

Si Tomcat devient lent à réagir (Java ne peut pas se connecter à un serveur de base de données ou simplement prendre beaucoup de temps pour traiter une demande pour une raison quelconque) - elle apporte tout le site en bas: toutes les pages HTML statiques prennent très longtemps de temps à charger (même avec des images, CSS, JS).

Maintenant, si j'arrête manuellement le Tomcat tout fonctionne toujours bien - le site est rapide et réactif, juste des demandes Ajax ne fonctionnent pas.

Comment puis-je faire une réponse lente Tomcat pour ne pas utiliser toutes les ressources Apache, de sorte que les pages statiques fonctionnent toujours, peu importe ce qui se passe avec Tomcat? Les pages HTML réactives sont beaucoup plus importantes que de ne pas travailler Ajax dans mon cas.

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>

travailleurs.properties

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"/>
7
serg

si, pour une raison quelconque, Tomcat ne gère pas vos demandes Ajax rapidement, cela réduit le nombre de demandes que votre Apache peut gérer. Tomcat est configuré pour gérer 400 demandes en parallèle, et il existe également une valeur par défaut acceptCount de 100. Donc, votre Tomcat est donc capable de manger 500 demandes - au moins: JVM et la plate-forme dépendent encore plus de demande de connexion en file d'attente .

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

..Tells mod_jk pour attendre environ 1,7 jours (socket_timeout est en secondes) pour les opérations de prise et 2 minutes pour les paquets de réseaux simples de Tomcat. Vous devez ajuster ces valeurs, pour laisser Mod_JK renvoyer une erreur le plus tôt possible si Tomcat est lent.

Supposons que vos demandes Ajax soient typiquement traitées dans une seconde avec des valeurs aberrantes jusqu'à deux secondes. Après avoir été traitée, la réponse est renvoyée à la fois. Ensuite, on peut définir worker.worker1.reply_timeout=2500, seulement une demi-seconde de plus. socket_timeout peut même être omis, car c'est juste une valeur approximative. socket_connect_timeout, qui définit la durée combien de temps il peut prendre pour se connecter à Apache/Mod_JK à Tomcat doit être ajouté au travailleur.properties et défini sur une très faible valeur, par exemple. 100. Comme si vous êtes assis sur le même serveur. Voir le connecteur Apache Tomcat -Reference Pour plus de détails.

Chaque demande, qui va d'Apache à Tomcat compte pour ce que vous avez configuré avec MaxClientsin httpd.conf. Plus les demandes sont bloquées dans Tomcat, moins peut être traitée par Apache pour le contenu statique. Si vous arrêtez Tomcat dans cette situation, le contenu statique est remis à nouveau rapidement, car il libère des ressources pour le traitement de la demande dans mod_JK et Apache.

Vous avez configuré prefork.cet worker.c Dans httpd.conf en même temps. J'imagine prefork.c est l'actif, comme MaxClients est défini sur 512 et cela correspondrait à vos observations et à mon interprétation .. ;-)

Dire mod_jk d'abandonner plus tôt sur les demandes de course à pied à Tomcat pourrait vous aider beaucoup, mais vous devez également penser à ajuster le nombre de demandes de client traitées par Apache (MaxClients) et le nombre de demandes que Tomcat traite (<connector maxThreads=...) en parallèle. Ces chiffres doivent être équilibrés sur ce qui se passe pendant les opérations normales. Certains traçages des charges de page peuvent être utiles pour voir dans quelle proportion ces valeurs devraient être utiles. La valeur absolue dépend de vos spécifications de serveurs, de la situation du réseau, du nombre de clients, etc.

Si le nombre absolu de requêtes parallèles possibles est faible, les utilisateurs se plaindront des charges de page lente, tandis que vous ne verrez pas votre serveur utilisé à la capacité. S'il est loin d'être élevé, il utilisera plus de mémoire que si nécessaire, même ralentissez et ne récupérera pas rapidement des problèmes avec des sous-systèmes - par exemple. la base de données. Si Apache envoie beaucoup plus de demandes à Tomcat car cela traiterait à temps, vous en verriez une partie de l'emploi, tandis que d'autres sont traitées dans un délai acceptable. À partir de valeurs similaires chez Apache et Tomcat, aucune mauvaise idée, tant que les paramètres de délai d'attente s'assurent qu'un tomcat lent ou insensible n'est pas une meule sur le cou Apache.

8
Arne