我在34 GB EC2实例上运行Tomcat 6实例。 我一直在努力保持内存的下降,但这件事情服务了很多请求,堆经常达到13 GB。 但堆是另一回事。
现在真正的问题是,一段时间后,服务器停止响应和控制台命令满足“叉:资源暂时不可用”的消息。
由于服务器在这一点上下了苦功夫,没有什么是在EC2或SSH控制台,我不知道如何诊断这一点。 重新启动并离开一段时间后,顶部看起来像这样:
Mem: 35847580k total, 28719420k used, 7128160k free, 221432k buffers Swap: 0k total, 0k used, 0k free, 11103780k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND xxxx tomcat 25 0 19.9g 15g 9832 S 86 44.1 36:01.69 java
我很确定我的ulimits设置得足够高,而/etc/security.conf中没有任何内容会限制Java进程。 我有大约30,000个线程和相同数量的FD。 系统日志中除了一些SYN flodding消息之外没有任何东西(这些发生在JVM GC和负载很重的情况下)
还有什么我应该看看? ( 2.6.21.7-2.fc8xen-ec2-v1.0 btw)
听起来很像你内存不足。 fork()基本上只会因ulimit限制(进程或文件描述符的数量)或内存不足而失败。 所以,如果你没有达到目标,那就意味着你的记忆力不足。
根通常超出限制,如最大进程数,但检查您的limits.conf是肯定的。 根据您的EC2设置,您可能无法直接以root用户身份login,所以在这种情况下,您可能必须在该框中打开一个root shell。
有麻烦的系统可能无法login到磁盘,所以唯一的方法是通过“dmesg”(打印内核的环形缓冲区)来了解发生了什么。 尝试保持在下面的运行框中打开一个根shell:
while true ; do dmesg -c ; sleep 0.1 ; done
另外,保持vmstat 1运行可能会显示一些有趣的内容,比如重大的交换…
你有没有grep你的系统日志“OOM杀手”?