Killing CLOSE_WAIT sockets sem matar o processo pai no Linux

6

O Tomcat está me deixando com os soquetes CLOSE_WAIT que basicamente saturam o número máximo de conexões.

Eu tentei muitos métodos no meu cliente e código do servidor para se livrar deles inutilmente, incluindo o fechamento de conexões, chamando System.gc (), etc.

Agora, estou tentando encontrar uma maneira de simplificá-los rapidamente no sistema operacional. Eu tenho conntrack funcionando, mas não tenho certeza de como usar isso para matar essas conexões. Eu também configurei / proc / sys / net / ipv4 / netfilter / ip_conntrack_tcp_timeout_close_wait para 1, o que obviamente é muito baixo, mas as conexões persistem.

Existe uma maneira de matar essas órbitas de zumbis?

Executando o Ubuntu.

    
por Alex Neth 14.11.2010 / 21:47

1 resposta

3

Acredito que CLOSE_WAIT no lado do servidor da conexão significa que o servidor recebeu um FIN do cliente, terá reconhecido isso de volta ao cliente e informado ao aplicativo que pode fechar a conexão.

Cabe então ao aplicativo abandonar a conexão quando estiver satisfeito de que todos os dados foram lidos da conexão.

Uma vez que ele libera a conexão, o servidor enviará um FIN final de volta ao cliente e a conexão será totalmente fechada.

Sugere que não tem nada a ver com "TCP_tuning"

Tem certeza de que seu aplicativo está fechando os soquetes?

Quando eu escrevi um servidor python, eu aprendi isso: D

UPDATE
Dependendo da sua versão do Tomcat, você pode ter enfrentado esse problema devido a um bug introduzido no Tomcat 6 com o recurso keepAliveTimeout no protocolo AJP do Coyote.
A natureza desse problema foi causada pela falha do Tomcat em fechar os soquetes após a expiração do keepAliveTimeout. Os soquetes do Tomcat permaneceriam no estado CLOSE_WAIT, mas os soquetes mod_jk correspondentes seriam fechados normalmente.

este bug foi corrigido no SVN commit r589062 e liberado no Tomcat 6.0.15

    
por 14.11.2010 / 22:01