HBase FullGC时间长优化经历

背景

问题现象

某个 HBase 集群,出现 GC 时间很长的问题。yong gc 频率每秒约 10 次,gc 时间约 2s,对于 yong gc 来说,已经比较高了。再看 full gc,gc 时间达到了 20s 以上,对 HBase 集群已经有了一定的影响。

图片

目标:

  • 降低 full gc 触发频率及时间
  • 降低 young gc 触发频率或时间

    集群状况

3 个 RegionServer,每个 RegionServer 管理约 200 个 Region。

读写流量:

图片

get 请求比较均匀,每个 RegionServer 约 3.5K/s,read 请求会有周期波动性。

write 请求偶尔会有毛刺。

平均每个节点,region 数量 200 个,机型:16 核 64G。

HBase 参数配置:

开启了堆外缓存,内存配置 32G,堆外内存上限 10G,bucket 缓存 8G。

JVM 参数配置:

-XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:GCPauseIntervalMillis=100 -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:/data/emr/hbase/logs/gc.log

优化过程

读缓存优化

根据监控可以看到,读请求是比较高的,且 HBase 使用的读缓存使用的堆内缓存。考虑查询引起的 full gc。将查询缓存在堆外。配置参数如下:

hbase.regionserver.global.memstore.size 0.5
hfile.block.cache.size 0.3
hbase.regionserver.global.memstore.size.lower.limit 0.8
hbase.bucketcache.ioengine  offheap
hbase.bucketcache.size  8192
-XX:MaxDirectMemorySize=10g

观察效果

图片

没有明显的变化。young gc 时间和 full gc 时间依旧高。

compaction 优化

观察监控,由于读写基本均匀,没有明显的变化,每次 gc 回收都比较小,猜测是 compaction 引起的 gc。

图片

优化 compaction,通过降低 compaction 观察内存 gc 情况。配置参数:

hbase.offpeak.start.hour 2
hbase.offpeak.end.hour 4
hbase.regionserver.throughput.controller org.apache.hadoop.hbase.regionserver.compactions.PressureAwareCompactionThroughputController
hbase.regionserver.thread.compaction.small 1 
hbase.regionserver.thread.compaction.large 1

观察效果