阅读:《消灭毛刺!HBase2.0全链路offheap效果拔群》& 《HBase优化 | GC优化利器 – HBase2.0全链路offheap》

阅读 Quarterback 36℃ 0评论

1.《消灭毛刺!HBase2.0全链路offheap效果拔群》& 《HBase优化 | GC优化利器 – HBase2.0全链路offheap

  • 推荐阅读
  • JVM GC问题
    • Hbase region server,在on-heap(JVM管理)管理内存时,会导致一些GC问题:1)产生大量内存碎片,无法分配大对象,从而触发FGC,期间其他内存分配请求可能触发OOM,或者由于FGC期间stw,无法连接zk,被master误认为挂掉),2)YGC导致毛刺,在YGC期间导致部分访问延迟增大
  • 从on-heap到off-heap,优化JVM GC问题:
    • 为了解决JVM垃圾回收导致的宕机和停顿问题,采用off-heap memory(allocateDirect,操作系统管理)
    • on-heap与off-heap比较:
      • 参考文章:on-heap-vs-off-heap-memory-usage
      •  on-heap:
        • 优点:
          • 从jvm heap上进行对象的序列化比较快
          • 可以限制应用使用的内存大小
        • 缺点:
          • 对象分配效率低(需要从操作系统到jvm heap)
          • YGC,FGC可能导致系统停顿或宕机
      • off-heap:
        • 优点:
          • 对于大内存有良好的伸缩性
          • 对垃圾回收停顿的改善明显
          • 在进程间可以共享,减少虚拟机间的复制
          • 确定性(相对于jvm gc停顿等不确定性来看)
        • 缺点:
          • 读取时性能会比on-heap差,因为off-heap上复杂的数据结构很难和java中的对象对应起来,一般只能用一个简单的结构来映射(例如ByteBuffer),然后再序列化。而前者对象可以直接在jvm heap上读取
          • 使用的内存大小没有限制,很有可能超出限制(超过系统内存大小)
  • 全链路off-heap:
    • 在HBase的读和写链路中,均会产生大量的内存垃圾和碎片。
      • 比如说写请求时需要从Connection的ByteBuffer中拷贝数据到KeyValue结构中,在把这些KeyValue结构写入memstore时,又需要将其拷贝到MSLAB中,WAL Edit的构建,Memstore的flush等等,都会产生大量的临时对象,和生命周期结束的对象。随着写压力的上升,GC的压力也会越大。
      • 读链路也同样存在这样的问题,cache的置换,block数据的decoding,写网络中的拷贝等等过程,都会无形中加重GC的负担。
    •  写链路的offheap包括以下几个优化:
      •  在RPC层直接把网络流上的KeyValue读入offheap的bytebuffer中
      • 使用offheap的MSLAB pool
      • 使用支持offheap的Protobuf版本(3.0+)
    •  读链路的offheap主要包括以下几个优化:
      •  对BucketCache引用计数,避免读取时的拷贝
      • 使用ByteBuffer做为服务端KeyValue的实现,从而使KeyValue可以存储在offheap的内存中
      • 对BucketCache进行了一系列性能优化
  • 优化效果对比(阿里云Hbase版本):
    • 基本可以避免碎片导致的FGC, YGC导致的的应用系统响应延迟明显改善。
    • 但是读性能会有所降低(上面提到的序列化问题)

 




喜欢 (0)or分享 (0)
Quarterback.cn 打赏作者
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址