我们有一个运行在linux中的java服务器,在一个特定的端口上接受数以千计的用户的持久连接。 最近我们的客户无法连接超时错误。 我们怀疑stream量过高,但是我们的java日志实际上表明,每秒钟连接的数量并不多。
我们怀疑可能是因为太多的人在同一时间尝试,他们基本上是在操作系统级别下降,所以Java程序从来没有真正有机会接受连接? 有没有在Linux的某种日志,可以显示有人试图击中一个套接字?
iptables -I INPUT -p tcp --dport some_port -j LOG然后iptables -I INPUT -p tcp --dport some_port -j LOG
tail -f /var/log/messages
之后,看看有多less数据被该规则命中: iptables -L -n -v
或者你可以运行tcpdump并grep出端口。
当我有非常讨厌的networking问题的时候,我倾向于打击wirehark 。 对我来说,当我不得不认真考虑细节时,没有更好的networking诊断工具。 如果无法将其安装在源地址或目标地址框上,请不要担心; 您可以运行tcpdump -w将包数据写入开始和/或端点上的文件,并在方便时将文件提供给另一个盒子上的wireshark。
很高兴看到你的Java线程在套接字级别获得了什么。 同时你也想把它和操作系统的networking信息联系起来。 看看AppFirst。 他们可以做这种事情。
watch -n1 -d "netstat -an | grep ESTABLISHED | wc -l"
显示当前build立的连接。
将它与你的活动ulimit设置进行比较,当然也可以使用java应用程序可以处理的最大连接数。