Por que eu estabeleci conexões TCP sem PID de proprietário?

4

Tantoss --processes como netstat --program (com sudo) listam algumas% de conexões TCPESTABLISHED na porta local 6514 com valoresRecv-Q diferentes de zero e nenhum processo proprietário (saída netstat mostra - onde o comando PID / deve ser).

Existem outras conexões TCP estabelecidas para a mesma porta local que revelam o PID do proprietário do aplicativo baseado em Java (logstash), que eu espero possuir todas essas conexões (ele possui o soquete LISTENing). Essas conexões têm filas de recebimento vazias.

Além disso, lsof -i:6514 não lista as conexões TCP estabelecidas "sem proprietário".

A execução de ss no final remoto de uma das conexões "sem proprietário" mostra que ela acredita que a conexão foi estabelecida e tem filas vazias de envio e recebimento. A extremidade remota mostra que a conexão foi estabelecida por semanas. O final remoto está por trás de um NAT.

Eu quero entender como essas conexões TCP estabelecidas e não estabelecidas podem existir, e como elas são limpas, se é que são.

Eu posso ver que ss --listening mostra o soquete LISTEN para a porta local 6514 ter um Send-Q de 50 e um Recv-Q de 51. Posso supor que isso significa que o processo Java de escuta atingiu sua conexão simultânea limite e é a razão para as conexões estabelecidas "sem dono"?

# lsb_release -d
Description:    Ubuntu 14.04.1 LTS
# uname -irs
Linux 3.13.0-36-generic x86_64

Atualizar

A execução de netstat --program --numeric-hosts --numeric-ports --extend mostra que o usuário das conexões "sem proprietário" é root não o usuário do processo Java e o INode é 0 .

O problema reapareceu com uma ou duas horas depois de reiniciar o processo Java. Desta vez, o soquete LISTEN Recv-Q é apenas 9 comparado com o Send-Q de 50 e o número total de conexões TCP para a porta local 6514 é 21 com 8 daqueles "sem proprietário".

Atualização 2

Agora percebi que o número Recv-Q no soquete LISTEN corresponde ao número de conexões ESTABLISHED "sem proprietário". Acredito que isso significa que o kernel concluiu o handshake TCP SYN / SYN + ACK / ACK nas conexões de entrada, mas o processo Java ainda não chamou accept() .

Se meu entendimento estiver correto, preciso investigar por que o aplicativo não está aceitando as novas conexões.

    
por Jason Stangroome 02.09.2015 / 04:46

1 resposta

1

Reduzi esse problema para logstash e seu uso da implementação SSL do JRuby, em dois plug-ins logstash diferentes, em duas versões Java diferentes, em máquinas diferentes, com clientes diferentes e com ou sem um proxy TCP intermediário.

Em todos os casos, substituir SSLServer por TCPServer no código Ruby e executar o descarregamento de TLS na frente do logstash resolve o problema.

O problema subjacente com a implementação do JRuby SSL, ou a maneira como ele está sendo usado no contexto do logstash, não é resolvido.

Problemas para cada plug-in de logstash afetado:

por 10.10.2015 / 00:50

Tags