Linux 服务器运行一段时间后没有响应 TCP 连接。如何分析?

Linux 服务器运行一段时间后没有响应 TCP 连接。如何分析?

几天以来,我的互联网上的 Ubuntu 11.04 服务器出现了一些奇怪的行为。它可以完美地运行一些 Java Web 应用程序。然后,突然它不再接受连接。当我尝试 ssh 或 http 连接我的服务器时,我没有得到任何响应,直到我超时。但 ping 工作正常。nmap 也有效:

Starting Nmap 5.21 ( http://nmap.org ) at 2011-08-29 10:52 CEST
Nmap scan report for ...
Host is up (0.020s latency).
Not shown: 994 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
25/tcp   open  smtp
53/tcp   open  domain
443/tcp  open  https
3000/tcp open  ppp
3128/tcp open  squid-http

重启后,一切都会恢复正常运行几个小时。

这是怎么回事?或者如何分析这个问题?

答案1

这确实看起来像是内存不足,系统上没有交换。如果 Linux 系统内存不足,它将无法再接受 TCP 连接,因为连接需要内存来建立。ICMP 可能不需要任何东西,因为没有状态需要维护。

检查各处的内存设置,确保分配给 JVM 的内存不超过总内存的 70%(-Xms 和 -Xmx 选项)。

如果尚未完成,请激活交换,您可以在磁盘上的某处创建一个基本交换文件:

dd if=/dev/zero of=/mnt/swapfile bs=1M count=10240
mkswap /mnt/swapfile
swapon /mnt/swapfile

如果此后您的系统再次挂起,则需要进行一些低级监控。

答案2

您应该查看您的 Fail2ban 服务,我在托管的 Linux 机器上遇到了同样的问题,这个问题源于 fail2ban 预安装的配置文件。

或者,它可能是如 mailq 所说的 DoS。

答案3

-Xmx(最大堆大小)并不是为 jvm 分配的所有内存,另外相当大的一部分分配给 PermSize(-XX:MaxPermSize),还有一些分配给内部使用。使用 top 或 ps 找出您的 jvm 使用了多少内存,并为 os+buffers 留出空间(1Gb 加上每个并发连接 150k 是一个不错的开始)。

相关内容