一段时间后,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 

重新启动后,一切都会再次运行几个小时。

这可能是什么? 或者如何分析这个问题?

这确实看起来像是内存不足,系统上没有交换。 如果一个linux系统内存不足,就不能再接受TCP连接了,因为连接需要build立内存。 ICMP可能不需要任何东西,因为没有状态来维护。

在任何地方检查你的内存设置,确保你不会把超过70%的内存分配给JVM(-Xms和-Xmx选项)。

激活一个交换,如果还没有完成,你可以在磁盘上的某处创build一个基本的交换文件:

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

如果之后你的系统再次挂起,是时候进行一些低级别的监视。

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

你应该看看你的Fail2ban服务,我已经面对同样的问题,托pipe的Linux的盒子,这是从fail2ban预安装的configuration文件。

或者,它可能是一个DoS的说mailq。