tesis sistemas sistema recomendacion hacer como python apache urllib2 cherrypy mod-proxy

python - sistemas - Las tomas Apache no se cierran?



sistema de recomendacion tesis (2)

Tengo una aplicación web escrita usando CherryPy, que se ejecuta localmente en 127.0.0.1:4321 . Usamos mod-rewrite y mod-proxy para que Apache actúe como un proxy inverso; Apache también maneja nuestro cifrado SSL y puede eventualmente ser utilizado para transferir todo nuestro contenido estático.

Todo esto funciona bien para pequeñas cargas de trabajo. Sin embargo, recientemente utilicé urllib2 para escribir un script de estrés que simularía una carga de trabajo de 100 clientes. Después de un tiempo, cada cliente obtiene un error 503 de Apache, lo que indica que Apache no se puede conectar a 127.0.0.1:4321 . CherryPy funciona correctamente, pero mi registro de errores de Apache revela líneas como las siguientes:

[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

Google para este error revela que Apache probablemente se ha quedado sin descriptores de archivos de socket. Como solo tengo 100 clientes en ejecución, esto implica que las conexiones no se cierran, ya sea entre mi conexión urllib2 y Apache (definitivamente estoy llamando a .close() en el valor de retorno de urlopen ), o entre Apache y CherryPy.

Confirmé que mi solicitud urllib2 está enviando una Connection: close HTTP Connection: close encabezado, aunque Apache está configurado con KeepAlive On si eso es importante.

En caso de que importe, estoy usando Python 2.5, Apache 2.2, CherryPy 3.0.3, y el servidor se está ejecutando en Windows Server 2003.

Entonces, ¿cuál es mi próximo paso para detener este problema?


Puede ejecutar el comando netstat y ver si tiene un conjunto de sockets en el estado TIME_WAIT. Dependiendo de su configuración de MaxUserPort, puede estar severamente limitado en la cantidad de puertos disponibles para usar. Además, el TcpTimedWaitDelay generalmente se establece en 240 segundos, por lo que los sockets que se usan no se pueden reutilizar durante cuatro minutos.

Aquí hay más información buena -> http://smallvoid.com/article/winnt-tcpip-max-limit.html


SetEnv proxy-nokeepalive 1 probablemente le dirá de inmediato si el problema es constante entre Apache y CP. Ver los documentos mod_proxy para más información.