我在 34 GB 的 EC2 实例上运行 Tomcat 6 实例。我一直在努力降低内存,但这个东西处理大量请求,堆经常达到 13 GB。但堆又是另一回事。
现在真正的问题是,过了一段时间后服务器停止响应并且控制台命令会收到“fork:资源暂时不可用”消息。
由于此时服务器严重宕机,EC2 或 ssh 控制台上没有任何内容,我不知道如何诊断。重新启动并离开一段时间后,top 看起来如下:
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 溢出消息(当 JVM GC 并且我们处于重负载时会发生这种情况)之外,系统日志中也没有任何东西
还有什么我应该看的吗?(2.6.21.7-2.fc8xen-ec2-v1.0
顺便说一句)
答案1
听起来很像您内存不足。fork() 基本上只会因为 ulimit 限制(进程或文件描述符的数量)或内存不足而失败。因此,如果您没有达到 ulimit,则意味着您内存不足。
root 通常不受诸如最大进程数之类的限制,但请检查 limits.conf 以确保无误。不过,根据您的 EC2 设置,您可能无法直接以 root 身份登录,因此在这种情况下,您可能必须在机器上保持 root shell 处于打开状态...
出现问题的系统可能无法记录到磁盘,因此唯一知道发生了什么的方法可能是通过“dmesg”(它会打印内核的环形缓冲区)。尝试在机器上保持 root shell 打开并运行以下命令:
while true ; do dmesg -c ; sleep 0.1 ; done
此外,保持vmstat 1
运行可能会揭示一些有趣的事情,例如大量交换......
您是否在系统日志中查找了“oom-killer”?