hbase针对fullgc所做的优化(Memstore所作的优化 针对BlockCache所作优化)

先看:
深入研究java gc https://blog.51cto.com/12445535/2372976
老年代 CMS gc回收算法 对hbase的影响 https://blog.51cto.com/12445535/2373206

1、最原始的HBase CMS GC相当严重,经常会因为碎片过多导致Promotion Failure,严重影响业务的读写请求。
2、分别是针对Memstore所作的两个优化:Thread-Local Allocation Buffer和MemStore Chunk Pool
3、以及针对BlockCache所作的优化:BucketCache方案。
4、在详细介绍这几个优化之前有必要简单介绍一下HBase GC优化的目标,很直观的,
5、第一是要尽量避免长时间的Full GC,避免影响用户的读写请求;
6、第二是尽量减少GC时间,提高读写性能;
7、接着分别来看HBase针对GC所做的各种优化:

MemStore GC优化一 - Thread-Local Allocation Buffer
回顾hbase数据写流程
1、HBase数据写入操作实际上并没有直接将数据写入磁盘,
2、而是先写入内存并顺序写入HLog,
3、之后等待满足某个特定条件后统一将内存中的数据刷新到磁盘。
4、一个RegionServer通常由多个Region组成,每张Region通常包含一张表的多个列族,而每个列族对应一块内存区域,这块内存被称为MemStore,
5、很显然,一个RegionServer会由多个Region构成,一个Region会由多个MemStore构成。

老版本hbase中:
1、最原始的HBase版本存在很严重的内存碎片,经常会导致长时间的Full GC,其中最核心的问题就出在MemStore这里。
2、因为一个RegionServer由多个Region构成,不同Region的数据写入到对应Memstore,
3、在JVM看来其实是混合在一起写入Heap(堆内存)的

为了优化这种内存碎片可能导致的Full GC,HBase借鉴了Arena Allocation内存管理方式,它通过顺序化分配内存、内存数据分块等特性使得内存碎片更加粗粒度,有效改善Full GC情况;

具体实现原理如下:

  1. 每个MemStore会实例化出来一个MemStoreLAB
  2. MemStoreLAB会申请一个2M大小的Chunk数组和一个Chunk偏移量,初始值为0
  3. 当一个KeyValue值插入MemStore后,MemStoreLAB会首先通过KeyValue.getBuffer()取得data数组,并将data数组复制到Chunk数组中,之后再将Chunk偏移量往前移动data.length
  4. 如果当前Chunk满了之后,再调用new byte[ 2 1024 1024]申请一个新的Chunk

提示:
很显然,通过申请2M大小的Chunk可以使得内存碎片更加粗粒度,官方在优化前后通过设置 -xx:PrintFLSStatistics = 1
未优化前碎片会大量出现导致频繁的Full GC,优化后虽然依然会产生大量碎片,但是最大碎片大小一直会维持在1e+08左右,极大地降低了Full GC频率。

MemStore GC优化二 – MemStore Chunk Pool
MemStore Chunk Pool的核心思想为:
1、如果这些Chunk能够被循环利用,系统就不需要申请新的Chunk,这样就会使得YGC频率降低,晋升到老生代的Chunk就会减少,CMS GC发生的频率就会降低。

为什么Chunk不能被循环利用呢?
1、一旦一个Chunk写满之后,系统就会重新申请一个新的Chunk,
2、这些Chunk大部分都会经过多次YGC之后晋升到老生代,如果某个Chunk再没有被引用就会被JVM垃圾回收。
3、很显然,不断申请新的Chunk会导致YGC频率不断增多,YGC频率增加必然会导致晋升到老生代的Chunk增多,进而增加CMS GC发生的频率。

具体实现如下:

  1. 系统会创建一个Chunk Pool来管理所有未被引用的chunks,这些chunk就不会再被JVM当作垃圾回收掉了
  2. 如果一个Chunk没有再被引用,将其放入Chunk Pool
  3. 如果当前Chunk Pool已经达到了容量最大值,就不会再接纳新的Chunk
  4. 如果需要申请新的Chunk来存储KeyValue,首先从Chunk Pool中获取,如果能够获取得到就重复利用,如果为null就重新申请一个新的Chunk

官方针对该优化也进行了简单的测试,使用jstat -gcutil对优化前后的JVM GC情况进行了统计,具体的测试条件和测试结果如下所示:

测试条件:
HBase版本:0.94
JVM参数:-Xms4G -Xmx4G -Xmn2G
单条数据大小:Row size=50 bytes, Value size=1024 bytes
实验方法:50 concurrent theads per client, insert 10,000,000 rows
//cdh中参数为:
根据 MSLAB 分配方式分配的块区大小
hbase.hregion.memstore.mslab.chunksize = 2M
MemStoreChunkPool&MSLAB提升HBASE GC性能 https://blog.csdn.net/map_lixiupeng/article/details/40914567

BlockCache优化-BucketCache方案
1、BucketCache。这种方案还是采用“将小碎片整理为大碎片”的思路,
2、由程序在初始化的时候就申请了很多大小为2M的Bucket,数据Block的Get/Cache动作只是对这片空间的访问/覆写,CMS碎片会自然大大降低。

1、其中heap模式表示将数据存储在JVM堆内存,
2、offheap模式表示将数据Block存储到操作系统内存,
3、file模式表示将数据Block存储到类似于SSD的外部高速缓存上;
//很显然,offheap模式和file模式根本没有将数据Block存在JVM堆内存,所以几乎不会出现Full GC,而heap模式即使数据存储在JVM堆内存,也会因为内存由程序独立管理大大降低内存碎片。
从结果可以看出,BucketCache大大减少了碎片的产生,而且YGC和FGC时间也极大地得到了改善。

参考链接:
http://hbasefly.com/2016/05/29/hbase-gc-2/

原文地址:https://blog.51cto.com/12445535/2373223

时间: 2024-10-27 13:27:07

hbase针对fullgc所做的优化(Memstore所作的优化 针对BlockCache所作优化)的相关文章

摄影用户的使针对UI设计师做最优设计

如果全团队是Mac的话,Sketch是非常好用且适应现在的设计趋势的.我们公司现在已经全部都用Sketch了.Sketch尤其适合设计师职能不细分的中小团队和个人作品的制作.线框到视觉稿可以在一个软件里完成,能省去不少时间. Sketch的用户社区也比较繁荣健康,让人挺有信心继续用下去.(Sketch的扩展开发比PS容易的样子,我看github上还有人做了自动生成iconfont之类的高级脚本--) 其他回答基本都只是在特色功能上评论,确实,这软件一开始的印象可能只有小巧便捷够用.但用多了后就会

pt-table-checksum 针对某个库做数据校验

背景: 我们现在需要对线上主库(简称A)6个备库中的某个库(简称B)做数据校验: 方式:pt-table-checksum工具 <1> 第一步需要配置dsns,这样可以指定备库校验 在A库上某个库中: CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) ); INS

【凯子哥带你做高仿】“煎蛋”Android版的高仿及优化(三)——使用GreenDao实现本地Sqlite缓存

到目前为止,煎蛋的Android项目算是告一段落了,功能基本都已完成,那么今天,我就介绍一下在煎蛋这个项目里,是怎么完成数据缓存功能的.想看代码的请戳煎蛋项目的GITHUB地址 转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 缓存功能的解决方案 配置GreenDao 实现缓存功能 其他资料 缓存功能的解决方案 因为算是一个阅读类的应用,所以说如果在无网络情况下,用户打开App还能看到内容的话,属于比较好的用户体验.那么,这就涉及到本地缓存了. 本地缓存

针对Kubernetes群集做资源限制

Kubernetes对资源的限制实际上是通过cgroup来控制的,cgroup是容器的一组用来控制内核如何运行进程的相关属性集合,针对内存.CPU各种设备都有对应的cgroup. 默认情况下,Pod运行没有CPU和内存的限制,这就意味着系统中的任何pod将能够像执行该pod所在的节点一样,消耗足够多的CPU和内存,一般会针对某些应用的Pod资源进行资源限制,这个资源限制是通过resources的limits来实现的. 注:以下只是在yaml文件中进行资源限制的一个片段,并不是完整的yaml文件!

20亿与20亿表关联优化方法(超级大表与超级大表join优化方法)

记得5年前遇到一个SQL.就是一个简单的两表关联.SQL跑了几乎相同一天一夜,这两个表都非常巨大.每一个表都有几十个G.数据量每一个表有20多亿,表的字段也特别多. 相信大家也知道SQL慢在哪里了,单个进程的PGA 是绝对放不下几十个G的数据,这就会导致消耗大量temp tablespace,SQL慢就是慢在temp来回来回来回...的读写数据. 遇到这样的超级大表与超级大表怎么优化呢?这篇文章将告诉你答案. 首先创建2个測试表 t1,t2 数据来自dba_objects create tabl

Lucene in action 笔记 term vector——针对特定field建立的词频向量空间,用cos计算针对该field的文档相似度

摘自:http://blog.csdn.net/fxjtoday/article/details/5142661 Leveraging term vectors所谓term vector, 就是对于documents的某一field,如title,body这种文本类型的, 建立词频的多维向量空间.每一个词就是一维, 这维的值就是这个词在这个field中的频率. 如果你要使用term vectors, 就要在indexing的时候对该field打开term vectors的选项: Field op

Android应用性能优化系列视图篇——SVG图片版本兼容及性能优化解决方案

SVG矢量图在图片表现力方面远远优于PNG位图,同时在可维护性和修改性方面也比位图要方便很多.尽管Android在5.0版本就引入了SVG图片的解决方案:Vector.然而,兼容性和性能方面却是差强人意,以至于至今都未能广泛使用. 本篇博客给大家带来一套较为不错的解决方案:SVG-Android(作者是本人...),相比于Vector,其在兼容性方面能够兼容到2.3以上,同时在性能方面,也有了质的提升. 开源库地址:https://github.com/MegatronKing/SVG-Andr

「mysql优化专题」详解引擎(InnoDB,MyISAM)的内存优化攻略?(9)

注意:以下都是在MySQL目录下的my.ini文件中改写(技术文). 一.InnoDB内存优化 InnoDB用一块内存区域做I/O缓存池,该缓存池不仅用来缓存InnoDB的索引块,而且也用来缓存InnoDB的数据块. 1.innodb_log_buffer_size 决定了InnoDB重做日志缓存的大小,可以避免InnoDB在事务提交前就执行不必要的日志写入磁盘操作. 2.设置Innodb_buffer_pool_size 改变量决定了InnoDB存储引擎表数据和索引数据的最大缓存区大小. 二.

web性能优化之---JavaScript中的无阻塞加载性能优化方案

一.js阻塞特性 JS 有个很无语的阻塞特性,就是当浏览器在执行JS 代码时,不能同时做其他任何事情,无论其代码是内嵌的还是外部的. 即<script>每次出现都会让页面等待脚本的解析和执行(不论JS是内嵌的还是外链的),JS代码执行完成后,才继续渲染页面. 二.优化方案 1.尽管脚本的下载过程并不会相互影响,但页面仍然必须等待所有JS下载并执行完成才能继续.所以尽可能将所有<script>标签放置在页面底部,紧靠关闭标签</body>的上方.此方法可以保证页面在脚本运