HBase的GC策略采用PawNew+CMS, 这是大众化的配置,ParNew经常会出现停顿时间特别长的情况,有时候甚至长到令人发指的地步,例如请看如下日志:
2012-10-17T05:54:54.293+0800: 739594.224: [GC 739606.508: [ParNew: 996800K->110720K(996800K), 178.8826900 secs] 3700515K->2985396K(6180736K), 187.4174260 secs] [Times: user=1.70 sys=2.42, real=191.35 secs]
不要慌,因为我也没见过这么长的GC,既然GC这么长,直接导致的问题就是HBase连接ZK的session超时,而HBase在rs超时的情况下,会让自己挂掉(这样处理显然也是合理的)。关于session可以参看另外两篇博文,http://crazyjvm.iteye.com/blog/1701032,http://crazyjvm.iteye.com/blog/1693757。
另外要补充的是,在这台服务器上还运行着hadoop和redis, 这两个应用都狂吃内存,所以第一反应就是因为swap导致了这个问题,对swap不太了解的可以参看https://www.linux.com/news/software/applications/8208-all-about-linux-swap-space/,我看了下我们的swappiness的值是60,总共可用swap空间是32G多!那么事情就是这么发生了,我们会定时的向HDFS上插数据,数据量不小,这个时候Linux就会使用buffer把write的数据给缓存起来,另一方面,redis也会定期的灌数据(10G+),这样buffer肯定就不小了,当然读的操作也会不少,那么Cache使用起来也很厉害(当然,比buffer猛多了),虽然说这么空间不是真正的算在内存使用里面,但是它却会导致swap的发生,它让那些在内存中的部分未使用数据swap进硬盘了,对了,别忘了,这台服务器上还有hadoop哦,火力全开的跑job,内存火箭般的升上去了,我看了下hbase进程,swap出去的内存基本都50%以上了,那内存回收的时候能快吗?
再解释下,为什么ParNew的时候慢,而CMS的时候基本没事呢。熟悉GC的同学应该瞬间就想到了,ParNew采用的是Copy算法,它要把eden以及一个survivor区域中的存活对象复制到另外一个survivor区域中,这样就相当于GC时要对硬盘进行随机读写的行为了,能快吗?另一方面(这点我不确定,可能没啥问题),CPU在那个时刻使用率极高,影响了回收线程的工作(不过应该没啥问题)。 说说CMS,CMS采用的是MARK-SWEEP算法,它只管标记和删除,不用复制,更重要的是,在逻辑上,Old Gen的大多数对象仍然在内存中,显然会好很多,至于COMPACT的步骤就在CMS失败的情况下由Parallel Old收集器来做了,这个收集器是MARK-COMPACT算法。当然了,UseCMSCompactAtFullCollection和CMSFullGCsBeforeCompaction有助你结合CMS完成COMPACT的过程。
SWAP影响这么大的原因有几点,我们先不去看置换算法之类的影响,最大头的寻道时间和旋转延迟时间就说明问题了,如果读磁盘上分散的很厉害的数据,那么效率肯定非常低,因为每次都需要重新寻道,并且加上旋转延迟。如果数据全部在一起,是连续的,那么磁盘的表现是相当厉害的,这一点也正是hadoop的基础。(擦!字体怎么变不了 ?)
对GC不熟悉的同学肯定需要好好地去补下了,使用JVM平台不熟悉GC,说不过去。如果在运行过程中有另外的发现,再补上吧。
分享到:
相关推荐
主要给大家分享介绍了一次诡异的full gc查找问题全部过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧啊
机器 gc 日志上传,用于分析问题,主要是 查看gc有无问题
ESP32驱动GC9A01圆形屏幕显示图片视频时间,用过了,不错,勇敢牛牛,不怕困难,冲冲冲。
GC9307支持全彩色、8色显示模式和睡眠模式,通过软件实现精确的电源控制,这些功能使GC9307成为中小型便携式产品(如数字手机、智能手机、MP3和PMP)的理想LCD驱动程序,电池寿命长是主要问题。
gc4023 datasheet
SENSOR_GC1054的寄存器配置以及基本图像配置
GC0308 MTK平台驱动,具体见附件, camera_sensor_GC0308.c camera_sensor_GC0308.h camera_info_GC0308.c camera_info_GC0308.h
今天来谈谈C#的GC,也就是垃圾回收机制,非常的受教,总结如下 首先:谈谈托管,什么叫托管,我的理解就是托付C#运行环境帮我们去...哪么有两个大问题 1.GC可以回收任何对象吗?2.GC什么时候来回收对象?回收那些对象?
gc.log监控工具,监控应用程序的健康问题检测出来
高通平台gc0310驱动验证可行,有问题直接联系。
GCViewer 能否分析 java 程序 GC 日志,能否图表展示堆内存,年轻代,老年代,永久带以及full gc 的使用情况
格科微sensor GC4663 datasheet, 400万像素
gc02m1 datasheet
GC032A_Drive 驱动 在原厂提供的驱动中自己修改了一些效果
ESP32驱动GC9A01圆形屏幕显示图片并按照设定的时间自动更换,很好玩,不错。
GC频率从另一个角度反应了系统的健康...所以观察应用的GC频率是可以提前发现应用的不健康问题,提前发现故障隐患,这在新应用上线的观察期尤其重要。 观察GC的方法有很多,本文详细讲述了一些特定场景下使用的方法。
因为本文档是作者花费数月时间,查阅GC相关的国内外众多资料并加以思路清晰的条目化而形成。因为篇幅所限,可能有部分知识点没有完全展开,但是对于GC领域的核心知识点几乎全部涵盖,很难在其他书籍和文档中涉及如此...
什么是GC,GC是什么意思为什么要有GC,了解gc对内存的处理机制
Visual GC插件(org-graalvm-visualvm-modules-visualgc.nbm)