[HBase调优]--RegionServer 的JVM 垃圾回收优化

感谢原文链接:https://blog.csdn.net/lihui6636/article/details/42040619

1、为何HMaster一般不需调整垃圾回收机制

HMaster 没有处理过重的负载,并且实际的数据服务不经过 HMaster,所以垃圾回收时 HMaster 通常不会产生问题。


2、描述JRE的启发式算法

JRE 在默认情况下会按照一般情况下来估计程序在做什么、怎么创建对象、如何分配堆内存处理数据,这些假设在多数情况下都是对的。JRE能够运用启发式算法,根据运行进程的状况进行调整。设置当启发式的学习调整受限于具体实现时候,JRE 也能够更好地处理某些特殊情况。


3、为何需要调整RegionServer 的垃圾回收机制

JRE的默认算法和启发式学习调整功能不能很好地处理RegionServer。当RegionServer 在写入量过大的负载时候,繁重的负载使得JRE通过对程序行为的各种假设进行内存分配的策略不再有效。

在RegionServer写入数据时,数据会先保存在memstore 中,当大于阈值时候,再写入到磁盘。因为写入的数据是由客户端在不同时间写入的,故而他们占据的Java堆空间很可能是不连续的,会出现孔洞。


4、RegionServer的新生代和老生代的特点比较

新生代大小在128M~512M;老生代大小在几GB。

最初写入的数据会保存在新生代,再刷写到磁盘;当数据刷写到磁盘的速度较慢时候,新生代中的数据停留时间过长,会被移到老生代。

新生代空间可以被迅速回收,对内存管理没有影响;老生代数据量大,回收慢,对内存管理影响大。所以二者需要不同的垃圾回收策略。


5、RegionServer 的JVM 配置解读

-Xmx8g -Xms8g -Xmn128M -XX:+UseParNewGC -XX:+UseConMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XLoggc:/logs/gc-hostname.log


其中:

-Xmx8g           最大堆内存8g


-Xms8g           初始堆内存设置与最大堆内存一样大。如果Xms设置得比较小,当遇到数据量较大时候,堆内存会迅速增长,当上升到最大又会回落,伸缩堆大小会带来压力。


-Xmn128M      新生代128M。新生代不能过小,否则新生代中的生存周期较长的数据会过早移到老生代,引起老生代产生大量内存碎片;新生代也不能过大,否则回收新生代也会造成太长的时间停顿,影响性能。


-XX:+UseParNewGC    新生代采用 ParallelGC 回收器。ParallelGC 将停止运行Java 进程去清空新生代堆,因为新生代很小,所以停顿的时间也很短,需几百毫秒。  


-XX:+UseConMarkSweepGC    老生代采用CMS回收器(Concurrent Mark-Sweep Collector) .  CMS 在不停止运行Java进程的情况下异步地完成垃圾回收,CMS会增加CPU的负载,但是可以避免重写老生代堆碎片时候的停顿。老生代回收不可使用 ParallelGC  回收机制,因为老生代的堆空间大,ParallelGC会造成Java进程长时间停顿,使得RegionServer与ZooKeeper的会话超时,该RegionServer会被误认为已经奔溃并会被抛弃。


-XX:CMSInitiatingOccupancyFraction=70     初始占用比为70%的时候开始CMS回收。此值不能太小,否则CMS发生得太频繁。此值不能太大,否则因为CMS需要额外堆内存,会发生堆内存空间不足,导致CMS 失败。


-verbose:gc -XLoggc:/logs/gc-hostname.log     写入日志



6、串行收集器(Serial Collector)、并行收集器(Parallel Collector)、并发标记清理收集器(CMS)

串行收集器(Serial Collector)  -XX:+UseSerialGC 

Serial Collector使用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高。但是,也无法使用多处理器的优势,所以Serial Collector 适合单处理器机器。当然,此收集器也可以用在小数据量( 100M ]左右)情况下的多处理器机器上。 


并行收集器(Parallel Collector) -XX:+UseParallelGC    -XX:+UseParallelNewGC   -XX:+UseParallelOldGC

多条垃圾收集线程并行,此时用户线程是没有运行的.

--适用情况:“对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。举例:后台处理、科学计算。
--缺点:应用响应时间可能较长


并发标记清理收集器(CMS)   XX:+UseConcMarkSweepGC

用户线程与垃圾收集线程并发执行,程序在继续运行,而垃圾收集程序运行于另一个个CPU上.

可以保证大部分工作都并发进行(应用不停止),垃圾回收只暂停很少的时间,此收集器适合对响应时间要求比较高的中、大规模应用。使用-XX:+UseConcMarkSweepGC 打开。

-适用情况:“对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器、电信交换、集成开发环境。

--缺点:需要消耗更多资源,吞吐量没那么大


猜你喜欢

转载自blog.csdn.net/high2011/article/details/80511415