build立的连接太多了

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

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

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

令我困扰的是,有数百个表面上处于非活动状态的连接,处于“ESTABLISHED off”状态,全部来自相对较less数量的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攻击,连接是合法的,但在客户端连接之后似乎不会closures,并与服务器进行短暂的数据交换。此外,由于由200个客户端生成(计数不同的IP)

我应该调查一些奇怪的应用程序错误(也许在1.6版本),或挖掘到CentOSnetworkingconfiguration? 我不知道还有什么更多的关注..

在此先感谢,任何暗示赞赏!

假设1:您的应用程序位于防火墙的后面,在给定的时间量之后会丢弃空闲的TCP连接。

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

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

为了certificate:使一个连接的长时间运行的tcpdump在给定的时间量之后显示为未使用。

解:

  • 改变代码使用keepalive在TCP套接字和(可选为了获得最佳性能)设置keepalive定时器低于防火墙tcp-idle定时器
  • 将防火墙tcp-idle定时器更改为超出客户端的最大function空闲时间的更高值。 这很可能是防火墙上的一个全局设置,所以你的安全pipe理员可能会稍微不愿意这么做。