Pergunta

Tenho uma aplicação web escrita usando CherryPy, que é executado localmente no 127.0.0.1:4321. Usamos mod-reescrita e mod-proxy para ter Apache ato como um proxy reverso; Apache também lida com a nossa criptografia SSL e pode eventualmente ser usado para transferir todo o nosso conteúdo estático.

Isso tudo funciona muito bem para pequenas cargas de trabalho. No entanto, eu recentemente utilizado urllib2 para escrever um script de testes de estresse que simulam uma carga horária de 100 clientes. Depois de algum tempo, cada cliente recebe um erro 503 do Apache, indicando que o Apache não pode se conectar a 127.0.0.1:4321. CherryPy está funcionando corretamente, mas meu log de erro Apache revela linhas como o seguinte:

[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

pesquisando para este erro revela que o Apache foi provavelmente executado fora de descritores de arquivo socket. Desde que eu só tenho 100 clientes em execução, isso implica que as conexões não estão sendo fechados, quer entre a minha ligação urllib2 e Apache (Estou definitivamente chamando .close() sobre o valor de retorno de urlopen), ou entre Apache e CherryPy.

Eu já confirmou que o meu pedido urllib2 está enviando um HTTP Connection: close cabeçalho, embora Apache é configurado com KeepAlive On se o que importa.

No caso importa, estou usando o Python 2.5, Apache 2.2, CherryPy 3.0.3, eo servidor está sendo executado no Windows Server 2003.

Então, qual é o meu próximo passo para acabar com este problema?

Foi útil?

Solução

SetEnv proxy-nokeepalive 1 provavelmente dizer-lhe imediatamente se o problema é keepalive entre Apache e CP. Veja a mod_proxy docs para mais informações.

Outras dicas

Você pode executar o comando netstat e ver se você tem um monte de soquetes no estado TIME_WAIT. Dependendo do seu MaxUserPort definição que pode ser severamente limitado no número de portas disponíveis para uso. Além disso, o TcpTimedWaitDelay é geralmente definido para 240 segundos de modo nenhum soquetes que são usados ??não podem ser reutilizados por quatro minutos.

Há mais boas informações aqui -> http://smallvoid.com/ artigo / winnt-tcpip-max-limit.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top