`
shenchunhui
  • 浏览: 146182 次
  • 来自: 杭州
社区版块
存档分类
最新评论

GC trouble on HBase

阅读更多
最近几天一直纠结在HBase的GC问题上,虽然没有质的收获,但也有一些新的心得,对HBase上GC产生的过程有了更深的认识。

由于基本采用的都是CMS回收,所以讨论也针对的是CMS回收。

GC问题可以简单地归结为YGC停顿过长和FullGC触发。

1.FullGC触发
CMS下触发FullGC的原因:
a.Concurrent mode failure,old区要分配内存了,但是old区空间不够,而此时CMS正在进行中。
解决方法:降低YGC频率,降低CMS gc触发时机(降低CMSInitiatingOccupancyFraction的值)

b.Promotion Failed,old区要分配内存了,但是找不到空间分配,却还没达到CMS的触发值,这个问题主要是由heap碎片+YGC晋升对象过大导致,HBase中YGC期间晋升的大对象为:LRUBlockCache中的Block(64KB)和开启MSLab后的Chunk(2MB,Chunk介绍http://www.taobaotest.com/blogs/2310),这两个问题可以通过BucketCache(HBASE-7404)和ChunkPool(HBASE-8163)解决之


2.YGC停顿过长
YGC时间构成=扫描stack+扫描card table+扫描root+对象拷贝,
扫描stack是扫描线程栈找出活跃对象的时间,一般比较快;

Hotspot将old区按512字节的page进行划分,存放到内部的card表中,所以扫描card table的时间,取决于old区的大小;

当修改old区的对象的某一个引用后,那么就会标记这个对象所在的page为脏页,并且将这个page中的所有对象作为root,进行扫描,所以如果频繁地更改old区对象中的引用,那么就会有很多root需要扫描,这部分时间基本决定了YGC的时间;

举个HBase中的例子,Memstore中有个排序Set用来存储刚刚写进来的keyvalue,当flush后,这个Set对象及其中的KeyValue对象就会死亡,由于flush周期较长,所以很多对象会在old区存活一定的时间。每当向Memstore写入一条数据就会向Set中插入一条KeyValue,这就意味着我们会修改这个新插入的Keyvalue对应的Node Entry的前继对象的next指针的引用


YGC过程中,所有活着的对象会拷贝到to space或者old区,这些活着对象的大小决定了拷贝过程的时间


按照对象的存活时间我们可以将HBase中的对象分为三类:1.函数内的临时对象;2.存活一定周期的对象(Memstore中的KeyValue,LRUBlockCache中的Block,开启WAL压缩后的row/table/region/cf对象);3.永久存活的对象(开启BucketCache后的Block,开启ChunkPool后的Chunk);

在开启BucketCache和ChunkPool,YGC后晋升的数据会十分的少,拷贝对象的时间可以忽略不计

于是,在一个YGC周期中,新产生的类型2对象的数目会直接决定了YGC的时间,相比而言,KeyValue比Block的数目多很多,这就是说一个YGC周期写入的KeyValue数目决定着YGC的时间

关于YGC的RT:
1.HBase的写是造成YGC RT过长的主因
2.在BucketCache后,HBase的读对YGC RT的影响较小


关于YGC的频率,有这么2个发现:
1.compaction期间,YGC频率大大加快
2.单条put比批量put,YGC频率要快很多,通过观察,单条put的方式,1G young区,4000TPS,大概2秒一次的YGC,而批量方式,则YGC周期要长很多,单次YGC的时间也会长很多


关于UseAdaptiveSizePolicy的配置
配了后直接abort!!
为了控制YGC的时间,我们可以降低young区的大小,但是compaction期间,YGC频率会大大加快,所以想到启用UseAdaptiveSizePolicy,但是实践后发现会直接导致Server Abort,原因是由于在调整young区的eden s0 s1的比例后HeapMax会不一致,导致内部报错


关于SurvivorRatio的配置
通过gcutil观察每次ygc后to space的所占比例,如果很低,那么可以加大这个配置值,在开启bucketcache和chunkpool后,这个配置值可以配的比较大。如果发现YGC后to space的比例一直是100%,那说明to space太小了,直接导致很多对象进入了old区

关于young区的大小
目前我们配置的young大小由4G,2G,1G,属于比较大的;在开启了BucketCache和ChunkPool后,晋升数据很少;对于RT敏感的应用,可以根据YGC的频率, 减少young区到512M甚至256M,来减少RT


YGC优化:
1.减小-XX:MaxTenuringThreshold,默认值为15,通常意味着一个对象经过15次YGC后还活着则会晋升到old区(当然还会有一些额外的因素,来影响晋升的速度),对于HBase中的对象,1.函数中的临时对象会很快淘汰;2.永久对象会一直在old区;3.周期存活的对象一般会晋升到old区后再死亡,所以我们可以减小这个值,一来可以减少对象拷贝,二来可以减少young区的对象数据,减少ygc期间的扫描

效果:1G young,50/100 KeyValue, MaxTenuringThreshold=15 -> MaxTenuringThreshold=3, YGC时间 0.034ms->0.014ms, 频率不变

2.终极改进:基于字节流的排序Set,向set中插入数据的时候,不再需要改变引用关系,而只需要改变byte值,这样可以完美的解决YGC问题,TODO。。。
分享到:
评论
1 楼 blackproof 2015-03-17  
chunkpool怎么用的,要是设置了0.1会跟 memstore和blockcache抢rs内存吗

相关推荐

    GC优化利器HBase2.0全链路offheap.pdf

    讲师:林明--阿里巴巴-云hbase内核开发 高级工程师 内容概要: gc问题会带来访问毛刺,回顾一下读写链路,然后看看全链路offheap怎么减少gc停顿、减低p999延迟的。

    MapReduce on Hbase

    基于Hadoop的mapreduce 在hbase上的使用,基于Hadoop的mapreduce 在hbase上的使用

    Interactive SQL query on HBase (孙元浩)

    Interactive SQL query on HBase (孙元浩)Interactive SQL query on HBase (孙元浩)

    SparkOnHBase:SparkOnHBase

    :warning: Cloudera Labs中的Spark On HBase项目在2015年被合并到上游HBase项目中,并且自CDH 5.7起CDH附带了Backport SparkOnHBase 概述 这是一个用于Spark的HBase的简单可重用库 功能性 当前功能支持以下功能 批量...

    HbaseTemplate 操作hbase

    java 利用 sping-data-hadoop HbaseTemplate 操作hbase find get execute 等方法 可以直接运行

    pinpoint的hbase初始化脚本hbase-create.hbase

    搭建pinpoint需要的hbase初始化脚本hbase-create.hbase

    mapreduce方式入库hbase hive hdfs

    mapreduce方式入库hbase hive hdfs,速度很快,里面详细讲述了代码的编写过程,值得下载

    HBase3.0参考指南

    Herein you will find either the definitive documentation on an HBase topic as of its standing when the referenced HBase version shipped, or it will point to the location in Javadoc or JIRA where the ...

    HBase数据库设计.doc

    1. HBase有哪些基本的特征? 1 HBase特征: 1 2. HBase相对于关系数据库能解决的问题是什么? 2 HBase与关系数据的区别? 2 HBase与RDBMS的区别? 2 3. HBase的数据模式是怎么样的?即有哪些元素?如何存储?等 3 1...

    HBase(hbase-2.4.9-bin.tar.gz)

    HBase(hbase-2.4.9-bin.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System...

    HBase学习利器:HBase实战

    HBase开发实战,HBase学习利器:HBase实战

    Hbase资源整理集合

    HBase 官方文档.pdf HBase的操作和编程.pdf HBase Cpressr优化与实验 郭磊涛.pdf null【HBase】Data Migratin frm Gri t Clu Cmputing - Natural Sienes .pdf 分布式数据库HBase快照的设计与实现.pdf 【HBase】...

    hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架

    hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架。 针对HBase各版本API(1.x~2.x)间的差异,在其上剥离出了一层统一的抽象。并提供了以类SQL的方式来读写HBase表中的数据。对...

    Hbase 权威指南 全书

    Herein you will find either the definitive documentation on an HBase topic as of its standing when the referenced HBase version shipped, or it will point to the location in Javadoc or JIRA where the ...

    HBase开启审计日志

    HBase开启审计日志

    hbase资料api

    HBASE

    java大数据作业_3HBase

    1. 请用java集合的代码描述HBase的表结构 2. 请简述HBase中数据写入最后导致Region分裂的全过程 3. 如果设计一个笔记的表,表中要求有笔记的属性和笔记的内容,怎么做 4. HBase部署时如何指定多个zookeeper 5. HBase...

    HBase.High.Performance.Cookbook.epub

    This book is intended for developers and architects who want to know all about HBase at a hands-on level. This book is also for big data enthusiasts and database developers who have worked with other ...

    hbase-2.3.5单机一键部署工具

    注意:zookeeper3.4.13和hbase2.3.5都是采用docker-compose方式部署 原文链接:https://blog.csdn.net/m0_37814112/article/details/120915194 说明:使用外部zookeeper3.4.13之hbase2.3.5一键部署工具,支持部署、...

    hbase 资源合集 hbase 企业应用开发实战 权威指南 hbase 实战 hbase 应用架构

    hbase 资源合集 hbase 企业应用开发实战 权威指南 hbase 实战 hbase 应用架构

Global site tag (gtag.js) - Google Analytics