几天以来,我的互联网上的 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 是一个不错的开始)。