Question

J'ai une application Web écrite avec CherryPy, qui est exécutée localement sur 127.0.0.1:4321 . Nous utilisons mod-rewrite et mod-proxy pour qu'Apache agisse comme un proxy inverse; Apache gère également notre cryptage SSL et peut éventuellement être utilisé pour transférer tout notre contenu statique.

Tout cela fonctionne parfaitement pour les petites charges de travail. Cependant, j’ai récemment utilisé urllib2 pour écrire un script de test de contrainte qui simule une charge de travail de 100 clients. Après un certain temps, chaque client reçoit une erreur 503 d'Apache, indiquant qu'Apache ne peut pas se connecter à 127.0.0.1:4321 . CherryPy fonctionne correctement, mais mon journal des erreurs Apache contient des lignes telles que:

[jeu. 02 oct. 12:55:44 2008] [erreur] (OS 10048) Une seule utilisation de chaque adresse de socket (protocole / adresse réseau / port) est normalement autorisée. : proxy: HTTP: tentative de connexion à 127.0.0.1:4321 (*) a échoué

Googler pour cette erreur révèle qu'Apache est probablement à court de descripteurs de fichier de socket. Comme je n'ai que 100 clients en cours d'exécution, cela signifie que les connexions ne sont pas fermées, que ce soit entre ma connexion urllib2 et Apache (j'appelle définitivement .close () renvoie la valeur urlopen ) ou entre Apache et CherryPy.

J'ai confirmé que ma demande urllib2 envoie un en-tête HTTP Connexion: fermez , bien qu'Apache soit configuré avec KeepAlive On si cela questions.

Au cas où cela serait important, j'utilise Python 2.5, Apache 2.2, CherryPy 3.0.3 et le serveur s'exécute sous Windows Server 2003.

Alors, quelle est la prochaine étape pour arrêter ce problème?

Était-ce utile?

La solution

SetEnv proxy-nokeepalive 1 vous dira probablement tout de suite si le problème persiste entre Apache et CP. Consultez les docs mod_proxy pour plus d'informations.

Autres conseils

Vous pouvez exécuter la commande netstat pour voir si vous avez plusieurs sockets dans l'état TIME_WAIT. En fonction de votre paramètre MaxUserPort, le nombre de ports disponibles peut être considérablement limité. De plus, TcpTimedWaitDelay est généralement défini sur 240 secondes, de sorte que les sockets utilisés ne peuvent pas être réutilisés pendant quatre minutes.

Il y a plus de bonnes informations ici - > http://smallvoid.com/article/winnt-tcpip-max-limit.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top