最近我们遇到了我们的集群(CDH 5.3.1)的问题,这些问题表现在NameNodes以及DataNodes被卡在长GC周期中,从30秒到几分钟不等。
JVM设置仍然是默认设置,但鉴于我们的集群同时增长到3400万个块,行为可以解释。
对于NN,对GC设置(例如年轻基因大小,幸存者)的大小调整和其他微调整的简单调整使我们再次获得可预测的短GC暂停。
对于DN而言,我们仍然会遭受周期性的长时间GC暂停。我观察到的是每6小时发生异常长的GC暂停(Full GC)。现在我假设Cloudera为块报告间隔dfs.blockreport.intervalMsec
设置默认值为6 h,这有助于这种模式。
我想了解的是,如果有建议我如何解决这个问题,我需要找到既满足正常运行内存分配的GC设置(似乎大部分都很好)以及快速分配我每隔6小时就会看到几分钟。
DN服务器有256G RAM& 20个物理核心
这是Java Hotspot jdk1.7.0_67。
我目前的次优设置是:
-server
-Xmn5g
-Xms12884901888
-Xmx12884901888
-XX:SurvivorRatio=3
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+CMSConcurrentMTEnabled
-XX:CMSInitiatingOccupancyFraction=60
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+ScavengeBeforeFullGC
-XX:+CMSScavengeBeforeRemark
-XX:MaxTenuringThreshold=15
我也有兴趣听说是否有一种方法可以影响阻止报告,而不是调整JVM?
有关时间范围,请参阅gc log: http://hastebin.com/zafabohowi
答案 0 :(得分:1)
好的,通过GCViewer运行日志似乎只是一阵活动(例如从17:09开始)填满了老一代,直到它导致一些失败(17:15)
只需尝试碰撞堆大小,以便在任务完成之前为其提供更多的喘息空间。
除并发模式失败之外,似乎还有一些相对较长的暂停,请尝试应用these options来查看它们是否可以减少几毫秒。