Temos um servidor java em execução no linux em uma porta específica que aceita conexões persistentes para milhares e milhares de usuários. Recentemente, nossos clientes não conseguem se conectar com um erro de tempo limite. Suspeitamos que o tráfego esteja ficando muito alto, mas nosso log java realmente mostra que muitos não estão conectados por segundo.
Suspeitamos que muitos tentem ao mesmo tempo e que sejam basicamente descartados no nível do sistema operacional e, portanto, o programa java nunca tenha a chance de aceitar a conexão? Existe algum tipo de login no linux que pode mostrar alguém tentando acessar um soquete?
iptables -I INPUT -p tcp --dport some_port -m state --state NEW
. Observe que, a menos que você esteja interessado nos detalhes de cada tentativa de conexão, a omissão-j LOG
evita o envio de spam no arquivo de log do sistema com muitos dados desnecessários.Quando tenho problemas de rede realmente desagradáveis, costumo acionar o wireshark . Para mim, não há ferramenta de diagnóstico de rede melhor quando tenho que detalhar os detalhes minuciosos. E não se preocupe se não conseguir instalá-lo na caixa de origem ou de destino; você pode executar
tcpdump -w
para gravar dados de pacote em um arquivo no início e / ou terminal e alimentar o arquivo no wireshark em outra caixa, conforme sua conveniência.fonte
tcpdump -nS dst port <some port>
Seria bom ver exatamente o que seus threads Java estão obtendo no nível do soquete. Ao mesmo tempo, você deseja correlacionar isso com as informações da rede do sistema operacional. Dê uma olhada no AppFirst. Eles podem fazer esse tipo de coisa.
fonte
mostra as conexões atualmente estabelecidas.
Compare isso com suas
ulimit
configurações ativas e, é claro, com o número máximo de conexões que seu aplicativo java pode suportar.fonte