HBase依靠ZooKeeper来感知集群成员及其存活性。假设一个server暂停了非常长时间,它将无法给ZooKeeper quorum发送心跳信息,其他server会觉得这台server已死亡。这将导致master为其启动恢复进程。当该server脱离停顿时,它会发现它的全部租约都已失效(hbase
client端每次和regionserver交互的时候,都会在服务器端生成一个租约(Lease)。租约的有效期由參数hbase.regionserver.lease.period确定)。然后自杀。

HBase开发团队亲切地称这个场景为Juliet Pause。

在HBase中使用默认GC,能够看到全部线程中的长时间停顿,包含Juliet Pause, 又名"GC of
Death"。能够在JAVA虚拟机中开启GC日志,来帮助调试这样的问题。

hbase-env.sh中,取消下面任一凝视就可以开启GC日志:

# This enables basic gc logging to the .out file.
# export SERVER_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps" # This enables basic gc logging to its own file.
# export SERVER_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<FILE-PATH>" # This enables basic GC logging to its own file with automatic log rolling. Only applies to jdk 1.6.0_34+ and 1.7.0_2+.
# export SERVER_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<FILE-PATH> -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M" # If <FILE-PATH> is not replaced, the log file(.gc) would be generated in the HBASE_LOG_DIR.

点击"Local logs",查看gc-xxx.log日志,格式例如以下:

15578637.583: [GC [1 CMS-initial-mark: 12076002K(12582912K)] 18788432K(29360128K), 1.0113310 secs] [Times: user=1.01 sys=0.00, real=1.01 secs]
15578638.595: [CMS-concurrent-mark-start]
15578639.125: [CMS-concurrent-mark: 0.530/0.530 secs] [Times: user=1.61 sys=0.01, real=0.53 secs]
15578639.125: [CMS-concurrent-preclean-start]
15578639.160: [CMS-concurrent-preclean: 0.035/0.035 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
15578639.160: [CMS-concurrent-abortable-preclean-start]
CMS: abort preclean due to time 15578644.606: [CMS-concurrent-abortable-preclean: 5.446/5.446 secs] [Times: user=5.82 sys=0.07, real=5.45 secs]
15578644.607: [GC[YG occupancy: 6769031 K (16777216 K)]15578644.607: [Rescan (parallel) , 0.9756010 secs]15578645.583: [weak refs processing, 0.0000280 secs]15578645.583: [scrub string table, 0.0006370 secs] [1 CMS-remark: 12076002K(12582912K)] 18845034K(29360128K), 0.9764070 secs] [Times: user=9.52 sys=0.03, real=0.97 secs]
15578645.584: [CMS-concurrent-sweep-start]
15578645.829: [CMS-concurrent-sweep: 0.245/0.245 secs] [Times: user=0.30 sys=0.00, real=0.24 secs]
15578645.829: [CMS-concurrent-reset-start]
15578645.855: [CMS-concurrent-reset: 0.026/0.026 secs] [Times: user=0.05 sys=0.01, real=0.03 secs] 15578647.856: [GC [1 CMS-initial-mark: 12075999K(12582912K)] 20737398K(29360128K), 1.0872730 secs] [Times: user=1.09 sys=0.00, real=1.08 secs]
15578648.943: [CMS-concurrent-mark-start]
15578649.472: [CMS-concurrent-mark: 0.528/0.528 secs] [Times: user=2.06 sys=0.02, real=0.53 secs]
15578649.472: [CMS-concurrent-preclean-start]
15578649.507: [CMS-concurrent-preclean: 0.035/0.035 secs] [Times: user=0.04 sys=0.00, real=0.04 secs]
15578649.507: [CMS-concurrent-abortable-preclean-start]
CMS: abort preclean due to time 15578654.961: [CMS-concurrent-abortable-preclean: 5.454/5.454 secs] [Times: user=8.15 sys=0.17, real=5.45 secs]
15578654.962: [GC[YG occupancy: 11315403 K (16777216 K)]15578654.963: [Rescan (parallel) , 1.1274320 secs]15578656.090: [weak refs processing, 0.0000240 secs]15578656.090: [scrub string table, 0.0005890 secs] [1 CMS-remark: 12075999K(12582912K)] 23391403K(29360128K), 1.1281890 secs] [Times: user=11.00 sys=0.03, real=1.13 secs]
15578656.091: [CMS-concurrent-sweep-start]
15578656.327: [CMS-concurrent-sweep: 0.236/0.236 secs] [Times: user=0.52 sys=0.01, real=0.24 secs]
15578656.327: [CMS-concurrent-reset-start]
15578656.353: [CMS-concurrent-reset: 0.026/0.026 secs] [Times: user=0.05 sys=0.00, real=0.02 secs] </span></span>
CMS垃圾回收的运行过程:

1、CMS-initial-mark :初始标记,从root对象開始标记存活的对象。它花费的时间是real=1.01 secs,因为这一步骤是STW的,所以整个application被暂停了1.01秒。而且,user time和real time相差不大,所以确实是仅仅有一个thread运行这一步;

2、CMS-concurrent-mark-start:并发标记。它运行时间是real=0.53 secs,但由于这一步是能够并发运行的。所以系统在这段时间内并没有暂停;

3、CMS-concurrent-preclean-start :concurrent precleaning。相同的。这一步也是并发运行;
4、CMS-remark:又一次标记。暂停应用程序。同一时候启动一定数目的垃圾回收线程。并行地标记第2阶段遗漏的对象(在并发标记阶段结束后对象状态的更新导致)。

它的运行时间是real=0.97
secs。

由于这是STW的步骤,而且它的pause time通常是最长的,所以这一步的运行时间会直接决定这次Full GC对系统的影响。

5、CMS-concurrent-sweep-start:并发清除。
6、CMS-concurrent-reset-start:并发重设状态等待下一次CMS的触发。
仅仅有在第1、4阶段须要暂停全部的应用程序。其他阶段的垃圾回收线程与应用程序线程并发运行。

最新文章

  1. mysql max_allowed_packet 设置过小导致记录写入失败
  2. Web报表工具FineReport的JS API开发(一)
  3. 【转】HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别
  4. 关于iOS10的允许访问用户数据产生的问题
  5. [OpenCV] Samples 08: edge
  6. 监听报错 TNS-00525: Insufficient privilege for operation 11gR2 + 连接报错ORA-12537: TNS:connection closed
  7. C# 编程音量控制
  8. Tesseract 3 语言数据的训练方法
  9. zabbix 四张大表分区
  10. AOJ 0118 深度优先搜索
  11. 微信QQ的二维码登录原理浅析
  12. C++字符串(1)
  13. Python基础学习3---数据结构
  14. 自定义gradview
  15. Python 文件行数读取的三种方法
  16. SAS 对数据的拼接与串接
  17. laravel-更换语言包
  18. 【kindle笔记】之 《恶意》-2018-4-20
  19. kali-rolling安装openvas 9并创建扫描任务教程
  20. How to Start a Business in 10 Days

热门文章

  1. 20140323组队赛 2012福建省第三届ACM省赛题目
  2. 关于Metadata Client Object Model 的一些操作
  3. C语言实验设计
  4. Delphi 从PaintBox拷贝一部分内容到TBitmap
  5. (3)一般处理程序 ,HttpContext类
  6. Codeforces635C XOR Equation【数学】
  7. FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869
  8. layui-时间选择器-时间范围选择
  9. Could not change executable permissions on the application
  10. Effective JavaScript Item 54 将undefined视为&amp;quot;没有值&amp;quot;