Frage

Ich habe eine Web-Anwendung mit CherryPy geschrieben, die auf 127.0.0.1:4321 lokal ausgeführt wird. Wir verwenden mod-Rewrite und mod-Proxy Apache fungieren als Reverse-Proxy zu haben; Apache übernimmt auch unsere SSL-Verschlüsselung und schließlich verwendet werden kann, alle unserer statischen Inhalte zu übertragen.

Das alles funktioniert ganz gut für kleine Workloads. Allerdings habe ich vor kurzem urllib2 einen Stress-Test-Skript zu schreiben, die eine Auslastung von 100 Kunden simulieren würden. Nach einiger Zeit erhält jeder Kunde einen 503 Fehler von Apache, was darauf hinweist, dass Apache nicht 127.0.0.1:4321 verbinden kann. CherryPy ordnungsgemäß funktioniert, aber mein Apache Fehlerprotokoll zeigt Zeilen wie folgt aus:

[Thu Oct 02 12:55:44 2008] [error] (OS 10048)Only one usage of each socket address (protocol/network address/port) is normally permitted. : proxy: HTTP: attempt to connect to 127.0.0.1:4321 (*) failed

für diesen Fehler Googeln zeigt, dass Apache wahrscheinlich aus der Fassung Filedeskriptoren ausgeführt wird. Da ich nur 100 Kunden ausgeführt haben, bedeutet dies, dass die Verbindungen nicht geschlossen werden, entweder zwischen meinem urllib2 Verbindung und Apache (ich auf jeden Fall anzurufenden .close() auf dem Rückgabewert von urlopen) oder zwischen Apache und CherryPy.

Ich habe bestätigt, dass meine urllib2 Anfrage einen HTTP-Header Connection: close sendet, obwohl Apache mit KeepAlive On konfiguriert ist, wenn es ankommt.

Falls es darauf ankommt, bin ich mit Python 2.5, Apache 2.2, CherryPy 3.0.3 und der Server unter Windows Server 2003 ausgeführt wird.

Also, was ist mein nächster Schritt, um dieses Problem zu stoppen?

War es hilfreich?

Lösung

SetEnv proxy-nokeepalive 1 würden Sie wahrscheinlich sagen, sofort, wenn das Problem ist, Keep-Alive zwischen Apache und CP. Sehen Sie sich die Mod_proxy docs für weitere Informationen .

Andere Tipps

Sie können den Befehl netstat laufen und sehen, ob Sie eine Reihe von Steckdosen im TIME_WAIT-Zustand haben. Je nach Ihrer MaxUserPort Einstellung, die Sie könnten severly in der Anzahl der verfügbaren Ports beschränkt zu verwenden. Darüber hinaus wird der TcpTimedWaitDelay in der Regel bis 240 Sekunden eingestellt so dass alle Sockets, die verwendet werden, können nicht vier Minuten wiederverwendet werden.

Es gibt mehr gute Informationen hier -> http://smallvoid.com/ Artikel / winnt-tcpip-max-limit.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top