【OceanBase诊断调优】—— 排查 IO 问题的方法

本文主要介绍 OceanBase 数据库 V4.x 版本中排查 IO 问题的方法以及 IO 相关的日志和视图。

IO 相关问题

-4013 内存爆、IoControl 模块内存泄漏

目前 IO 内存爆可能的原因如下,及相应的排查方法。

  • 其他模块使用 IO 内存后未释放导致泄漏。

    • 日志分析。

      通过关键词过滤日志信息,检查内存使用是否持续上升,命令如下。

      grep MEMORY observer.log | grep IoControl
      
    • 开启 memleak 诊断内存泄漏。

      若存在 IoControl 模块内存泄漏问题,在 OceanBase 数据库 V4.1 版本中可使用 memleak checker 检测内存泄漏,并通过查询 __all_virtual_mem_leak_checker_info 表的信息,执行语句如下。

      select * from __all_virtual_mem_leak_checker_info order by alloc_size desc limit 5;
      

      A0O3P9-he90o-j289i8-kl09p9

      如上图信息,查询结果按照 alloc_size 大小降序排列,可知 alloc_count 列和 back_trace 列信息,获取可能出问题的调用堆栈信息,一般来说存在泄露的调用堆栈计数 alloc_count 列值都很大(而且越来越大),将这样的调用堆栈利用 addr2line 打印出。排查堆栈打印出的 IO 模块的上层调用关系,确定 IoControl 模块内存泄漏问题。

    • IO Tracer。

      1. 启用 io_tracer 追踪内存泄漏。

        obclient> ALTER SYSTEM SET leak_mod_to_check = 'io_trace';
        
      2. 通过命令在日志中过滤关键词,查看 tracer 抓到的堆栈信息。

        grep "IO STATUS SENDER"
        

        输出疑似泄漏路径 top 5 条日志信息。

        j813P9-sd9o0o-k92i8-LK0O59

  • 达到租户内存上限。

    • 目前,IO buf 内存分配由两部分构成,一部分是 IoControl 直接分配(如 log IO),还有一部分是由 IO Callback 分配,同时 IO buf 和 IORequest 内存强耦合,高峰状态可能被一起 hold 住,导致短时间内存爆,IOControl 模块目前内存上限就是租户 system_memory,因此如果在压力场景下出现内存打满可以考虑调大 system_memory(对于 deploy.py 的部署,可以修改 obi.py 里面的 system_memory 字段)然后重启。

    • 租户资源相关的命令。

      • 查看集群中所有的资源单元配置。

        SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS\G;
        
      • 修改 Unit 的资源规格。

        示例代码。

        ALTER RESOURCE UNIT unitname  MAX_CPU [=] cpunum,  [MIN_CPU [=] cpunum,] MEMORY_SIZE [=] memsize,  [MAX_IOPS [=] iopsnum, MIN_IOPS [=] iopsnum,IOPS_WEIGHT [=]iopsweight,] [LOG_DISK_SIZE [=] logdisksize];
        
    • 查看资源池。

      SELECT * FROM oceanbase.DBA_OB_RESOURCE_POOLS\G;
      
    • 查看集群内各 Server 的资源分配情况。

      SELECT * FROM oceanbase.GV$OB_SERVERS\G;
      
    • 查看租户资源。

      SELECT * FROM oceanbase.DBA_OB_UNITS\G;
      
    • 查看集群内所有租户的资源分配情况。

      SELECT * FROM oceanbase.GV$OB_UNITS\G;
      
  • 达到 IOPS 配置上限。

    当 IO 内存爆的原因是达到 IOPS 配置上限,解决方法如下。

    1. 查询资源单元的配置信息。

      select * from __all_unit_config;
      

      j7o09-l90opo-786y0oi9-KlI09op

    2. 修改 Unit 的资源规格中的 IOPS 值。

      alter resource unit box1 max_iops = 20000;
      

-4012 IO 超时

IO 报 -4012 超时场景比较多,包括 IO 超时设置错误、sender 队列卡住等。此外,IO 超时还可能导致其他问题,如 OB_IO_ERROR -4009。

以下是一些常见的排查方法。

  • 通过命令在日志中过滤关键词,查看 IO 超时报错信息。

    grep "IO wait timeout"
    

    在 OceanBase 数据库 V4.2 及以下版本,日志里的 timeout_ms_ 代表着 IO 超时时间;在 OceanBase 数据库 V4.3 及以上版本,日志里的 result_-> timeout_us_ 代表着 IO 超时时间。

    若 IO 超时时间为 0,可能调用层设置错误,另外一种可能是因为前面的 RPC 把时间耗光了。

  • sender 队列卡住。

    通过命令在日志中过滤关键词,查看 IO 请求调度信息。

    grep "IO SENDER STATUS"
    

    sender 队列卡住的问题,可以参考 IO 调度队列卡 这一节内容,目前看来这种错误在磁盘状态差的情况下比较容易出,定位到 io_prepare 阶段分内存耗时过久。

-4392 OB_DISK_HUNG 磁盘故障、快速拒绝

  • 通过日志确定磁盘 hung。

    报出 -4392 前日志中一般会出现 xxx may be hung 类似的日志信息,在最开始报 -4392 的地方可使用命令 grep "may be hung" 搜索出相应的日志内容。 可能的三种 OB_DISK_HUNG 磁盘故障事件。

    image.png

  • 通过系统性能工具排查 OB_DISK_HUNG 磁盘故障。

    可能的三种 OB_DISK_HUNG 磁盘故障事件中,data 和 slog 会触发 IO 的快速拒绝,代表 IO 探测线程判断磁盘故障或 slog 判断写盘慢,有可能当时是磁盘真的有问题(如图 1),使用系统性能监控工具 tsar 或 vsar 查看磁盘的状态。

    图 1。

    image.png

    也有可能是磁盘压力过大(util 90% 以上,如图 2)或者性能抖动,使用系统性能监控工具 tsar 展示的对应盘 util 使用率和 load 负载情况。

    图 2。

    image.png

排查 -4012 OB_IO_TIMEOUT 和 -4009 OB_IO_ERROR

  • 针对 IO 探测线程检测到的磁盘问题,一般来说 IO 探测线程执行探测任务的触发条件有两种:-4012 OB_IO_TIMEOUT 和 -4009 OB_IO_ERROR,这两种故障码会触发探测线程执行重试 IO 请求,如果重试超时未完成就会判断磁盘故障,data 相关的磁盘故障有两种级别: data_storage_warn 和 data_storage_error,对应的默认探测超时时间分别为 5s 和 30s。

    DEF_TIME(log_storage_warning_tolerance_time, OB_CLUSTER_PARAMETER, "5s",
    DEF_TIME(data_storage_warning_tolerance_time, OB_CLUSTER_PARAMETER, "5s", "[1s,300s]",
    DEF_TIME_WITH_CHECKER(data_storage_error_tolerance_time, OB_CLUSTER_PARAMETER, "300s", common::ObDataStorageErrorToleranceTimeChecker, "[10s,7200s]",
    
    • 代码里针对 error 级别的错误,还会打印日志,可以使用 grep 命令搜索查看,是否存在磁盘探测触发的 -4392:

      LOG_ERROR_RET(OB_IO_ERROR, "set_disk_error: attention!!!");
      LOG_DBA_ERROR(OB_DISK_ERROR, "msg", "The disk may be corrupted");
      
    • 针对 warn 级别的日志会打:

      LOG_WARN_RET(OB_IO_ERROR, "disk maybe too slow");
      
      • 其中 data_storage_warning_tolerance_time=5s 这个时间相对比较严格,如果使用的机器磁盘性能一般的话建议调大这个值,避免误报。

        示例。

        ALTER SYSTEM SET data_storage_warning_tolerance_time = 20s;
        
    • 如果触发了 data_storage_warn,正常情况下会在 1 min 内洗白,即认为磁盘恢复正常,如果触发了 data_storage_error 则需要 DBA (数据库管理员)介入,如果确认磁盘没有问题,可以执行 ALTER SYSTEM SET disk valid server [=] 'ip:port'; 洗白。

    • 如果触发了上述的两种磁盘故障级别,后续的 IO 请求都会直接报 -4392 OB_DISK_HUNG,直到磁盘洗白前 IO 请求都会直接被判断错误返回,不会往调度层和系统调用提交。根据上述描述,触发探测请求比较多的是 -4012 超时,因此 -4392 前面往往会先出现 -4012,-4012 可以参照上面一条排查。

    • 如果是 slog 写盘慢认为 data 盘故障,可以在日志里搜 Slow write,同样会触发 -4392 快速拒绝机制,同样的,可以调整上面的 log_storage_warning_tolerance_time 如果怀疑 slog/clog 盘没有问题误报,可联系 OceanBase 技术支持确认。

      image.png

IO 相关日志和视图

用于监控和诊断 IO 问题的各种日志和视图

IO 规格和流量

  • 通过 __all_virtual_io_quota 表查看实时 IOPS,在有 IO 流量的情况下,每秒打印一次,如果开了 resource manager 资源隔离和限制,还可以显示指定的资源组 ID(默认为0)。

    示例。

    image.png

  • 通过 grep 过滤关键词 IO STATUS 的命令 grep "IO STATUS" 查看 IO 的配置,主要用于查看 IO 压力大、流量打满的情况下是否满足资源隔离约束。如果在大压力场景 IO 慢则可能是给定的资源规格太小。

    示例。

    image.png

IO 调度队列卡住

  • 通过 grep 过滤关键词 IO SENDER STATUS 的命令 grep "IO SENDER STATUS" 查看 IO 请求调度信息,包括所有调度线程中排队的 IO 请求数量和下一个请求发出时间(对应 __all_virtual_io_scheduler 表),每秒打印一次。主要用于查看 IO 超时、IO 调度队列卡住等问题,如果 sender 中 req_count 数量一段时间没有明显减少,则可能是卡住了,日志信息如下。

    image.png

    此时可以查看时间戳是否对得上(比如理论上发送时间 << 当前时间,则说明队列卡住),时间戳转换使用 date -d@ 命令。

    示例。

    $ date +%s
    1709534153
    $date -d@1709534153
    Mon Mar  4 14:35:53 CST 2024。
    
  • 若有 ObTimeGuard 日志超时打印,可进一步排查具体问题所在阶段。

    针对调度队列卡住的问题,在 sender 中加入了 pop_phyqueuesubmit_req prepare 三个 ObTimeGuard,超时时间均为 100ms,如果发现调度队列卡住可以先查看这几个 ObTimeGuard 是否打印出了相应日志,如下图显示在 prepare 阶段花费了太多时间。

    image.png

IO 引用计数统计

通过 grep 过滤关键词 IO STATUR TRACER 的命令 grep "IO STATUS TRACER" 查看 IO 引用计数统计,用以排查内存泄漏问题(前提是开了 io_tracer 配置项),如果 req_count 持续上涨,那么可能存在有泄漏的问题,可以通过 backtrace 查看调用栈。

相关参考

在 OceanBase 数据库 V4.2 版本中 IO 内存分配模式、上限和 io_tracer 会有比较大的变化,参考 xxx

适用版本

OceanBase 数据库 V4.x 版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/648354.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频批量剪辑神器:一键合并多个视频,轻松添加音频,高效创作无极限!

视频已经成为我们生活中不可或缺的一部分。无论是工作汇报、生活记录&#xff0c;还是创意表达&#xff0c;视频都扮演着至关重要的角色。然而&#xff0c;对于很多非专业剪辑师来说&#xff0c;视频剪辑却是一项既繁琐又耗时的工作。别担心&#xff0c;今天我要给大家介绍一款…

全球AI新闻速递527

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

Mysql中的慢查询

Mysql慢查询的一些sql命令 慢查询的默认事件为10秒 #注意&#xff1a;慢查询一般是在调试阶段开启的&#xff0c;在开发阶段中一般不会开启&#xff0c;会对效率产生延误 #查询慢查询是否开启 show variables like %general%; #慢查询时间设置 show variables like long_query…

酷开科技相伴童年 | 酷开系统六一特辑:亲子共赏,启迪成长

六一儿童节&#xff0c;属于每个茁壮成长的孩子&#xff0c;也属于每个童心未泯的“少年”。《小王子》里说&#xff0c;使生活如此美丽的是我们藏起来的真诚和童心。马上就到六一儿童节了&#xff0c;就让我们用温柔而富有童真的笔触&#xff0c;唤醒那份沉睡已久的童心吧。 在…

NVIDIA Orin/Jetson 平台+数字同轴GMSL 车载AI视觉方案,应用于车载,机器人等领域

专注于成像和视觉技术于近期正式发布了可适配NVIDIA DRIVE AGX Orin平台的一系列摄像头产品&#xff0c;该产品是自主开发的数字同轴GMSL2摄像头模组&#xff0c;可满足智能汽车的高质量成像需求。 目前&#xff0c;推出可适配于NVIDIA DRIVE AGX Orin平台的摄像头产品一共有11…

微软改进WSL子系统 新版将支持镜像宿主机网络接口及使用外部DNS

Windows SubSystem for Linux (即 WSL) 是微软在 Windows 10/11 中开发的子系统功能&#xff0c;该功能允许用户在 Windows 上安装 Linux 系统和相关环境&#xff0c;对开发者来说可以构建 Linux 开发环境进行工作。不过 WSL 系统在功能上也有不少缺点&#xff0c;典型的就是默…

docker安装Elasticsearch(ES)详细教程

使用Docker来安装Elasticsearch&#xff08;简称ES&#xff09;的详细教程如下&#xff1a; 1. 前提条件 确保你的系统已经安装了Docker&#xff0c;并且Docker服务正在运行。如果你使用的是Windows系统&#xff0c;还需要确保已经启用了Hyper-V和容器功能。 2. 拉取Elastic…

Python-opencv通过距离变换提取图像骨骼

文章目录 距离变换distanceTransform函数 距离变换 如果把二值图像理解成地形&#xff0c;黑色表示海洋&#xff0c;白色表示陆地&#xff0c;那么陆地上任意一点&#xff0c;到海洋都有一个最近的距离&#xff0c;如下图所示&#xff0c;对于左侧二值图像来说&#xff0c;【d…

工程技术SCI期刊,中科院4区,收稿范围非常广泛,审稿快易录用!

一、期刊名称 CMES-Computer Modeling in Engineering & Sciences 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;工程技术 影响因子&#xff1a;2.4 中科院分区&#xff1a;4区 三、期刊征稿范围 本期刊在工程与科学的计算机建模领域发表具有合理永…

神经网络的工程基础(一)——利用PyTorch实现梯度下降法

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文涉及到的代码链接如下&#xff1a;regression2chatgpt/ch06_optimizer/gradient_descent.ipynb 本文将讨论利用PyTorch实现…

力扣 第 399 场周赛 解题报告 | 珂学家 | 调和级数 + 分块DP

前言 T1. 优质数对的总数 I 题型: 签到 class Solution:def numberOfPairs(self, nums1: List[int], nums2: List[int], k: int) -> int:res 0for v1 in nums1:for v2 in nums2:if v1 % (v2 * k) 0:res 1return resT2. 压缩字符串 III 思路: 模拟 感觉引入一个栈&…

基于PHP的物业管理的设计与实现

第1章 绪论... 1 1.1 研究背景与意义... 1 1.2 国内外发展现状... 2 第2章 关键技术介绍... 3 2.1 PHP语言... 3 2.2 MySQL数据库... 3 2.3 Zend框架... 4 2.4 B/S架构... 4 第3章 系统需求分析... 5 3.1 可行性分析... 5 3.1.1 技术可行性分析... 5 3.1.2 经济可行…

解决updateByExample时属性值异常的问题(部分属性值没有使用占位符?进行占位,而是变成了属性的名称)

目录 场景简介代码片断实体类 报错信息排查原因解决测试过程解决方案 场景简介 1、程序将mybatis框架升级为3.5.9版本后执行updateByExample方法时报错 代码片断 Condition condition new Condition(MbCcsSessionConfig.class); condition.createCriteria().andEqualTo(&quo…

知识分享:隔多久查询一次网贷大数据信用报告比较好?

随着互联网金融的快速发展&#xff0c;越来越多的人开始接触和使用网络贷款。而在这个过程中&#xff0c;网贷大数据信用报告成为了评估借款人信用状况的重要依据。那么&#xff0c;隔多久查询一次网贷大数据信用报告比较好呢?接下来随小易大数据平台小编去看看吧。 首先&…

【Python】 Django 框架如何支持百万级日访问量

基本原理 Django 是一个高级的 Python Web 框架&#xff0c;它鼓励快速开发和干净、实用的设计。Django 遵循 MVC&#xff08;模型-视图-控制器&#xff09;设计模式&#xff0c;允许开发者通过编写更少的代码来构建高质量的 Web 应用程序。Django 自带了许多内置功能&#xf…

《最新出炉》系列入门篇-Python+Playwright自动化测试-42-强大的可视化追踪利器Trace Viewer

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 在我们日常执行自动化测试工作的过程中&#xff0c;经常会遇到一些偶发性的bug&#xff0c;但是因为bug是偶发性的&#xff0c;我们不一定每次执行都能复现&#xff0c;所以我…

深度学习模型

深度学习模型 深度学习网络模型是人工智能领域的重要分支&#xff0c;它通过模拟人脑神经网络的工作方式来处理数据并识别模式。以下是对深度学习网络模型的一些主要类型的详细概述&#xff1a; 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09; 结构&a…

【Unity实战篇 】| Unity实现 文本框可以自适应大小,到达最大宽度之后再缩小字体

前言 在文本框可以自适应大小拉伸的前提下,增加一个最大限制宽度,使其到达最大宽度后 再启用 Best Fit 实现自适应改变文字大小以适应文本框的大小。 【Unity实战篇 】 | Unity实现 Text文本框可以自适应大小,到达最大宽度之后再缩小字体 在Unity中经常会用到文本组件的自…

Bonfire - [Asset for Zibra Smoke Fire]

Bonfire资产支持URP、BRP和HDRP渲染管道,可以用作VFX或游戏元素。 这种环境资产可用于增强视觉故事性,以及创建自定义游戏机制,为虚拟世界增加互动性和真实性。 全交互:使用Zibra Smoke&Fire进行实时烟雾模拟。 易于使用:您所需要做的就是购买资产并将其放入场景中。不…

【NOIP2015普及组复赛】题3:求和

题3&#xff1a;求和 【题目描述】 一条狭长的纸带被均匀划分出了 n n n 个格子&#xff0c;格子编号从 1 1 1 到 n n n。每个格子上都染了一种颜色 c o l o r i color_i colori​ &#xff08;用 [ 1 &#xff0c; m ] [1&#xff0c;m] [1&#xff0c;m]当中的一个整数表…