背景

一般来说RegionServer的堆内存越大越好,但是因为垃圾回收的缘故,内存大了之后,相应的FullGC时间也会线性增加,一般来说每G的内存需要的FullGC时间为:。FullGC优势可能达到好几分钟,这个阶段会停止响应任何请求,相当于所有线程挂起,这种暂停又叫做Stop-The-World(STW),FullGc的对HBase造成严重后果比较严重:
在Zookeeper检测RegionServer心跳包的时候,RegionServer正在FullGc无法回应,而如果超过阀值等待时间会被标记为宕机,这时候会将该RegionServer上的数据向其他RegionServer迁移,并且该RegionServerFullGc结束后发现自己被宕机了,为了防止脑裂,会停止自己(RegionServer自杀,又叫朱丽叶暂停)。很多场景下会将zookeeper的心跳检测阀值调大,但是这并不可取。
RegionServer的堆内存要设定为合理的值,GC要选则适合的回收机制。

优化

系统环境
centos7
JDK8u45
regionserver 40% BlockCache , 40% Memstore

为什么使用混合模式 (40% BlockCache , 40% Memstore ) 具体可以看 hbase的两种缓存结构MemStore和BlockCache

gc四种垃圾回收

Serial收集器:一个单线程的收集器,CPU利用率最高,停顿时间长。效率低消耗高。 通过JVM参数-XX:+UseSerialGC。
Parallel GC : Throughput friendly 目前处于维护模式,赶紧放弃吧 通过JVM参数 XX:+USeParNewGC
CMS GC: low latency for heap < 32GB 将会被G1GC取代 。通过JVM参数 -XX:+UseConcMarkSweepGC设置
G1 GC: low latency 一键GC 调优,自适应,通用性强,支持多CPU。 通过JVM参数 –XX:+UseG1GC 使用G1垃圾回收器。
G1实时目标:可配置在N毫秒内最多只占用M毫秒的时间进行垃圾回收

生产hbase GC优化参数

点击查看隐藏内容🎁

JVM 参数,官方指出JVM参数对于负载影响比较小,建议添加参数进行监控。

-XX:+UseG1GC #开启G1GC
-XX:InitiatingHeapOccupancyPercent=70 #当达到heap大小的70%时进行提前启动标记周期进入Mixed GC
-XX:+PrintFlagsFinal -XX:+PrintReferenceGC # 打印GC标识,引用
-XX:+UnlockExperimentalVMOptions -XX:-ResizePLAB # 取消 内存整理,G1GC 天生优势
-XX:G1NewSizePercent=3 # 3-9Minimum size for Eden each epoch, differs by cluster
-XX:MaxGCPauseMillis=200 # 期待的最大停留时间,未必满足
-XX:+UnlockDiagnosticVMOptions
-XX:+G1SummarizeConcMark
-XX:+ParallelRefProcEnabled #Helps keep a lid on reference processing time issues were were seeing
-XX:+PrintGCDetails
-XX:+PrintAdaptiveSizePolicy # 自适应策略,调节Young Old Size
-XX:G1HeapRegionSize=32M # hbase heap > 32G时
-XX:G1HeapWastePercent=20 #Exclude most expensive Mixed GC by increase waste percent (default=5%)
-XX:ConcGCThreads=8 # concurrent marking phase can be completed early enough to avoid full GC
-XX:ParallelGCThreads=13 # 8+(logical_processor -8)*(5/8)

配置GClog 日志(选加项):

-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCApplicationStoppedTime # 打印应用停留时间
-XX:+PrintTenuringDistribution # 老年代分布
-Xloggc:./region-server-gc.log
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=2
-XX:GCLogFileSize=512M

下面的参数是jmx监控使用的 (选加项):

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.port=22222

优化结果

调优后GC稳定在200ms左右。明显提升响应性能。

其它服务:

对于正常环境的服务来说

-server -Xms24G -Xmx24G -XX:PermSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=20 -XX:ConcGCThreads=5 -XX:InitiatingHeapOccupancyPercent=70

对于备份服务器

-server -Xms4G -Xmx4G -XX:PermSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=20 -XX:ConcGCThreads=5 -XX:InitiatingHeapOccupancyPercent=70

对于单独部署的服务

-server -Xms32G -Xmx32G -XX:PermSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=20 -XX:ConcGCThreads=5 -XX:InitiatingHeapOccupancyPercent=70