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