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.