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

news2024/9/23 5:33:14

本文主要介绍 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.coloradmin.cn/o/1698649.html

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

相关文章

kubectl自动补全插件

1. 安装bash completion yum install -y bash-completion 2. 修改配置补全脚本 在文件 ~/.bashrc 中导入(source)补全脚本: echo source <(kubectl completion bash) >> ~/.bashrc 将补全脚本添加到目录 /etc/bash_completion.d中: kubectl completion bash >…

vivado 设计连接性

设计连接性 IP集成商提供设计师协助&#xff0c;帮助您完成连接过程 设计。图3显示了MHS的一个示例&#xff0c;图4显示了设计帮助 可在IP集成商中获得 地址映射 在XPS中&#xff0c;无论主机访问从机IP&#xff0c;每个从机都有相同的地址。IP integrator为基于master的寻址提…

Wpf 使用 Prism 实战开发Day25

首页待办事项及备忘录添加功能 一.修改待办事项和备忘录逻辑处理类,即AddMemoViewModel和AddTodoViewModel 1.AddMemoViewModel 逻辑处理类&#xff0c;添加View视图数据要绑定的实体类 Model public class AddMemoViewModel :BindableBase,IDialogHostAware{public AddMemoV…

基于信号分解方法的机械故障诊断方法存在的问题

一方面&#xff0c;由于结构共振、测试噪声的干扰&#xff0c;为了确保分解精度&#xff0c;需要给定准确的参数初值(例如&#xff0c;瞬时频率)。研究人员通常认为零部件特征频率与通过传动比和驱动转速计算的理论值基本吻合&#xff0c;并基于理论值设置参数初值。事实上&…

matlab使用教程(78)—控制颜色图范围

1.控制颜色图范围 对于您创建的许多类型的可视化图形&#xff0c;MATLAB 默认将完整的数据范围映射到颜色图上。数据中的最小值映射到颜色图中的第一行&#xff0c;最大值映射到颜色图中的最后一行。所有中间值线性映射到颜色图的中间行。 这种默认映射适用于大部分情况&#x…

网络安全从入门到精通(特别篇I):应急响应之不同平台后门排查思路

Windows-后门-常规&权限维持&内存马 Linux-后门-常规&权限维持&Rootkit&内存马 Windows实验 1、常规MSF后门-分析检测 2、权限维持后门-分析检测 3、Web程序内存马-分析检测 常见工具集合: https://mp.weixin.qq.com/s/L3Lv06bFdUX_ZE4rS69aDg 常规…

【知识拓展】LocalTunnel-高性价比的内网穿透工具(2)

前言 上一篇通过ngrok进行内网穿透&#xff0c;有几个问题&#xff1a; ①需要注册&#xff0c;而且注册需要科学上网&#xff0c;相对麻烦 ②安装配置相对麻烦&#xff0c;authtoekn有限制 上述相对&#xff0c;指的是在非生产环境中做一个简单内网穿透&#xff0c;相对于…

京东应届生公司内网说了一句‘什么时候被pdd收购‘,结果惨遭辞退

京东应届生公司内网说了一句’什么时候被pdd收购’&#xff0c;结果惨遭公司开除 这个事最近在圈子讨论比较多 前二天&#xff0c;有一个上海交大毕业的应届生&#xff0c;在京东实习了9个月&#xff0c;好不容易转正12天后&#xff0c;只因在内网说了一句话&#xff0c;就被…

为什么本科毕业后我坚定地选择了就业而不是考研?

大家好&#xff0c;我是小布丁。今天来聊聊我为什么本科毕业后选择了就业而不是考研。 在整个大学期间&#xff0c;我被亲戚拷问最多的问题就是&#xff1a;准备考研吗&#xff1f;相信很多大学生都遇到过这种情况吧。 如果你说准备还好&#xff0c;亲戚大概率就不会问下去&a…

wetool企业版使用教程及下载方式 微兔该如何使用 wetool还能用吗 wetool扳手工具wetool操作方法难吗 wetool有哪些功能

今天给大家推荐一款我们目前在使用的电脑群发工具掘金小蜜&#xff0c;不仅可以无限多开&#xff0c;方便你同时管理多个账号&#xff0c;群发功能更是十分强大&#xff0c;轻松释放你的双手。 掘金小蜜&#xff08;只支持Win7及以上操作系统&#xff0c;没有推Mac版和手机客户…

蜗牛星际无法用ventoy安装FreeBSD14.1

ventoy 是一个非常棒的开源工具&#xff0c;可以制作usb启动盘&#xff0c;而且可以制作多系统启动盘&#xff0c;只要把iso文件放到ventoy盘的根目录就可以了。 一台蜗牛星际的老机器&#xff0c;把mini ssd盘从16G 升级到32G&#xff0c;用ventoy安装FreeBSD的时候失败&…

【题目】2023年全国职业院校技能大赛 GZ073 网络系统管理赛项赛题第4套B模块

2023年全国职业院校技能大赛 GZ073网络系统管理赛项 赛题第4套 模块B&#xff1a;服务部署 Windows初始化环境 **&#xff08;一&#xff09;默认账号及默认密码** ----------------------------Username: AdministratorPassword: ChinaSkill23!Username: demoPassword: Chi…

【深度学习基础】NumPy数组库的使用

目录 写在开头 一、数组的类型与维度 数组的类型 数组的维度 二、数组的创建 递增数组 同值数组 随机数数组 三、数组的索引 访问/修改单个元素 花式索引 数组的切片 四、数组的变形 数组的转置 数组的翻转 数组的形状改变 数组的拼接 五、数组的运算 数…

心电信号处理算法(包括基线漂移消除技术,高通、低通和陷波滤波,等值线校正和QRS等波群标记等,MATLAB代码)

由于心电信号是心脏活动产生的电位差变化并在人体皮肤表面采集得到的微弱信号&#xff0c;频率大致为0.05Hz~100Hz&#xff0c;波形幅值在10μV~5mV内。与其他生理信号不同之处是&#xff0c;心电信号的频率较低且波形幅值小&#xff0c;在采集时容易被各种噪声干扰。心电信号由…

HTML橙色爱心

目录 写在前面 准备开始 完整代码 运行结果 系列文章 写在后面 写在前面 本期小编给大家分享一颗热烈且浪漫的爱心&#xff0c;快来看看吧&#xff01; 准备开始 在开始之前&#xff0c;我们需要先简单的了解一下这颗爱心的原理哦~ 本期将用html实现这颗跳动的爱心&a…

5.26机器人基础-空间描述和变换-总结

非目录 方便我找 重点 逆解 位姿矩阵的几何意义 实际坐标需要除以比例因子才能得到 比例因子的好处&#xff1a;在计算机的储存更加简单方便&#xff0c;例如x,y,x原先很大时&#xff0c;等比例改变 位姿坐标的齐次变换&#xff1a;左乘齐次坐标 从端点到末端&#xff0c…

rtthread 堆空间申请

#define HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit) //定义堆开始的地址 程序仿真查看 begin_align rw_size; 堆开始地址 最大栈地址 堆的结束地址 ram1最大地址&#xff0c;128kbytes 处。 上述就是rtthread 申请的堆空间大小。

民国漫画杂志《时代漫画》第25期.PDF

时代漫画25.PDF: https://url03.ctfile.com/f/1779803-1248635084-fd4794?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

【数据结构(邓俊辉)学习笔记】图01——图的表示与实现

文章目录 1. 概述1.1 邻接 关联1.2 无向 有向1.3 路径 环路 2. 邻接矩阵2.1 接口2.2 邻接矩阵 关联矩阵2.3 实例2.4 顶点和边2.5 邻接矩阵2.6 顶点静态操作2.7 边操作2.7 顶点动态操作2.8 综合评价 1. 概述 1.1 邻接 关联 相对于此前的线性以及半线性结构&#xff0c;图…

【Python】 XGBoost模型的使用案例及原理解析

原谅把你带走的雨天 在渐渐模糊的窗前 每个人最后都要说再见 原谅被你带走的永远 微笑着容易过一天 也许是我已经 老了一点 那些日子你会不会舍不得 思念就像关不紧的门 空气里有幸福的灰尘 否则为何闭上眼睛的时候 又全都想起了 谁都别说 让我一个人躲一躲 你的承诺 我竟然没怀…