[前]Region Server GC调优
【警告】为 HBase 配置 JVM 垃圾回收是一项高级操作。配置不当可能对集群的性能产生重大影响。请仔细测试任何配置更改
。
【警告】 使用 OpenJDK 11 时,Cloudera Manager 和大多数 Cloudera Runtime 服务使用 G1GC 作为默认的垃圾回收方法。(Java 8 使用“ConcurrentMarkSweep”(CMS)进行垃圾回收。)使用 G1GC 时,垃圾回收的暂停时间更短,因此组件通常会更加响应,但它们对内存过度分配更加敏感。您应监控内存使用情况以确定是否存在内存过度分配。如果您集群使用的是Java 8,Hbase相关参数默认如下:
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled【重要提示】当Hbase Regionserver的堆内存大于 32 GB 时,Java 会禁用 Compressed Oops(压缩对象指针),这会将内存分配大小从 4 字节更改为 8 字节,从而减少堆中可存储的对象数量。这意味着,将最大堆内存设置为接近 32 GB 到 47 GB 的值实际上会减少可用内存,可能导致 OutOfMemoryError(内存不足错误)。你可以给Hbase Regionserver配置32GB内存,也可以配置48GB内存,但不要配置33GB-47GB!!参考:Do not use heap sizes between 32 GB and 47 GB in Jira - Compressed OOPS | Jira | Atlassian Documentation
[一]JVM参数的解释
JVM 的垃圾回收(内存清理)可能导致 HBase 客户端出现过高的延迟。要调整垃圾回收设置,可以将相关参数传递给 JVM。
-
-XX:+UseG1GC:使用“G1”垃圾回收算法。您可以调整 G1 垃圾回收以提供一致的暂停时间,这有利于长期运行的 Java 进程,例如 HBase、NameNode、Solr 和 ZooKeeper。有关调整 G1 的更多信息,请参阅 Oracle 关于垃圾回收调整的文档。
-
-XX:MaxGCPauseMillis=value:垃圾回收暂停时间。将此值设置为您的集群可以容忍的最大延迟,同时允许尽可能多的垃圾回收。
-
-XX:+ParallelRefProcEnabled:通过在参数名称前使用 + 或 - 符号来启用或禁用并行引用处理。
-
-XX:-ResizePLAB:通过在参数名称前使用 + 或 - 符号来启用或禁用 Promotion Local Allocation Buffers(PLABs)的调整大小。
-
-XX:ParallelGCThreads=value:同时运行的并行垃圾回收线程的数量。
-
-XX:G1NewSizePercent=value:用于垃圾回收的堆内存百分比。如果该值过低,垃圾回收将无效。如果该值过高,HBase 用于其他用途的堆内存将不足。
[二]实际调优案例
1,配置GC参数
-XX:+UnlockExperimentalVMOptions
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:ParallelGCThreads=32
-XX:G1NewSizePercent=5
-XX:+ParallelRefProcEnabled
-XX:+UseStringDeduplication #字符串去重,提高性能
-XX:-ResizePLAB #减少gc线程间通信的东西,关闭动态提升本地buffer
-XX:+PerfDisableSharedMem #关掉统计信息的内存映射。开启在某些特殊场景下,会极大增加gc暂停时间
在CM中编辑Hbase配置HBase RegionServer 的 Java 配置选项后重启集集群
【重要提示】需要将该配置中默认的{{JAVA_GC_ARGS}} -XX:ReservedCodeCacheSize=256m删除,否则JVM会发生冲突
2,禁用BoundedByteBufferPool
HBase 使用 BoundedByteBufferPool 来避免堆内存碎片化。你可以通过 Cloudera Manager 禁用 BoundedByteBufferPool。
G1 垃圾收集器在某些情况下可以减少对避免堆内存碎片化的需求。如果你使用 G1 垃圾收集器,可以禁用 HBase 中的 BoundedByteBufferPool。这可以减少需要被回收的“老年代”对象的数量。但此配置属于实验性质。
在CM中编辑Hbase配置 HBase Service Advanced Configuration Snippet (Safety Valve) for hbase-site.xml
<property>
<name>hbase.ipc.server.reservoir.enabled</name>
<value>false</value>
</property>