【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 版本。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动云:连接未来的智慧之旅

随着数字化转型的加速&#xff0c;云服务在各行各业中的应用越来越广泛。移动云不仅提供了灵活的计算和存储资源&#xff0c;还通过创新的技术手段&#xff0c;为企业和开发者解决了许多实际问题。在这个变革的大背景下&#xff0c;移动云服务作为中国移动倾力打造的云业务品牌…

​​​【收录 Hello 算法】10.4 哈希优化策略

目录 10.4 哈希优化策略 10.4.1 线性查找&#xff1a;以时间换空间 10.4.2 哈希查找&#xff1a;以空间换时间 10.4 哈希优化策略 在算法题中&#xff0c;我们常通过将线性查找替换为哈希查找来降低算法的时间复杂度。我们借助一个算法题来加深理解。 Question 给…

vscode 插件-01基础

翻译 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code 适用于 VS Code 的中文&#xff08;简体&#xff09;语言包 远程连接 Remote Development Remote Development是vscode的远程编程与调试的插件&#xff0c;使用这个插件可以在很多情况下代替vim…

Linux VIM指令

三种模式 命令模式&#xff1a;控制屏幕光标的移动&#xff0c;字符、字或行的删除等输入对文件的一些指令 插入模式&#xff1a;对文件内容进行文字输入 底行摸索&#xff1a;文件保存或退出&#xff0c;也可以进行文件替换&#xff0c;找字符串&#xff0c;列出行号等操作…

error LNK2038: 检测到“boost_log_abi”的不匹配项

最近项目上遇到了这个问题&#xff0c;看提示和查阅资料知道是boost版本不匹配的问题&#xff0c;但是项目原因换boost版本不太现实&#xff0c;一时竟然不知道怎么解决。 后来在同事的提示下&#xff0c;对于boost_log相关的代码&#xff0c;引用其头文件时&#xff0c;放到最…

云计算-关系型数据库(Relational Database)

关系数据库服务&#xff08;RDS&#xff09;&#xff08;Relational Database Service (RDS)&#xff09; Amazon RDS 可用于在云中设置和运行关系数据库。它支持多种数据库实例类型以及多个数据库引擎&#xff0c;如 Amazon Aurora、PostgreSQL、MySQL、MariaDB、Oracle 数据库…

Unity环绕物体的摄像机,添加了遮挡的适应

第三人人称摄像机 支持的功能 设定目标后使用鼠标可以环绕目标点旋转&#xff0c;且会进行遮挡的适配&#xff0c;当有遮挡的时候会移动差值移动到没有遮挡的位置。 使用方式 将vThirdPersonCamera 挂在与摄像机上然后为target赋值。 如果有需要检测遮挡的层级可以修改&…

早餐店燃气安全岂能马虎?探头选择与年检必须到位

在现代都市生活中&#xff0c;早餐店作为人们日常生活中的重要一环&#xff0c;其安全性问题日益受到人们的关注。其中&#xff0c;燃气泄漏引发的火灾和爆炸事故尤为令人担忧。 因此&#xff0c;点式可燃气体报警器在早餐店中的应用显得尤为重要。 在这篇文章中&#xff0c;…

AIGC产业链上下游解析及常见名词

文章目录 AIGC上游产业链 - 基础层AIGC中游产业链 - 大模型层与工具层AIGC下游产业链 - 应用层AIGC产业链常见的名词表 在上一章节为大家介绍了 “大模型的不足与解决方案” &#xff0c;这一小节呢为大家针对AIGC的相关产业进行一个拆解&#xff0c;以及相关的一些专业名词做出…

【编程题-错题集】奇数位丢弃(模拟 - 规律)

牛客对应题目链接&#xff1a;奇数位丢弃_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 通过⼀两个例子的模拟&#xff0c;可以发现&#xff1a;每次起始删除的下标都是 2 的次方。根据这个规律&#xff0c;找到最后⼀次删除的起始位置的下标即可。 二、代码 #include <io…

感知觉训练:解锁独立生活的钥匙

在日新月异的科技时代&#xff0c;一款名为“蝙蝠避障”的辅助软件以其独到之处&#xff0c;为盲人朋友的日常生活平添了诸多便利&#xff0c;不仅实现了实时避障&#xff0c;还通过拍照识别功能扩展了信息获取的边界。然而&#xff0c;科技辅助之外&#xff0c;提升盲人朋友的…

Android 深入系统源码探讨 Activity、Window 和 View 的关系与实践

文章目录 1、概括2、Android Window 设计2.1、Window 类2.2、PhoneWindow2.3、WindowManager2.4、ViewRootImpl2.5、DecorView 3、Android Activity 设计3.1、Activity的基本概念3.2.、Activity的生命周期3.3、Activity的内部结构 4、Android View 设计4.1、View的基本概念4.2、…

LangChain 0.2 - 构建RAG应用

本文翻译整理自&#xff1a;Build a Retrieval Augmented Generation (RAG) App https://python.langchain.com/v0.2/docs/tutorials/rag/ 文章目录 一、项目说明什么是 RAG &#xff1f;概念索引检索和[生成 二、预览三、详细演练1.索引&#xff1a;加载2. 索引&#xff1a;拆…

陈丽:人工智能赋能教育创新发展

5月20日&#xff0c;在顾明远先生莅临科大讯飞考察指导高端咨询会暨“人工智能与未来教育”的主题研讨会上&#xff0c;北京师范大学原副校长、中国教育技术协会副会长陈丽教授作了题为《人工智能赋能教育创新发展》的主旨报告。 &#xff08;以下内容根据陈丽教授在研讨会上的…

期权课程之第三节【什么是ITM,ATM,OTM】

我们可以根据正股行权价和股价关系 对期权进行一个分类 ITM 全称为In-the-money&#xff1a;行权后可以获得收益的期权 根据call和put &#xff0c;又可以分为两类 ITM call &#xff1a; 行权价< 股价 &#xff0c;IMT Put &#xff1a;行权价>股价 比如这个时候&a…

分享免费的手机清理软件app,一款国外开发的手机清理神器,让手机再战两年!

手机内存越来越大&#xff0c;软件却越来越占地方&#xff0c;就像微信这家伙&#xff0c;轻轻松松就吃了十几个G&#xff01; 害得阿星8128G的手机&#xff0c;本来想换新的&#xff0c;结果用了这款Avast Cleanup软件&#xff0c;瞬间感觉手机还能再战两年&#xff01; 注意…

云上聚智共创未来 | 移动云的项目实战,10分钟让你获得高度可玩的个人博客网站

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 随着互联网的发展各种以前看起来离我们比较遥远的词越来越近了&#xff0c;比如 云服务、大数据、区块链、容器这些听起来…

VMware ESXi 7.0U3q macOS Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) ESXi 7 U3 标准版集成 Intel 网卡、Realtek USB 网卡 和 NVMe 驱动 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3-sysin/&#xff0c;查看最新版。原创作品…

Android network — 进程指定网络发包

Android network — 进程指定网络发包 0. 前言1. 进程绑定网络1.1 App进程绑定网络1.2 Native进程绑定网络 2. 源码原理分析2.1 申请网络requestNetwork2.2 绑定网络 BindProcessToNetwork 3. 总结 0. 前言 在android 中&#xff0c;一个app使用网络&#xff0c;需要在manifest…

X-CSV-Reader:一个使用Rust实现CSV命令行读取器

&#x1f388;效果演示 ⚡️快速上手 依赖导入&#xff1a; cargo add csv读取实现&#xff1a; use std::error::Error; use std::fs::File; use std::path::Path;fn read_csv<P: AsRef<Path>>(filename: P) -> Result<(), Box<dyn Error>> {le…