利用Arena Allocation避免HBase触发Full GC

标签: 性能调优 | 发表时间:2011-06-22 12:04 | 作者:xiaofeng Adam
出处:http://rdc.taobao.com/team/jm

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导致内存碎片的示意图:

左边五颜六色的是不同的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够大了

详见:http://www.cloudera.com/blog/2011/03/avoiding-full-gcs-in-hbase-with-memstore-local-allocation-buffers-part-3/

转载请注明原文链接:http://kenwublog.com/avoid-full-gc-in-hbase-using-arena-allocation

相关 [利用 arena allocation] 推荐:

利用Arena Allocation避免HBase触发Full GC

- Adam - 淘宝JAVA中间件团队博客
Arena Allocation,是一种GC优化技术,它可以有效地减少因内存碎片导致的Full GC,从而提高系统的整体性能. 本文介绍Arena Allocation的原理及其在Hbase中的应用-MSLAB. 假设有1G内存,我顺序创建了1百万个对象,每个对象大小1K,Heap会被渐渐充满且每个对象以创建顺序相邻.

Spark动态资源分配-Dynamic Resource Allocation – lxw的大数据田地

- -
关键字:spark、资源分配、dynamic resource allocation. Spark中,所谓资源单位一般指的是executors,和Yarn中的Containers一样,在Spark On Yarn模式下,通常使用–num-executors来指定Application使用的executors数量,而–executor-memory和–executor-cores分别用来指定每个executor所使用的内存和虚拟CPU核数.

利用sockstunnel翻越

- - 0.618網絡空間
首先在你的linux vps上搭建python環境(一般來說,linux vps都已搭好了python 環境). 然後運行如下命令(假設你在/root下):. 這樣在/root/下,就生成了privkey.pem和cacert.pem. 修改sslserver.py裏的. keyfile="privkey.pem",為.

转角的空间利用

- Ivy - IDSOO
拐角的空间如果不充分利用似乎有一些浪费. 日本的设计工作室Torafu Architects设计的这个隔板巧妙地利用了拐角,搭建了一个可以放置物品的平台,设计实用、美观、大方.

旧灯泡的再利用

- Jimmy - 微奇生活
生活水平提高了,家家户户也用上了节能灯,那些废旧的白炽灯泡如何利用呢. 看看下面这些妙点子吧,可以种盆栽,做工艺品,还能用来养金鱼~~灯泡还会跳舞呢. 简洁的线圈灯:Coil Lamp. 微博:@新浪 | @腾讯     订阅:Google | 九点 | QQ | 鲜果 | 有道 | 邮箱.

[译]jboss漏洞利用

- - 互联网 - ITeye博客
原文地址:http://resources.infosecinstitute.com/jboss-exploitation/. JBoss Application Server是一个基于Jave EE的web应用服务器. 如果Jboss没有正确配置,它会允许攻击者进行各种恶意攻击. 由于JMX console可以通过端口8080远程访问,攻击者和恶意用户可以通过使用Jboss console中的DeploymentScanner功能部署他们自己的WAR(web archive)文件或shell脚本.

利用HTTP Cache来优化网站

- scourgen - 博客园-首页原创精华区
对于网站来说,速度是第一位的. 用户总是讨厌等待,面对加载的Video和页面,是非常糟糕的用户体验. 所以如何利用Cache来优化网站,值得深入研究. 缓存是一个到处都存在的用空间换时间的例子. 通过使用多余的空间,我们能够获取更快的速度. 用户在浏览网站的时候,浏览器能够在本地保存网站中的图片或者其他文件的副本,这样用户再次访问该网站的时候,浏览器就不用再下载全部的文件,减少了下载量意味着提高了页面加载的速度.

利用 nose 测试 web.py 程序

- Ken - python.cn(jobs, news)
#index.py   ----    web.py主文件. #nose_test.py ---- 测试文件脚本. -s:显示脚本print信息,默认是print的信息是不输出的. nose会查找脚本中 test_*命名的函数和Test_*命名的类. 运行测试脚本时,首先会运行脚本func级别的setUp()函数,.

Google专利“用手套看世界”

- Saint Raphael - Solidot
美国专利商标局(USPTO)授予了Google一项专利“Seeing with your hand”,简而言之是利用整合传感器的手套观察周围环境或利用手势控制电脑. 发明人之一是Google联合创始人Sergey Brin. Google在专利中解释了灵感来源:如果有东西掉进到沙发下面,人们会很自然的将手伸进沙发下去摸,通过触摸确定位置.

bash下利用trap捕捉信号

- Lan - 淘宝共享数据平台 tbdata.org
我在之前的文章里写了myisam读数据压缩的情况,最近决定把它用在生产环境上,所以避免不了写一个“安全”的处理脚本放在DB服务器上,这就引入了本文所讨论的话题. 我希望这个bash脚本在退出的时候做一些事情,包括:. 它启动的切到后台的job需要被杀死;. 在这个脚本里我用到了trap这个命令,关于它,你可以man一下,我这里就不啰嗦了.