OceanBase 生产环境出现「大量慢查询 + TPS 骤降 + 磁盘 IO 飙升」,请分析可能原因、排查步骤与解决方案

可能原因
排查步骤
解决方案

3 个赞
  • 可能原因
  1. 合并(Major Compaction)触发,IO 抢占,读多路归并开销大。
  2. 大表无索引,全表扫描,IO/CPU 飙升。
  3. 长事务未提交,持锁久,阻塞其他事务,锁等待堆积。
  4. 副本同步延迟大,备副本追日志,IO 压力高。
  5. 分区不均衡,热点分区压力集中。
  6. 硬件故障(磁盘坏道、网卡异常)。
  • 排查步骤
  1. 看 OCP 监控:磁盘 IO util/await、合并状态、SSTable 数量、副本延迟、CPU / 内存。
  2. 查慢查询日志:定位慢 SQL,分析执行计划(是否全表扫描、无索引)。
  3. 查事务状态:select * from __all_virtual_trans_stat,找长事务、锁等待。
  4. 查分区分布:select * from __all_virtual_partition,看是否热点分区。
  5. 查硬件状态:磁盘健康、网卡流量、系统日志(dmesg)。
  • 解决方案
  1. 合并导致:紧急手动触发合并(避开高峰)、调整合并阈值、增加 IO 资源。
  2. 无索引:立即加索引,优化 SQL,避免全表扫描。
  3. 长事务:定位并 kill 长事务,优化业务减少长事务。
  4. 副本延迟:检查网络、调整同步批量大小,必要时重建副本。
  5. 热点分区:分区拆分、调整分区键,分散压力。
  6. 硬件故障:更换磁盘 / 网卡,修复硬件。

这是在做财产转移啊 :joy:

财产转移正解

我的妈呀 学到了

@论坛小助手

可能原因

  1. SQL 查询导致的异常:复杂的查询或低效的执行计划导致数据库性能下降。(参考文档:19775)
  2. 磁盘 IO 故障:磁盘性能问题或磁盘利用率过高导致 IO 操作变慢。(参考文档:29, 279)
  3. 租户请求队列积压:高并发请求导致租户请求队列积压,SQL 响应时间变长。(参考文档:19759)
  4. 集群资源不足:如 CPU、内存、网络等资源不足导致性能下降。(参考文档:19716)
  5. 执行计划变差:由于数据分布变化或初始参数选择不当,导致执行计划变差。(参考文档:19264)

排查步骤

  1. 快速基础排查
    • 检查 NTP 时钟是否同步。
    • 检查服务器是否宕机。
    • 检查日志磁盘、数据磁盘空间是否满。
    • 检查机房网络是否抖动。
    • 检查负载均衡设备/组件(如 F5/LVS 等)是否故障。(参考文档:19723)
  2. 确认异常期间业务是否有流量冲高
    • 检查业务请求量是否比平时有明显升高。(参考文档:19723)
  3. 从应用层分析数据库相关报错或异常
    • 检查应用连接池是否满。
    • 检查应用请求是否超时。
    • 检查应用建连是否失败。
    • 检查应用写入是否失败。
    • 检查应用锁冲突。(参考文档:19723)
  4. 分析 SQL 性能问题
    • 使用 oceanbase.gv$ob_sql_audit 表分析 SQL 执行情况。
    • 检查是否存在 buffer 表、大小账号、硬解析等问题。
    • 使用 explain extended 查看执行计划,检查优化器的估行和真实行数是否有巨大差距。
    • 考虑创建更合适的索引、通过 hint 调整计划形态、调整并行度等。(参考文档:271)
  5. 检查磁盘状态
    • 使用系统性能监控工具 tsar 或 vsar 查看磁盘的状态。
    • 使用 fio 测试磁盘性能。(参考文档:29)

解决方案

  1. 优化 SQL 查询
    • 绑定正确的执行计划,避免全表扫描。
    • 创建合适的索引,优化查询性能。(参考文档:19264, 271)
  2. 缓解磁盘 IO 压力
    • 临时调小 log_disk_utilization_threshold,降低磁盘利用率。
    • 调整 log_disk_size 参数,确保磁盘有足够的空间。(参考文档:28, 26)
  3. 处理租户请求队列积压
    • 增加 CPU 资源,提升处理能力。
    • 优化复杂查询,减少队列积压。(参考文档:19759)
  4. 扩展集群资源
    • 增加节点,提高集群的整体资源。
    • 调整集群参数,优化资源利用。(参考文档:19716)
  5. 紧急处理
    • 如果上述方法无法立即解决问题,可以考虑重启受影响的节点,恢复服务。(参考文档:4)

详情请参考:

  1. SQL 查询导致的异常
  2. 磁盘报错[errcode=-4392] disk is hung
  3. SQL 性能问题的典型场景和排查思路
  4. 租户请求队列积压
  5. 数据库应急概述
  6. SQL 调优典型场景和案例
  7. 分析诊断&决策流程
  8. oceanbase clog盘如何瘦身
  9. oceanbase数据库运行过程中手动删除clog日志
  10. get_tenant 失败后重试无法退出

关于SQL的讨论很有价值,特别是在磁盘场景下,合理使用CPU是关键。

具体的原因呢