Pregunta

Tengo una aplicación web escrita con 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 eventualmente puede usarse para transferir todo nuestro contenido estático.

Todo esto funciona bien para cargas de trabajo pequeñas. Sin embargo, recientemente usé urllib2 para escribir un script de prueba de esfuerzo que simularía una carga de trabajo de 100 clientes. Después de un tiempo, cada cliente recibe un error 503 de Apache, lo que indica que Apache no puede conectarse 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) Normalmente solo se permite un uso de cada dirección de socket (protocolo / dirección de red / puerto). : proxy: HTTP: error al intentar conectarse a 127.0.0.1:4321 (*)

Buscar en Google 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 están cerrando, 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.

He confirmado que mi solicitud urllib2 está enviando un encabezado HTTP Connection: close , aunque Apache está configurado con KeepAlive On si eso importa.

En caso de que sea importante, 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?

¿Fue útil?

Solución

SetEnv proxy-nokeepalive 1 probablemente le dirá de inmediato si el problema está pendiente entre Apache y CP. Consulte los mod_proxy docs para obtener más información.

Otros consejos

Puede ejecutar el comando netstat y ver si tiene un montón de sockets en el estado TIME_WAIT. Dependiendo de la configuración de MaxUserPort, es posible que tenga una gran limitación en la cantidad de puertos disponibles para usar. Además, TcpTimedWaitDelay generalmente se establece en 240 segundos, por lo que los sockets que se usan no pueden reutilizarse durante cuatro minutos.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top