HBase 中 Memstore-Local Allocation Buffer
在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的更多相关文章
- 线程TLAB局部缓存区域(Thread Local Allocation Buffer)
TLAB(Thread Local Allocation Buffer) 1,堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的 2,Sun ...
- HBase中Memstore存在的意义以及多列族引起的问题和设计
Memstore存在的意义 HBase在WAL机制开启的情况下,不考虑块缓存,数据日志会先写入HLog,然后进入Memstore,最后持久化到HFile中.HFile是存储在hdfs上的,WAL预写日 ...
- 堆中的线程私有缓存区域TLAB(Thread Local Allocation Buffer)
TLAB产生的原因 堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据 由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的 为避免多个线程操作同一地址,需要 ...
- 关于hbase中的hbase-site.xml 配置详解
该文档是用Hbase默认配置文件生成的,文件源是 hbase-default.xml hbase.rootdir 这个目录是region server的共享目录,用来持久化HBase.URL需要是'完 ...
- 为什么不建议在 HBase 中使用过多的列族
我们知道,一张 HBase 表包含一个或多个列族.HBase 的官方文档中关于 HBase 表的列族的个数有两处描述: A typical schema has between 1 and 3 col ...
- HBase 中读 HDFS 调优
HDFS Read调优 在基于 HDFS 存储的 HBase 中,主要有两种调优方式: 绕过RPC的选项,称为short circuit reads 开启让HDFS推测性地从多个datanode读数据 ...
- HBase中MVCC的实现机制及应用情况
MVCC(Multi-Version Concurrent Control),即多版本并发控制协议,广泛使用于数据库系统.本文将介绍HBase中对于MVCC的实现及应用情况. MVCC基本原理 在介绍 ...
- HBase中的备份和故障恢复方法
本文将对Apache HBase可用的数据备份机制和大量数据的故障恢复/容灾机制做简要介绍. 随着HBase在重要的商业系统中应用的大量添加,很多企业须要通过对它们的HBase集群建立健壮的备份和故障 ...
- [翻译]HBase 中的 ACID
同前面翻译的一篇关联的,同作者的另一篇:ACID in HBase 这一篇不是单纯地描述一个问题,而是以 ACID 为主题,介绍了其在 HBase 中各个部分的体现及实现. ACID,即:原子性(At ...
随机推荐
- codechef Future of draughts
难度 super-hard 题意 官方中文题意 做法 定义1:\(G\)为邻接矩阵,\(I\)为单位矩阵 定义2:\(H\)为转移矩阵,可以不动,即\(H=G+I\) 定义3:\(e_i(x_1,.. ...
- Win10如何设置休眠选项(关于睡眠、休眠、快速启动这几个伪关机功能如何设置更适合笔记本电脑?)
· Win10如何设置休眠选项(关于睡眠.休眠.快速启动这几个伪关机功能如何设置更适合笔记本电脑?) 应用场景 升级正式版win10以后,发现竟然没有休眠选项,从电源管理器里面也没有找到,有时候有些重 ...
- “/Reports”应用程序中的服务器错误。
“/Reports”应用程序中的服务器错误. ----------------------------------------------------------------------------- ...
- Wannafly Camp 2020 Day 3D 求和 - 莫比乌斯反演,整除分块,STL,杜教筛
杜教筛求 \(\phi(n)\), \[ S(n)=n(n+1)/2-\sum_{d=2}^n S(\frac{n}{d}) \] 答案为 \[ \sum_{d=1}^n \phi(d) h(\fra ...
- php 常用数学函数
函数 描述 实例 输入 输出 abs() 求绝对值 $abs = abs(-4.2); //4.2 数字 绝对值数字 ceil() 进一法取整 echo ceil(9.999); // 10 浮点数 ...
- 2级搭建类202-Oracle 18c SI ASM 静默搭建(OEL7.7)公开
Oracle 18c 单实例 ASM UDEV 方式在 OEL 7.7 上的安装
- 曼孚科技:AI领域9种常见的监督学习算法
监督学习是机器学习中一种十分重要的算法.与无监督学习相比,监督学习有明确的目标. 分类与回归是监督学习两个主要任务,常见的监督学习算法主要有以下9种: 1 朴素贝叶斯 分类 2 决策树 分类 3 支 ...
- JavaDay2(中)
Java循环与分支练习 习题1: 输出1~100内前5个可以被3整除的数. public class Day2_Test1 { //输出1~100内前5个可以被3整除的数. public static ...
- C++-POJ3213-PM3-[矩阵乘法]
已知矩阵乘法是n^3的,必然超时 故可以在需要验证的等式AB=C两边同时左乘D 一个1xN的任意的不含0矩阵 设E=DA,F=EB,G=DC,则此时只需验证F=G 当匹配到非法列J时,跳出n^2寻找行 ...
- Vuejs中created和mounted的区别
created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图. mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作