HBase中JVM的优化笔记

可视化监控框架:

Ganglia和JMX,可以查看JVM相关的监控数据。这里暂不作介绍。

垃圾收集器:

因为HBase的优化方案是和具体的垃圾收集器相关的,所以要先了解系统使用的是哪种垃圾收集器。
下面这个链接说了各种垃圾收集器及它们之间的组合关系,一定要看:
http://www.fasterj.com/articles/oraclecollectors1.shtml
可以通过java –XX:+PrintCommandLineFlags –version命令来查看当前JVM的配置信息:

查看JVM配置信息

Java8默认使用的还是-XX:+UseParallelGC参数(年轻代使用 PS Scavenge,老年代使用PS MarkSweep)。

垃圾回收优化:

RegionServer因为GC的原因不能分配太大的堆内存,20~24GB或者更小比较适合。
堆的大小通过export HBASE_HEAPSIZE=xxx来设置。
指定新生代的空间:-Xmn512m
年轻代的空间不能太小,也不能太大。太小的话容易在老生代中产生很多碎片,太大的话会使年轻代中的垃圾收集时间过长。HBase官网给出的一个建议是512M。(配置之后可以观察下配置是否合理,如果太小的话你会发现服务器的CPU使用量急剧上升,因为新生代的回收很占CPU)
另外,强烈建议开启JVM的GC日志,开启的配置其实在hbase-env.sh文件中都写了,只是注释掉了,要用的时候直接把注释去掉就可以了:

hbase-env.sh
1、对CMS收集器的优化:

通过设置JRE参数来针对新生代和老年代使用不同的垃圾回收策略:
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
这里设置年轻带使用Parallel New Collector,这个收集器会停止java进程,但是因为新生代比较小,所以停止的时间是可以接受的。而对老年代,则使用CMS垃圾收集器(尝试在不停止java进程执行的情况下进行垃圾收集,但是在发生Concurrent Mode Failure或Promotion Failure due to Fragmentation的时候依然会导致stop-the-world,所以要尽量避免这两种情况的发生)
Concurrent Mode Failure:在CMS工作时,不断有对象进入持久代,导致持久代空间不足,这时会放弃原本并行执行的垃圾收集,转而使用stop-the-world的复制算法。
Promotion Failure due to Fragmentation:是由老年代内存碎片问题导致的空间不足问题。(因为CMS不会处理内存碎片,所以提前进行CMS并不能解决这种问题,因此要采用MSLAB)
为了避免Concurrent Mode Failure,可以配置以下参数:
-XX:CMSInitiatingOccupancyFraction=70
这个参数的意思是,当老年代的空间分配了70%的时候就开始进行CMS垃圾收集,在一定程度上避免提升失败(默认为90,通常和下面那个参数配合使用?)。
-XX:+UseCMSInitiatingOccupancyOnly:使用CMSInitiatingOccupancyFraction的值作为old区的空间使用率限制来启动CMS垃圾回收。
为了避免Promotion Failure due to Fragmentation,可以开启MSLAB。该特性在0.90.x版本中引入(但默认不开启,需要使用hbase.hregion.memstore.mslab.enabled配置来开启),在0.92版中默认开启(关于MSLAB的介绍,可以参考http://blog.cloudera.com/blog/2011/03/avoiding-full-gcs-in-hbase-with-memstore-local-allocation-buffers-part-3/)。
一个建议的初始配置如下:

export HBASE_REGIONSERVER_OPTS=”-Xmx8g -Xmn128m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:$HBASE_HOME/logs/gc-$(hostname)-hbase.log”

当然,也可以对不同的进程设置不同的JVM参数:

hbase-env.sh
2、对G1收集器的优化:

如果使用的是G1收集器的话(-XX:+UseG1GC),优化的方式会有些不同。
G1收集器相关资料:
http://blog.jobbole.com/109170/
http://product.hubspot.com/blog/g1gc-fundamentals-lessons-from-taming-garbage-collection
下面这些链接针对G1的一些优化配置:
intel的测试和调优:
https://blog.cloudera.com/blog/2014/12/tuning-java-garbage-collection-for-hbase/
官方的博客:这个一定要看
https://blogs.apache.org/hbase/entry/tuning_g1gc_for_your_hbase
官方的博客里对几个方面进行了优化并判断效果:

(a)提高IHOP:-XX:InitiatingHeapOccupancyPercent=xx(默认为45)

设置触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%。如果经过测试,发现Tenured区(老年代?)的大小大于IHOP对应的堆大小的话,就会过量地触发标记周期?。这时,可以将IHOP的值适当调高,使其对应的堆大小稍微大于Tenured区大小。

(b)调整SurvivorRatio 和 MaxTenuringThreshold:-XX:MaxTenuringThreshold = 1

MaxTenuringThreshold表示的是垃圾最大年龄,如果设置为0的话,则年轻代对象不经过Survivor区,直接进入老年代。对于老年代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。
文中将MaxTenuringThreshold设为了1。

(c)调整G1MixedGCCountTarget 和 G1HeapWastePercent

G1MixedGCCountTarget:设置标记周期完成后,对存活数据上限为 G1MixedGCLIveThresholdPercent 的老年代region执行混合垃圾回收的目标次数。默认值是 8 次混合垃圾回收。Java HotSpot VM build 23 中没有此设置。
G1HeapWastePercent:设置您愿意浪费的堆百分比。如果可回收百分比小于堆废物百分比,则不会启动混合垃圾回收周期。默认值是 10%。Java HotSpot VM build 23 中没有此设置。
每次Mixed GC都会清理1/G1MixedGCCountTarget这么多的high-waste regions (其实就是拥有最多垃圾的region,是从最多垃圾的region开始进行收集的),而且越到后面,收集的region中的存活对象就越多,这就会导致清理时间越来越长(因为要拷贝存活对象,在这篇博客的试验中,从100ms增加到了600ms甚至更长)。为了减少这种极端情况,文中做出了两项调整:
G1HeapWastePercent: default (5) → 10:这个不太理解,原文参考如下:
Allow twice as much wasted space in Tenured. Having 5% waste resulted in 6 of the 8 potential Mixed GC events occurring in each Mixed GC cycle. Bumping to 10% waste should chop off 1-2 more of the most expensive events of the Mixed GC cycle.
G1MixedGCCountTarget: default (8) → 16:增加了每次Mixed GC流程中清理的region的次数,但是每次清理的工作量减少为了原来的一半,因此单次清理时间应该是会下降的。

(d)调整Heap Size 和 HBase Configs

观察过去一个月集群中block cache、memstore、static index的最大值,并将这些值乘上1.1作为我们下一步配置的数据(如:10G变为11G)。
设置Eden区的大小:-XX:G1NewSizePercent = 8(起始为8%)。
然后根据如下公式计算heap size:
Heap ≥ (M + B + O + E) ÷ 0.7
M = memstore cap, GB
B = block cache cap, GB
O = static index cap, GB
E = Eden size, GB
计算完后通过以下参数设置heap的大小:
-Xms40960m -Xmx40960m
接着要调整之前设置的IHOP:
IHOP = (memstore cap’s % heap + block cache cap’s % heap + overhead cap’s % heap + 20)
(其中的overhead就是指static index)
-XX:InitiatingHeapOccupancyPercent = IHOP
接着是对HBase进行一些配置(hbase-site.xml):
hfile.block.cache.size → block cache cap ÷ heap size
hbase.regionserver.global.memstore.size → memstore cap ÷ heap size

(e)调整Increase G1 Region Size:-XX:G1HeapRegionSize = #M

官方建议G1收集器中region的数量在2048个以内较为合适,默认的region大小为16M,因为我们调大了heap,因此最好适当调大region的大小。文中将region的大小从16M调整为了32M(region的大小必须为2的指数)。

其他HBase JVM优化相关资料:

1、下面这个链接相当于是对《HBase权威指南》性能优化一章的翻译
http://www.thebigdata.cn/HBase/15677.html
2、官方博客三篇:Avoiding Full GCs in Apache HBase with MemStore-Local Allocation Buffers: Part 1\2\3
http://blog.cloudera.com/blog/2011/02/avoiding-full-gcs-in-hbase-with-memstore-local-allocation-buffers-part-1/
http://blog.cloudera.com/blog/2011/02/avoiding-full-gcs-in-hbase-with-memstore-local-allocation-buffers-part-2/
http://blog.cloudera.com/blog/2011/03/avoiding-full-gcs-in-hbase-with-memstore-local-allocation-buffers-part-3/

总结:

不同的集群配置、虚拟机都有不同的优化方法,在进行优化前最好根据监控框架给出的各种数据(GC类型、频率、每次GC时间等,强烈建议参考https://blogs.apache.org/hbase/entry/tuning_g1gc_for_your_hbase),分析某些地方是否存在性能问题,然后再进行相应的优化测试。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • HBase那些事 @(大数据工程学院)[HBase, Hadoop, 优化, HadoopChen, hbase]...
    分痴阅读 3,925评论 3 17
  • 转载blog.csdn.net/ning109314/article/details/10411495/ JVM工...
    forever_smile阅读 5,350评论 1 56
  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 5,946评论 2 31
  • http://www.cnblogs.com/angeldevil/p/3801189.html值得一看 Clas...
    snail_knight阅读 1,409评论 1 0
  • 作者:一字马胡 转载标志 【2017-11-12】 更新日志 日期更新内容备注 2017-11-12新建文章初版 ...
    beneke阅读 2,184评论 0 7