集群namenode与journalNode通讯超时导致namenode挂掉问题分析


背景:

  因业务要求进行了一次业务数据的全量采集,采集过程中集群namenode与journalNode通讯超时导致namenode挂掉。如下图

	
Error: starting log segment 11771414 failed for required journal (JournalAndStream(mgr=QJM to [192.168.0.21:8485, 192.168.0.22:8485, 192.168.0.23:8485], stream=null))
java.io.IOException: Timed out waiting 20000ms for a quorum of nodes to respond.

 

问题分析:

  这种问题通常是Full GC导致的问题, namenode这个时间点进行了一次时间比较长的 full gc,导致写 journalnode 超时(默认是20s), namenode进程退出。

结合集群namenode jvm参数

-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled

为什么Namenode JVM一般选用CMS,可以参考:NameNode Garbage Collection Configuration: Best Practices and Rationale 

可能是以下原因:

 1. Perm(jdk1.8后是元数据空间)空间不足; 2. CMS GC时出现promotion failed和concurrent mode failure(concurrent mode failure发生的原因一般是CMS正在进行,但是由于老年代空间不足,需要尽快回收老年代里面的不再被使用的对象,这时停止所有的线程,同时终止CMS,直接进行Serial Old GC); 3. 主动触发Full GC(执行jmap -histo:live [pid])来避免碎片问题。

再结合如下监控及heap情况:

  我们可以看到,E伊甸园区使用比例 和M元数据区使用比例都很高,O老年代使用比例很低,且元数据区默认只有20M,所以判断是元数据空间不足导致的 full gc。

另外新生代和老生代比例为1:4,容易造成大对象在做gc时,大对象直接进入老生代,造成老生代内存快速增长,full gc更加频繁。

调优方向:

  1.提升堆内存大小,降低Old区使用比例,修改新生代和老生代比例为1:3,规避压缩式GC的STW风险

  2.调节journalnode 的写入超时时间  dfs.qjournal.write-txns.timeout.ms = 90s

  3.设置Java8的永生代初始值MetaspaceSize为较大的值128m,避免MetaSpace用满需要增长而引发的Full GC,-XX:MetaspaceSize=128m

-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSParallelRemarkEnabled -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -XX:NewRatio=3  -XX:MetaspaceSize=128m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

 参考文章:

  https://tech.meituan.com/2017/12/29/jvm-optimize.html

  https://ericsahit.github.io/2016/12/25/Namenode%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90/

  https://toutiao.io/posts/155svp/preview

  https://cache.one/read/3461413

  http://blog.itpub.net/30089851/viewspace-2122226/

  https://community.cloudera.com/t5/Support-Questions/Name-Node-instability-flush-failed-for-required-journal/td-p/128161

cdh