在0.90 版本后的 HBase,引入了一个高级机制用于缓解堆内存碎片的问题。此内存碎片问题的产生的主要原因是由于 memstore 上的扰动(频繁的分配与释放内存空间)导致。对应解决此问题的机制为Memstore-Local Allocation Buffer,简称MSLAB。

在一个memstore 满了后,RegionServer会将它flush到hdfs。这样对于长期存在的Key-Value pair(存在于Old Generation 中),则会在堆内存中产生holes(孔洞)。之后若是需要分配新内存,但是没有足够的连续堆内存空间的话,则会触发Full GC,也就会导致stop-the-world 暂停。继而GC机制会重写整个堆内存,若是使用的默认的 CMS算法,则用的是mark-sweep-compact方式进行。此过程会暂停较长时间,影响系统性能。

减少这部分compacting-collection带来影响的重点是:减少碎片。也就是MSLAB做的事情。它主要的思想是:只允许在堆中分配相同大小的对象。一旦这些对象提升到Old Generation,并且最终被回收后,它们会在堆中留下固定大小的holes。而接下来分配的新对象,由于也是相同大小,则可以直接使用这些holes。也就不会产生promotion errors(或是有关空间不足的报错)。因此也就不会产生这类stop-the-world compacting collection。

MSLAB是许多固定大小的缓冲区,用于存储不同大小的KeyValue实例。当一个缓冲区无法完全承载一个新加入的KeyValue时,则会认为此缓冲区已满,并且创建一个新的固定大小的缓冲区。

MSLAB的功能默认在0.92以及之后的版本中已启用。可以使用hbase.hregion.memstore.mslab.enabled 的配置进行修改。每个分配的固定缓冲大小由hbase.hregion.memstore.mslab.chunksize 决定,默认为2MB。这个参数可以根据KeyValue的大小进行调整,例如若是KeyValue的大小为100KB,则可以适当增加MSLAB的大小,以让一个缓冲区可以存储更多的KeyValue。

在缓冲区中,也有一个可存储大小的上边界。由 hbase.hregion.memstore.mslab.max.allocation 指定,默认为256KB。任何比此值大的KeyValue会被直接存储到JVM堆内存。如果我们存储大量比256KB大的KeyValue,则会更早遇到碎片相关的问题导致的暂停。

当然,使用MSLAB也是有代价的:它们会造成对内存的浪费,因为不可能每个buffer都会完全使用完所有字节。所以一个buffer中没有使用到的内存则会被浪费。所以这里是一个权衡:使用MSLABs 从GC中获益,减少碎片导致的暂停,但是内存的使用率不会很高效。若是不使用MSLABs,则可以获取更高效的内存使用率,但是需要处理GC暂停造成的问题。

不过需要注意的是:GC 算法的实现现在已经越来越好,所以在某些算法中,禁用MSLABs后带来的益处可能更大。因为这些算法可以高效并行地维护堆内存以及碎片整理。特别是G1 GC中,已经有用户表示:若是使用G1 GC,则可以关闭MSLABs 功能,而不会导致任何性功能下降。

最后,由于MSLAB buffers需要额外的byte array 复制操作,所以使用缓冲区会比直接使用KeyValue实例稍慢一些。有些客户会根据实际生产环境中的性能表现,衡量是否要开启MSLAB的功能。不过一般是建议开启此功能,因为它用于解决的是GC的长时间暂停。如果没有特定原因,一般不要关闭此功能。

HBase 中 Memstore-Local Allocation Buffer的更多相关文章

  1. 线程TLAB局部缓存区域(Thread Local Allocation Buffer)

    TLAB(Thread Local Allocation Buffer) 1,堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的 2,Sun ...

  2. HBase中Memstore存在的意义以及多列族引起的问题和设计

    Memstore存在的意义 HBase在WAL机制开启的情况下,不考虑块缓存,数据日志会先写入HLog,然后进入Memstore,最后持久化到HFile中.HFile是存储在hdfs上的,WAL预写日 ...

  3. 堆中的线程私有缓存区域TLAB(Thread Local Allocation Buffer)

    TLAB产生的原因 堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据 由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的 为避免多个线程操作同一地址,需要 ...

  4. 关于hbase中的hbase-site.xml 配置详解

    该文档是用Hbase默认配置文件生成的,文件源是 hbase-default.xml hbase.rootdir 这个目录是region server的共享目录,用来持久化HBase.URL需要是'完 ...

  5. 为什么不建议在 HBase 中使用过多的列族

    我们知道,一张 HBase 表包含一个或多个列族.HBase 的官方文档中关于 HBase 表的列族的个数有两处描述: A typical schema has between 1 and 3 col ...

  6. HBase 中读 HDFS 调优

    HDFS Read调优 在基于 HDFS 存储的 HBase 中,主要有两种调优方式: 绕过RPC的选项,称为short circuit reads 开启让HDFS推测性地从多个datanode读数据 ...

  7. HBase中MVCC的实现机制及应用情况

    MVCC(Multi-Version Concurrent Control),即多版本并发控制协议,广泛使用于数据库系统.本文将介绍HBase中对于MVCC的实现及应用情况. MVCC基本原理 在介绍 ...

  8. HBase中的备份和故障恢复方法

    本文将对Apache HBase可用的数据备份机制和大量数据的故障恢复/容灾机制做简要介绍. 随着HBase在重要的商业系统中应用的大量添加,很多企业须要通过对它们的HBase集群建立健壮的备份和故障 ...

  9. [翻译]HBase 中的 ACID

    同前面翻译的一篇关联的,同作者的另一篇:ACID in HBase 这一篇不是单纯地描述一个问题,而是以 ACID 为主题,介绍了其在 HBase 中各个部分的体现及实现. ACID,即:原子性(At ...

随机推荐

  1. hdu 2187 悼念512汶川大地震遇难同胞——老人是真饿了(贪心)

    新人题:n2的排序就可以过 #include <stdio.h> #include <stdlib.h> int main() { int c,n,i,j,o; ],b[],m ...

  2. git在idea中使用

    (1)创建README.md文件 fengli@DESKTOP-FEQ1N4I MINGW32 /f/workspace/imallproject (master)$ touch README.md ...

  3. ASP.NET MVC 方法View返回的两种方式

    1.参数为字符串类型 例如我们在地址栏输入http://localhost:56431/Test/Index,会查找TestController类下的Index方法并执行,如下图 当我们返回字符串类型 ...

  4. H5_0016:js获取网络中配置文件中的参数

         //获取网络配置文件中的参数      $.get("https://cdn.com/share.json", function(e) {       //console ...

  5. Winform递归绑定树节点

    /// <summary> /// 绑定树节点 /// </summary> /// <param name="pid"></param& ...

  6. react-native构建基本页面6---打包发布

    签名打包发布Release版本的apk安装包 请参考以下两篇文章: ReactNative之Android打包APK方法(趟坑过程) React Native发布APP之签名打包APK 如何发布一个a ...

  7. ubuntu set up 4 - 设置和软件

    1. Top Bar显示日期 https://askubuntu.com/questions/966576/customizing-tray-taskbar-date-display-in-ubunt ...

  8. LED And Incandescent, Who Is Suitable For Holiday Lighting?

    Fast-fire advantages of LED lighting: Eco-friendly-LEDs are not made of toxic chemicals, such as mer ...

  9. PHP返回json数据为null

    文件编码非utf-8,导致json_encode()返回false:最后前台ajax接收不到数据

  10. AntDesign(React)学习-11 使用mobx

    mobx 是由 Mendix.Coinbase.Facebook 开源和众多个人赞助商所赞助的. mobx和redux类似,也可以用来进行状态管理,并且更简单,更灵活.初次研究,先实现一个最简单的功能 ...