1. 异常突起
HBase集群的某一个RegionServer的CPU使用率突然飙升到百分之百,单独重启该RegionServer之后,CPU的负载依旧会逐渐攀上顶峰。多次重启集群之后,CPU满载的现象依然会复现,且会持续居高不下,慢慢地该RegionServer就会宕掉,慢慢地HBase集群就完犊子了。
2. 异常之上的现象
CDH监控页面来看,除CPU之外的几乎所有核心指标都是正常的,磁盘和网络IO都很低,内存更是充足,压缩队列,刷新队列也是正常的。
![011db0c87a352a6dcb76c2b41a83108b.png](https://img-blog.csdnimg.cn/img_convert/011db0c87a352a6dcb76c2b41a83108b.png)
普罗米修斯的监控也是类似这样的,就不贴图了。
监控指标里的数字,只能直观地告诉我们现象,不能告诉我们异常的起因。因此我们的第二反应是看日志。
![35fdbf4fa0e804fcf60348bb95d12816.png](https://img-blog.csdnimg.cn/img_convert/35fdbf4fa0e804fcf60348bb95d12816.png)
与此同时,日志中还有很多类似这样的干扰输出。
![f8e1092dd263090cd2f7e7a4a8e8cd2e.png](https://img-blog.csdnimg.cn/img_convert/f8e1092dd263090cd2f7e7a4a8e8cd2e.png)
后来发现这样的输出只是一些无关紧要的信息,对分析问题没有任何帮助,甚至会干扰我们对问题的定位。
但是,日志中大量scan responseTooSlow的警告信息,似乎在告诉我们,HBase的Server内部正在发生着大量耗时的scan操作,这也许就是CPU负载高的元凶。可是,由于各种因素的作用,我们当时的关注点并没有在这个上面,因为这样的信息,我们在历史的时间段里也频繁撞见。
3. 初识arthas
监控和日志都不能让我们百分百确定CPU负载高是由哪些操作引起的,我们用top命令也只能看到HBase这个进程消耗了很多CPU,就像下图看到的这样。
![bc34218289eb9c227eda5b1c9f1ee16b.png](https://img-blog.csdnimg.cn/img_convert/bc34218289eb9c227eda5b1c9f1ee16b.png)
如果不做进一步分析,你仍然不知道,问题出现在HBase相关进程下的哪些执行线程。Java中分析进程的命令,可以使用jstack
或jstat gcutil
等。但是,今天要介绍的主角不是这俩,甚至不是async-profiler
,而是arthas
。async-profiler
虽然也是一个很强大的工具,但是arthas
包含了它,且功能更强大,堪称神器。
arthas
很早以前就听说过,起初以为它只能用来分析WEB应用,例如Spring Boot,这两天仔细翻看其官方文档之后,才觉得自己是多么的无知。arthas
的相关介绍和入门使用,请参考其文档,它的官方文档比任何第三方资料都详细和友好。
https://github.com/alibaba/arthas
阿尔萨斯官方文档
https://github.com/jvm-profiling-tools/async-profiler
4. 用arthas来分析HBase的异常进程
4.1 运行arthas
java -jar /data/arthas/arthas-boot.jar --target-ip 0.0.0.0
--target-ip 默认127.0.0.1,此处赋值为0.0.0.0是为了使用webconsole
4.2 arthas运行成功的界面
![6138b8c38551abe0b1dd4b89fb4f5708.png](https://img-blog.csdnimg.cn/img_convert/6138b8c38551abe0b1dd4b89fb4f5708.png)