网络 – 太多已建立的连接保持打开状态

我有一个(可能很旧的)CentOS 4.5服务器,里面运行一个自定义java应用程序.

我发现应用程序在运行一段时间后崩溃,发现它处理了1024个连接,并在它死亡时尝试再打开一个套接字.

事实上,如果我检查ulimit -n我可以确认它是1024,所以应用程序正在关闭,因为它没有更多的免费文件描述符..

困扰我的是,有数百个显然处于非活动状态的连接,处于“已建立关闭”状态,全部来自相对较少数量的IP(约200个),并且随着时间的推移它们往往会累加起来并且客户端连接起来很多像这些我看到运行netstat -nato:

tcp        0      0 ::ffff:10.39.151.20:10000   ::ffff:78.152.97.98:12059   ESTABLISHED off (0.00/0/0)
tcp        0      0 ::ffff:10.39.151.20:10000   ::ffff:78.152.97.98:49179   ESTABLISHED off (0.00/0/0)
tcp        0      0 ::ffff:10.39.151.20:10000   ::ffff:78.152.97.42:45907   ESTABLISHED off (0.00/0/0)

我知道它不是DOS攻击,连接是合法的,但是在客户端连接并与服务器进行短数据交换后似乎没有关闭..此外,速度很慢,因为它是由200个客户端生成的(计数不同的IP)..

我应该调查一些奇怪的应用程序错误(可能是在1.6版本),还是深入了解CentOS网络配置?我不知道还有什么可以看的……

在此先感谢,任何提示都表示赞赏!

最佳答案
假设1:您的应用程序位于防火墙后面,该防火墙在给定的时间后丢弃空闲的tcp连接.

当客户端再次尝试使用此连接时,它会发现它没有响应,将其删除并启动一个新连接.

对于服务器,由于TCP连接没有保持活动计时器,因此无法知道连接是无效的,并且它将无限期地保持打开状态.

要证明:使一个连接的长时间运行tcpdump显示它在给定的时间后变得未使用.

解:

>更改代码以在tcp套接字上使用keepalive并(可选地为了获得最佳性能)将keepalive计时器设置为低于防火墙tcp-idle计时器
>将防火墙tcp-idle计时器更改为超出客户端最大功能空闲时间的更高值.这很可能是防火墙上的全局设置,因此您的安全管理员可能稍微不愿意这样做.

转载注明原文:网络 – 太多已建立的连接保持打开状态 - 代码日志