Oracle 11g TNSLSNR LAST_ACK inundação de conexão

1

Temos o Windows 2k3 EE SP2 com o Oracle 11.2.0.1.0 DB instalado. O banco de dados é usado por diferentes aplicativos (incluindo aplicativos da Web e serviços). De tempos em tempos, temos alguns problemas com o aplicativo da web que causa comportamento inesperado, por exemplo, páginas lentas ou não totalmente carregadas, redirecionamentos estranhos. Reiniciar os serviços Tomcat e Oracle corrige o problema.

Uma vez, quando o problema apareceu novamente, olhei os logs do tomcat e notei uma exceção:

java.sql.SQLException: Io exception: The Network Adapter could not establish the connection

Ocorreu-me que o servidor de banco de dados pode estar ocupado, sobrecarregado ou algo assim, então eu examinei a atividade de rede (com CurrPorts). Houve dezenas de conexões penduradas com o status de "Last Ack" que se originaram do processo Oracle TNSLSNR.exe, solicitando a porta local 1521 (que, como sabemos, é a porta que o próprio processo " Ouve).

O software CurrPorts tem a opção "Fechar conexões TCP selecionadas" ao clicar com o botão direito do mouse, então usei-o para todas essas conexões inativas. Ele corrigiu imediatamente os problemas de conexão que o web-app enfrentou. O pior é que esta situação se repete, uma ou duas vezes por hora, uma nova conexão presa em Last ack aparece.

Tudo isso significa que a cada dois dias, eu preciso fechar essas conexões manualmente, já que não faço ideia do motivo pelo qual elas acontecem, nem uma solução por enquanto.

Então, eu estou querendo saber qual pode ser a causa disso?

( Imagem do problema )

    
por closer 29.11.2013 / 15:44

1 resposta

0

Aqui está uma foto do diagrama de estado do TCP:

Um sistema acaba em LAST_ACK quando recebe um FIN e se torna o "passivo" mais próximo.

A pilha de IPs do sistema responde então a esse FIN com um ACK e define o soquete relacionado como CLOSE_WAIT .

O aplicativo precisa entender que o soquete está pronto, chame close() no soquete, então a pilha IP do sistema envia um FIN e define o soquete como LAST_ACK .

O terminal remoto precisa responder com um ACK e o soquete se torna CLOSED . Este é o passo que não está acontecendo.

Vejo que você está usando o endereço IP do sistema local como origem e destino. Desculpe, não sei mais sobre a comunicação do host local no Windows. Isso pode ser um problema do Windows ou um problema do Oracle. Espero que pelo menos ajude você a entender o que está acontecendo, se não por que .

    
por 22.12.2013 / 00:51