在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. Hyperparameter tuning

    超参数调整 详细可以参考官方文档 定义 在拟合模型之前需要定义好的参数 适用 Linear regression: Choosing parameters Ridge/lasso regression ...

  2. 04-SV连接设计和测试平台

    1.验证一个设计的步骤: 生成输入激励,捕捉输出响应,决定对错和进度 2.连接设计和测试平台 信号连接:SystemVerilog已经扩展了传统的reg类型,可以像wire那样用来连接模块,它的新名字 ...

  3. Wannafly Camp 2020 Day 2B 萨博的方程式 - 数位dp

    给定 \(n\) 个数 \(m_i\),求 \((x_1,x_2,...,x_n)\) 的个数,使得 \(x_1 \ xor\ x_2\ xor\ ...\ xor\ x_n = k\),且 \(0 ...

  4. VS中关于数据库的操作

    1.数据库迁移 第一步: 第二步: 在窗口中选择项目中的EntitiyFramwork项目(与数据库连接的文件集) 第三步: 输入update-database 二:数据对比 第一步: 第二步:选择需 ...

  5. elasticsearch index 过程

    (1)index request 到某一个Node(选择node的方式是采用round-robin)方法,此node 称为coordinate node,继续当前index request应该执行在哪 ...

  6. Django 查看原生的sql语句

    python manage.py sqlmigrate your_app_name 0001 把your_app_name换成自己的app名字即可看到框架自动生成的创建表sql语句,于是我就这样看到了 ...

  7. Android 判断APP前台,后台运行

    public void checkAppState() { ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVI ...

  8. 843. n-皇后问题(dfs+输出各种情况)

    n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行.同一列或同一斜线上. 现在给定整数n,请你输出所有的满足条件的棋子摆法. 输入格式 ...

  9. java实现判断两个二叉树是否相同

    1.定义树节点类:节点值.左节点.右节点.构造器 2.先判断树是否为空的情况 3.树不为空时,判断节点所指的值是否相等,若相等,则递归判断节点的左右节点是否相同,相同则返回true /** * Def ...

  10. H3C 静态路由

    一.静态路由简介 静态路由是一种特殊的路由,由管理员手工配置.当网络结构比较简单时,只需配置静态路由就可以使网络正常工作. 静态路由不能自动适应网络拓扑结构的变化.当网络发生故障或者拓扑发生变化后,必 ...