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

Luk*_*uke 8 networking centos netstat connections

我有一个(可能很旧)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)
Run Code Online (Sandbox Code Playgroud)

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

我应该调查一些奇怪的应用程序错误(可能在 jre 1.6 上),还是深入研究 CentOS 网络配置?我不知道还有什么可看的..

提前致谢,任何提示表示赞赏!

Zab*_*man 10

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

当客户端再次尝试使用此连接时,它发现它没有响应,将其丢弃并开始一个新的连接。

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

证明:对一个连接进行长时间运行的 tcpdump 以显示它在给定的时间后变为未使用状态。

解决方案:

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

  • 除非防火墙向服务器发送 TCP-Reset 数据包,否则服务器将一无所知。如果服务器应用程序不关闭空闲的 TCP 会话,它们会永远存在。 (3认同)