首页 > 其他分享 >hbase gc MemStore-Local Allocation Buffer

hbase gc MemStore-Local Allocation Buffer

时间:2023-06-04 23:08:06浏览次数:64  
标签:Buffer chunk 碎片 Allocation GC 内存 Heap gc


 

Arena Allocation,是一种GC优化技术,它可以有效地减少因内存碎片导致的Full GC,从而提高系统的整体性能。本文介绍Arena Allocation的原理及其在Hbase中的应用-MSLAB。

背景

假设有1G内存,我顺序创建了1百万个对象,每个对象大小1K,Heap会被渐渐充满且每个对象以创建顺序相邻。此时,如果我释放50万个奇数对象,即 1 3 5 7后,剩余空间会多出500M,而这段内存空间就不再连续了。问题出现?
如果我打算new一个2K大小的对象,JVM将无从分配它,因为找不到连续可用的内存空间来容纳这个对象,就算Heap当时还有500M的剩余空间,也无能为力。最终,JVM会选择触发Full GC重新压缩内存使之连续,然后再分配。

结论:触发Full GC,并不只有在内存满或达到触发比例的时候,还有可能是因为内存碎片。

产生内存碎片的主要原因是:

  • 分配的大小不一。
  • 分配的空间不连续。

 

如何检测因内存碎片触发了Full GC?
通过启动java时,添加 -XX:PrintFLSStatistics=1 参数来打印每次gc前后的Heap余量。较大的余量,可以怀疑Heap中存在内存碎片过多。
另外这篇blog有更详细的图文解释:

http://www.cloudera.com/blog/2011/02/avoiding-full-gcs-in-hbase-with-memstore-local-allocation-buffers-part-2/

HBase中的内存碎片

HBase为了提高写入性能,为每个region添加了一个内存写缓存-Memstore。当单个Memstore的大小达到memstore.size或Heap内存达到hbase.regionserver.global.memstore.upperLimit/lowerLimit百分比限制时,就会触发整个region的flush,最终将所有数据写入HDFS并释放region下所有Memstores占用的内存(GC不一定及时)。

Region flush导致内存碎片的示意图:

hbase gc MemStore-Local Allocation Buffer_hbase

左边五颜六色的是不同的region在内存中的位置,它是无序的,因为客户端的请求是无规律的。此时假设黄色的region触发了flush,那么右边将会出现与之对应的多个空洞,即内存碎片。??这张图以region为粒度,仅仅是为了更直观地表示这种现象。真实场景中,这些空洞是更细粒度的KeyValue级对象,它能直接导致创建对象时触发Full GC。

Arena Allocation

Arena Allocation是一种非传统的内存管理方法。它通过顺序化分配内存,内存数据分块等特性使内存碎片粗化,有效改善了内存碎片导致的Full GC问题。

它的原理:

  • 创建一个大小固定的bytes数组和一个偏移量,默认值为0。
  • 分配对象时,将新对象的data bytes复制到数组中,数组的起始位置是偏移量,复制完成后为偏移量自增data.length的长度,这样做是防止下次复制数据时不会覆盖掉老数据(append)。
  • 当一个数组被充满时,创建一个新的数组。
  • 清理时,只需要释放掉这些数组,即可得到固定的大块连续内存。

在Arena Allocation方案中,数组的大小影响空间连续性,越大内存连续性越好,但内存平均利用率会降低。

HBase的解决方案-MSLAB

MSLAB,全称是 MemStore-Local Allocation Buffer,是Cloudera在HBase 0.90.1时提交的一个patch里包含的特性。它基于Arena Allocation解决了HBase因Region flush导致的内存碎片问题。

MSLAB的实现原理(对照Arena Allocation,HBase实现细节):

  • MemstoreLAB为Memstore提供Allocator。
  • 创建一个2M(默认)的Chunk数组和一个chunk偏移量,默认值为0。
  • 当Memstore有新的KeyValue被插入时,通过KeyValue.getBuffer()取得data bytes数组。将data复制到Chunk数组起始位置为chunk偏移量处,并增加偏移量=偏移量+data.length。
  • 当一个chunk满了以后,再创建一个chunk。
  • 所有操作lock free,基于CMS原语。

优势:

  • KeyValue原始数据在minor gc时被销毁。
  • 数据存放在2m大小的chunk中,chunk归属于memstore。
  • flush时,只需要释放多个2m的chunks,chunk未满也强制释放,从而为Heap腾出了多个2M大小的内存区间,减少碎片密集程度。

开启MSLAB

hbase.hregion.memstore.mslab.enabled=true // 开启MSALB
hbase.hregion.memstore.mslab.chunksize=2m // chunk的大小,越大内存连续性越好,但内存平均利用率会降低
hbase.hregion.memstore.mslab.max.allocation=256K // 通过MSLAB分配的对象不能超过256K,否则直接在Heap上分配,256K够大了


标签:Buffer,chunk,碎片,Allocation,GC,内存,Heap,gc
From: https://blog.51cto.com/u_2465818/6412764

相关文章

  • 题解:【AGC054D】 (ox)
    题目链接Larry76牛牛首先考虑没有ox怎么做,就是将括号序列调成合法。\(|S|\)不大直接模拟一遍,记录\(now\)表示一个前缀权值,当遇到一个(时\(+1\),遇到一个)时\(-1\),当\(now<0\)的时候说明序列不合法即)多了,暴力向后找到第一个(交换到当前的)前面。这样我们......
  • springcloud入门
    1、启动注册中心springcloud-eureka-serverspring.cloud.EurekaServerApplication2、访问注册中心http://127.0.0.1:8100/root/eureka3、启动配置中心springcloud-config-serverspring.cloud.ConfigServerApplication启动完毕后可以在注册中心看到配置中心已经注册4......
  • C语言gcc编译环境搭建
     第一步,根据以下链接下载gcc工具包;gcc工具包下载地址:链接:https://pan.baidu.com/s/1JqEjakTcWLPv7p6zkah6sA提取码:k4d2第二步,将下载好的工具包解压到本地;第三步,找到gcc工具包目录下的bin文件夹所在的目录,将该路径添加到系统的环境变量中; 第四步,打开CMD,输入gcc,,验证......
  • 气相色谱质谱联用仪GCMS-QP2020性能和设计特点
    气相色谱质谱联用仪GCMS-QP2020的特点:集成高灵敏度和低实验成本:依托质谱技术,兼容多种载气类型(He,H2,N2),开拓质谱技术分析极限。无需更换离子源,轻松切换离子化方式。1)高灵敏度采用屏蔽板(Shield)技术的整体惰性化高灵敏度离子源和的“偏转透镜(ODlens)技术”配合“新型低噪音CPU板”,有效降......
  • golang 学习之 etcd protobuffer grpc gorm 服务注册发现 go-micro
    1.etcd使用步骤1)下载:https://github.com/etcd-io/etcd/releases/2)配置环境变量3)编辑local-cluster-profile文件:(利用goreman启动方式,生产环境参考官方文档)etcd1:etcd--nameinfra1--listen-client-urlshttp://127.0.0.1:2379--advertise-client-urlshttp://127.0.0.1......
  • LangChain教程 – 如何构建自定义知识聊天机器人
    您可能已经了解到过去几个月发布的大量AI应用程序。您甚至可能已经开始使用其中的一些。ChatPDF和CustomGPTAI等AI工具已经对人们变得非常有用——这是有充分理由的。您需要滚动浏览50页文档才能找到简单答案的日子已经一去不复返了。相反,您可以依靠AI来完成繁重的工作......
  • pgcenter 类似top 的pg 观测cli工具
    pgcenter是基于golang开发的,类似top观测pg运行情况的工具,内部支持了不少pg扩展系统的metrics指标特性类似top支持配置管理(查看以及编辑,同时还支持reload)日志文件查看支持等待事件的profiler说明pgcenter工具是一个值得使用的工具,对于需要快速发现问题的时候是一个......
  • use a circular buffer for video frames on iOS
    https://stackoverflow.com/questions/33581369/how-to-use-tpcircularbuffer-for-videohttps://github.com/jeremytregunna/Ringhttps://www.codesd.com/item/is-it-possible-to-use-a-circular-buffer-for-video-images-on-ios.htmlhttp://atastypixel.com/blog/a-simple-fa......
  • [AGC038E] Gachapon
    ProblemStatementSnukefoundarandomnumbergenerator.Itgeneratesanintegerbetween$0$and$N-1$(inclusive).Anintegersequence$A_0,A_1,\cdots,A_{N-1}$representstheprobabilitythateachoftheseintegersisgenerated.Theinteger$i$($0......
  • SpringCloud大文件分片上传/多线程上传
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......