当前位置: 首页 > news >正文

【OceanBase 诊断调优】—— GC问题根因分析

GC 流程涉及到 RS 的状态切换和 LS 的资源安全回收,流程上较长。且 GC 线程每个租户仅有一个,某个日志流 GC Hang 死时会卡住所有其余日志流的 GC,进而造成更大的影响。

本文档会帮助大家快速定位到 GC 故障的模块,直达问题核心。

基本概念

在 OceanBase 数据库 V4.x 版本中,GC 的条件只有两个,一是不在成员列表中,二是 __all_ls_status 表中对应 LS 被标记为进入 GC 状态。对于不在成员列表中的副本,我们直接调用 ls service 的remove ls 接口即可,不需要对表做任何处理。对于标记删除的副本,leader 会和 RS 通过推进状态机到删除 __all_ls_status 表中对应 ls 的行,然后所有副本都会正常的 remove ls。 总之,在当前 leader 的成员列表中且 __all_ls_status 中对应行依然存在的日志流,是不满足 GC 条件的,因此不会开始 GC,判断 GC 问题需要先明确此条件。 remove ls 流程基本上流程可重入。当某个日志流的某个模块 remove 不满足条件时,可以退出此轮,避免 GC 线程卡住。

常见问题排查思路

找到 GC 卡住的 LS

  • 如果明确怀疑某 LS 没有 GC 时(类似迁移失败场景),首先需要确定该 LS 是否满足 GC 条件,具体可查询 __all_virtual_log_stat 表。

    obclient> select * from __all_virtual_log_stat where tenant_id = xxx and ls_id = xxx;
    

    1

    如果某副本不在 Leader 的成员列表中,则满足 GC 条件。否则继续查 __all_virtual_ls_status 表:

    obclient> select * from __all_virtual_ls_status where tenant_id = xxx and ls_id = xxx;
    

    2

    如果结果存在并且 status 为 NORMAL,则不满足 GC 条件。结果不存在或不为 NORMAL 都满足条件。

    只有满足 GC 条件的 LS 才有继续分析的必要,否则请分析到底是成员列表更新失败或是 ls_status 更改状态失败。

  • 如果没有怀疑的 LS 目标,只知道租户 GC 卡住了,则需要找到卡住的 LS。

    obclient> select ls_id, gc_state, gc_start_ts from __all_virtual_ha_diagnose where tenant_id = xxx and svr_ip = 'xxx' and svr_port = xxx;
    

    3

    • 查询结果中 gc_start_ts 不为 -1 的就是卡住的日志流,如果有复数个不为 -1 的日志流,选择任意一个即可。
    • 如果所有 LS 的结果均为上图所示,gc_state 为 NORMAL 且 gc_start_ts 为 -1,表示所有日志流都不满足 GC 条件。需要分析删除租户的命令执行是否有问题。
    • 查询超时,大概率有 LS 的死锁,直接抓堆栈查看 Txxxx_GC 线程是否有死锁。
    • 查询无结果,但是 Unit 依然没有删除,说明 GC 卡在了某个日志流的析构或资源释放,可通过 grep Txxxx_GC observer.log | grep id:xxxx 查询。

找到卡住的模块

在确定卡住的日志流之后,下一步需要确定卡住的具体模块,具体可查询 __all_virtual_ha_diagnose 表。

obclient> select ls_id, gc_state, gc_start_ts from __all_virtual_ha_diagnose where tenant_id = xxx and svr_ip = 'xxx' and svr_port = xxx;
  • 如果查询结果不存在,则说明 GC 流程中状态机的推进已经完成,LS 进入了 remove ls 阶段并且已经从 ls 的 map 中摘掉了,剩下的就是等待这个日志流满足 safe_to_destroy 的条件后安全析构。在日志中搜索该日志流的 GC 线程日志,应该可以搜到循环报错的模块,此模块就是不满足 safe_to_destroy 的根因。

    grep Txxxx_GC observer.log | grep id:xxxx
    
  • 如果查询结果存在,则代表 GC 流程卡在某个状态机的推进过程中,如卡在等待事务全部结束,同样搜索 GC 线程的日志关于此日志流循环打印的地方找到根因。

  • 如果存在结果不存在,则大概率 GC 线程死锁,抓堆栈查看 GC 线程即可。

适用版本

OceanBase 数据库 V4.x 版本。

http://www.lryc.cn/news/445758.html

相关文章:

  • 图像面积计算一般方法及MATLAB实现
  • 指挥平台在应急场所中的主要表现有哪些
  • 智能养殖场人机交互检测系统源码分享
  • 数据集-目标检测系列-海洋鱼类检测数据集 fish>> DataBall
  • 网络威慑战略带来的影响
  • 决策树算法在机器学习中的应用
  • Leetcode面试经典150题-39.组合总数进阶:40.组合总和II
  • ProcessOn为什么导出有水印!!!(利用SVG转PNG)
  • 插入、更新与删除MySQL记录
  • 【ARM】armv8的虚拟化深度解读
  • 9/24作业
  • Leetcode 106. 从中序与后序遍历序列构造二叉树
  • 针对考研的C语言学习(定制化快速掌握重点1)
  • 【大数据入门 | Hive】DDL数据定义语言(数据库DataBase)
  • CNVD漏洞和证书挖掘经验总结
  • 阿里rtc旁路推流TypeScript版NODE运行
  • 计算机书籍分享
  • 处理ASAM-MDF格式的开源python库asammdf
  • 物业管理小程序开发
  • 【Vue】Pinia
  • 帕金森病患者的生命长度:科学管理与乐观心态是关键
  • 详解Linux中cat命令
  • Mysql高级篇(中)—— SQL优化之查询截取分析
  • 企业如何制作一个官方网站?
  • 游戏开发2025年最新版——八股文面试题(unity,虚幻,cocos都适用)
  • 如何查看线程
  • 详细分析Spring的动态代理机制
  • Redis数据类型,使用场景,事物及分布式锁
  • 目标检测系列(一)什么是目标检测
  • STM32CubeIDE | 使用HAL库的ADC读取内部传感器温度