soquetes Apache não fechar?
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?
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