排查HBase内存泄漏导致RegionServer挂掉问题

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: 问题描述 在测试Phoenix稳定性时,发现HBase集群其中一台RegionServer节点FullGC严重,隔一段时间就会挂掉。 HBase集群规格       初步分析 使用jstat监控RegionServer的Heap Size和垃圾回收情况 Old区内存一直在90%多,且FullGC次数一直在增多。

问题描述

在测试Phoenix稳定性时,发现HBase集群其中一台RegionServer节点FullGC严重,隔一段时间就会挂掉。

HBase集群规格

      db6fd34b6f7642af862303b1aa87bacaa74a1666

初步分析

使用jstat监控RegionServer的Heap Size和垃圾回收情况

0cc3162fbdc4ae3f6aff4f5fda83f4ab8ff41c89

Old区内存一直在90%多,且FullGC次数一直在增多。

通过ganglia查看集群的FullGC情况,也可以看出003节点持续在FullGC,并最终挂掉。

dfaf9ce523e109abc6190437b9e4ec974025b9fd

怀疑存在内存泄漏导致FullGC可回收的内存越来越小,回收的时间也越来越长,最终导致RegionServer心跳超时,被Master干掉。


问题定位

排查内存泄漏问题,可借助jmap分析java堆内存的占用情况,jmap使用参考:https://blog.csdn.net/xidiancoder/article/details/70948569

使用jmap将RegionServer堆内存dump下来:

7fbcb87d4534fb4845c1662ac0fd4cd7b48224a5
MAT提供Memory Leak Suspect Report分析功能,可帮助我们找到可能存在泄漏的对象:d0eabd358cbad1cbc2294c48cc048ec3a8dcc9dc

可以看到Configuration对象已经占用到80%堆内存,Configuration底层使用HashTable存配置的键值对,与上图内存分配相符,但是还不确定这么多对象是哪里来的以及为什么没有被回收。

查看内存泄漏详细信息:

ea585ef755857dddfa4e68723890f982efa3d1b1

看到这有点懵,Configuration与FSHLog有啥关系呢,这时就要结合Configuration的引用链和HBase的源码来看了。
在堆内存Histogram中,过滤到Configuration对象,然后Merge Shortest path to GC Roots
:
5d66a3b0bb0bbd861087045029526aef615d8cd3
观察到GCRoot最多的就是FSHLog,查看引用链:
0f2910eb3005a124b38e8f3ed92eee0e40515cbb

FSHLOG引用OpenRegionHandler$PostOpenDeployTasksThread线程对象,进一步引用HRegion,HRegion引用Coprocessor,然后引用Configuration对象,导致内存泄露。

结合FSHLog源码:


be1ee508b342d6b2ef5791df3da16e6610b4e564

7a82f815ca3bbb83a6d94407ee3810ac6f179467



















syncFuturesByHandler缓存写WAL的每个线程,但是在线程结束时并不会清除Map中缓存的线程,导致引用的Configuration对象不会被释放。


问题修复

目前该问题已有阿里云HBase社区commiter正研修复并贡献给社区:

https://issues.apache.org/jira/browse/HBASE-21228

2f1e6968019a7a62f8061fad5a1dde9d7ef07aa7

AbstractFSWAL源码通过ThreadLocal替换ConcurrentHashMap修复此问题:
bbee8956823e52831be99f9cea421067a638b079
0b8767a57e1dbfd9329d856ee4263c7dee99d964
20b9ef3583c77190280e38d8490027a67628481c 9ba5af9d445a8c41c9c7d933ed119a33a2a55070

d3f2f0da5b6761a64c7049db7719525a2c492a0c


纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等。


f702b54497ad41b0bc2b5633d2b4564ccd20a895

阿飞的博客,主要分享JVM/redis/Kafka/Dubbo/Sharding-JDBC以及Linux相关技术,最全的Sharding-JDBC源码分析,喜欢研究分布式,分库分表,缓存分布式技术。
2d9651c2cc506f2de79d037ad1a9a807b614d4a2
大家工作学习遇到HBase技术问题,把问题发布到HBase技术社区论坛http://hbase.group,欢迎大家论坛上面提问留言讨论。想了解更多HBase技术关注HBase技术社区公众号(微信号:hbasegroup),非常欢迎大家积极投稿
760ed81dd2c16d93c2e90a77680f4caae93e07b7


HBase技术交流社区 - 阿里官方“HBase生态+Spark社区大群”点击加入: https://dwz.cn/Fvqv066s







相关实践学习
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
存储 分布式计算 Hadoop
|
存储 分布式计算 Hadoop
HBase2.0官方文档翻译-RegionServer Sizing Rules of Thumb
37.1. 热点(Hotspotting) Rows in HBase are sorted lexicographically by row key. This design optimizes for scans, allowing you to store related rows, or rows that will be read together, near each other.
979 0
|
监控 Java 分布式数据库
|
Java 分布式数据库 Apache
|
分布式数据库 Hbase
zookeeper的maxSessionTimeout默认值导致hbase regionserver超时
zookeeper的maxSessionTimeout默认值导致hbase regionserver超时 在hbase中经常会遇到regionserver挂掉的情况,查看日志会看到这样的错误信息 2016-02-16 11:51:24,882 WARN  [master/hadoop02/192.
2854 0
|
4月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
84 0
|
8月前
|
SQL 分布式计算 Hadoop
Hadoop集群hbase的安装
Hadoop集群hbase的安装
143 0
|
2天前
|
存储 分布式计算 Hadoop
基于Hadoop分布式数据库HBase1.0部署及使用
基于Hadoop分布式数据库HBase1.0部署及使用