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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
简介: 问题描述 在测试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







相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库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
相关文章
|
5月前
|
Java 数据库连接
Java中的内存泄漏排查与预防方法
Java中的内存泄漏排查与预防方法
|
7月前
|
缓存 移动开发 关系型数据库
Linux 内存 占用较高问题排查
Linux 内存 占用较高问题排查
174 2
|
7月前
|
缓存 Linux
kswapd0内存过高排查经历
kswapd0内存过高排查经历
472 1
|
5月前
|
监控 Java
Java中的内存泄漏分析与排查技巧
Java中的内存泄漏分析与排查技巧
|
5月前
|
存储 监控 算法
LeakCanary 的内存泄露问题排查
LeakCanary 的内存泄露问题排查
78 0
|
3月前
|
监控 Java Linux
redisson内存泄漏问题排查
【9月更文挑战第22天】在排查 Redisson 内存泄漏问题时,首先需确认内存泄漏的存在,使用专业工具(如 JProfiler)分析内存使用情况,检查对象实例数量及引用关系。其次,检查 Redisson 使用方式,确保正确释放资源、避免长时间持有引用、检查订阅和监听器。此外,还需检查应用程序其他部分是否存在内存泄漏源或循环引用等问题,并考虑更新 Redisson 到最新版本以修复潜在问题。
132 5
|
4月前
|
JavaScript Java 开发工具
Electron V8排查问题之接近堆内存限制的处理如何解决
Electron V8排查问题之接近堆内存限制的处理如何解决
302 1
|
7月前
|
缓存 算法 安全
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(二)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
73 0
|
7月前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
165 0
|
5月前
|
监控 安全 Java
JVM内存问题之排查Direct Memory泄漏有哪些常用方法
JVM内存问题之排查Direct Memory泄漏有哪些常用方法
167 2