fork:运行 JVM 时资源暂时不可用

fork:运行 JVM 时资源暂时不可用

我在 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”?

相关内容