Java虚拟机成为EC2上的码头冒烟测试后反应迟钝,100%
我们正在运行我们的EC2系统的一些烟雾测试和一个核心偶尔VM变得完全没有反应,而这使得在100%1个核自旋,所有其他内核是此时0%。它不允许进一步的连接(RMI,JMX,HTTP请求到Jetty,全部失败)。Java虚拟机成为EC2上的码头冒烟测试后反应迟钝,100%
信息:
- 高CPU超大型实例(实例类型c1.xlarge)
- 的Java(TM)SE运行时环境(建立1.6.0_22-B04)
- Java的热点(TM )64位服务器虚拟机(内部版本17.1-b03,混合模式)
有没有人有过类似这样的经历?任何信息将不胜感激,谢谢!
我们发现问题。我们注意到我们集群中的一些实例总是产生问题,有些实例从来没有这样做。显然这个问题对于运行更新的CPU版本以及稍微过时的内核的实例是独一无二的。
这个问题在这里充分解释说:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/727459
随着运行时间的增加在下面的图中显示的峰值越来越长,可能由于时移,在某些时候,它会旋转的一个核心需很长时间。
Cpu使用情况图。受影响的情况下与影响:
这个问题最近已经固定,从而内核更新修复了我们这个问题。
我曾经使用过此问题,码头运行之前(虽然同样的经历可以与任何Java进程进行),以及它的时候你不给足够的内存来JVM发生:所有的资源都实际使用的垃圾收集器遍历对象图以回收未引用的对象。我等了很久(在我的情况下,有时需要几分钟),你应该看到OutOfMemoryException上的JVM崩溃。
嗨jpountz。如果我记得正确的话,那么当JVM开始旋转内核的时候,JVM就剩下很多堆了。我会仔细检查 –
我们证实,这不是GC旋转。我们只收集了一些年轻的垃圾,没有完全的尝试。 –
你有没有试过等待几分钟(或者如果需要的话),看看过程是否最终崩溃?其他JVM服务不再响应的事实使得垃圾回收成为您的问题的一个很好的候选者(当堆大小达到极限时触发完整GC需要“停止世界”)。这个问题是否会在启动时发生,或者在您触发可能会吃掉所有内存的特殊操作之后发生? – jpountz
我假设你已经在本地系统上试过了,它只发生在EC2系统上? –
线程转储说什么?做'ps -ef | grep java'然后'kill -QUIT',其中是你的java进程的进程ID。 –
Jonathan
@Peter Lawrey,正确的,在其他机器上的负载测试都很好,即使在比我们放置EC2实例更高的负载下也是如此。另外请注意,这是非常随机的。 –