使用机械硬盘后数据库无法使用特别慢

【 使用环境 】生产环境
【 OB or 其他组件 】
【 使用版本 】5.7.25-OceanBase_CE-v4.2.1.10
【问题描述】清晰明确描述问题
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

根据您提供的信息,您的 OceanBase 数据库在使用机械硬盘(HDD)后性能显著下降。以下是可能的原因及建议的解决方案:

可能原因

  1. I/O 性能瓶颈

    • 机械硬盘的随机读写性能远低于固态硬盘(SSD),这可能导致数据库操作(如索引创建、日志写入等)变得非常缓慢。
  2. 配置问题

    • 某些默认配置可能更适合 SSD 环境,当使用 HDD 时,这些配置可能导致性能不佳。
  3. 硬件故障或老化

    • 机械硬盘可能存在硬件故障或老化问题,导致读写速度大幅下降。

解决方案

1. 评估和优化 I/O 性能

  • 检查磁盘 I/O 性能:使用工具如 iostatfio 来监控和评估磁盘的 I/O 性能。如果发现 I/O 延迟过高,考虑更换为 SSD 或者优化现有 HDD 的使用方式。

  • 调整参数

    • 降低 Redo 日志刷盘频率:可以通过调整 ob_log_disk_usage_limit_percentage 参数来减少 Redo 日志的频繁刷盘。
    • 调整内存缓存大小:增加 memstore_limit_percentageminor_freeze_times 参数值,以减少频繁的 Minor Freeze 操作。
    • 启用异步 I/O:确保启用了异步 I/O 支持,以提高磁盘 I/O 效率。

2. 检查硬件健康状态

  • 运行 SMART 测试:使用 smartctl 工具检查机械硬盘的健康状态,排除硬件故障的可能性。

  • 替换硬盘:如果确认硬盘存在故障或老化问题,建议尽快更换为新的硬盘,最好是 SSD。

3. 调整数据库配置

  • 参考官方文档:根据 V4.2.1_CE Release Notes 中的优化建议,调整相关参数以适应 HDD 环境。

  • 使用 obdiag 工具收集诊断信息:按照您提供的链接使用 obdiag 工具收集详细的诊断信息,以便进一步分析问题。

长期建议

  • 升级硬件:如果条件允许,建议将机械硬盘升级为固态硬盘,以获得更好的性能表现。

  • 定期维护:定期进行硬件和软件的维护,确保系统处于最佳状态。

如果您需要更详细的帮助或有其他问题,请提供更多的日志信息或联系 OceanBase 的技术支持团队。希望以上建议能帮助您解决问题。

检索到的文档如下:

  1. OceanBase 数据库社区版
  2. obcdc 支持增量旁路导入
  3. OceanBase 术语
  4. OceanBase 概述

安装fio
sudo yum install fio

运行基本测试

fio 使用作业文件(job file)或者命令行参数来定义测试。有时候使用简单的命令行参数进行测试会更快捷。

顺序读/写测试

  • 顺序写测试:
  fio --name=seq_write --ioengine=libaio --rw=write --bs=1m --size=1G --numjobs=1 --runtime=60 --group_reporting
  • 顺序读测试:
  fio --name=seq_read --ioengine=libaio --rw=read --bs=1m --size=1G --numjobs=1 --runtime=60 --group_reporting

随机读/写测试

  • 随机写测试:
  fio --name=rand_write --ioengine=libaio --rw=randwrite --bs=4k --size=1G --numjobs=4 --runtime=60 --group_reporting
  • 随机读测试:
  fio --name=rand_read --ioengine=libaio --rw=randread --bs=4k --size=1G --numjobs=4 --runtime=60 --group_reporting

参数解释

  • --name: 任务名称。
  • --ioengine: I/O引擎,常用的有sync, libaio, psync等。
  • --rw: 读写模式,write, read, randwrite, randread, rw(读写混合)等。
  • --bs: 块大小,例如4k表示每次I/O为4KB。
  • --size: 总的I/O数据量,例如1G
  • --numjobs: 并发任务数。
  • --runtime: 运行时间,以秒为单位。
  • --group_reporting: 汇总报告以减少输出的冗余信息。

查看结果

fio 会在命令行输出测试结果,其中包含吞吐量(throughput)、IOPS(每秒I/O操作数)及延迟等详细信息,帮助你了解磁盘在不同负载下的性能表现。

使用这些基本命令和参数配置,你可以衡量不同类型的磁盘(如SSD和HDD)的性能特征,并根据需要调整测试场景以模拟实际应用中的工作负载。

1 个赞

随机写iops : min=137870, max=145448, avg=141917.00, stdev=2259.22, samples=12
随机读iops : min= 4, max= 94, avg=36.24, stdev=15.84, samples=480

根据您提供的 fio 测试结果,机械硬盘(HDD)的随机读写性能确实非常低,这可能是导致 OceanBase 数据库性能显著下降的主要原因。具体来看:

  • 随机写 IOPS:平均为 141,917 IOPS,这个数值相对较高,表明 HDD 在处理随机写操作时表现尚可。
  • 随机读 IOPS:平均仅为 36.24 IOPS,这个数值非常低,表明 HDD 在处理随机读操作时性能极差。

分析与建议

1. 确认测试环境

确保 fio 测试是在数据库实际使用的磁盘上进行的,并且没有其他高负载任务干扰测试结果。如果可能,尝试在不同的时间段或不同的磁盘上重复测试,以排除偶然因素。

2. 评估硬件选择

从测试结果来看,HDD 的随机读性能非常差,这对于需要频繁随机读取操作的数据库系统(如 OceanBase)来说是不可接受的。以下是一些建议:

  • 升级到 SSD:SSD 的随机读写性能远高于 HDD,尤其是对于数据库这种对 I/O 性能要求较高的应用,SSD 可以显著提升性能。

  • 使用混合存储方案:如果暂时无法全部更换为 SSD,可以考虑使用混合存储方案,将热数据放在 SSD 上,冷数据放在 HDD 上,以平衡成本和性能。

3. 优化数据库配置

尽管硬件升级是最直接有效的解决方案,但在硬件条件受限的情况下,也可以通过调整数据库配置来缓解性能问题:

  • 减少日志刷盘频率:可以通过调整 ob_log_disk_usage_limit_percentage 参数来减少 Redo 日志的频繁刷盘。

  • 增加内存缓存:适当增加 memstore_limit_percentageminor_freeze_times 参数值,以减少频繁的 Minor Freeze 操作。

  • 启用异步 I/O:确保启用了异步 I/O 支持,以提高磁盘 I/O 效率。

4. 监控与诊断

使用 obdiag 工具收集详细的诊断信息,进一步分析是否存在其他潜在问题。例如:

obdiag collect --all -o /path/to/output

这可以帮助您更全面地了解系统的运行状态,找出可能的瓶颈。

5. 参考官方文档

根据 V4.2.1_CE Release Notes 中的优化建议,调整相关参数以适应 HDD 环境。

长期建议

  • 硬件升级:如果条件允许,建议尽快将机械硬盘升级为固态硬盘,以获得更好的性能表现。

  • 定期维护:定期进行硬件和软件的维护,确保系统处于最佳状态。

如果您需要更详细的帮助或有其他问题,请提供更多的日志信息或联系 OceanBase 的技术支持团队。希望以上建议能帮助您解决问题。

总结

根据 fio 测试结果,HDD 的随机读性能非常低,这是导致 OceanBase 数据库性能显著下降的主要原因。建议优先考虑硬件升级,同时结合数据库配置优化和监控诊断,以全面提升系统性能。

详情请参考:

  1. obcdc 配置项说明
  2. I/O 相关参数
  3. 全量旁路导入
  4. NORMAL
  5. 统计信息和估行机制的使用

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

1 个赞

随机写入还挺快的,为什么数据库写入很慢

一般随机读低,随机写也不会高。可以再测试一下。是否有ssd磁盘可以切换呢,更换一下硬件测试一下

没有ssd

obdiag收集SQL性能问题信息
obdiag gather scene run --scene=observer.perf_sql --env “{db_connect=’-hxx -Pxx -uxx -pxx -Dxx’, trace_id=‘xx’}”
可以分析出sql慢在哪一步

目前我们写入慢

机械磁盘慢这是预期内的,建议更换ssd磁盘

1 个赞

我们的其中一个集群也使用了HDD,性能确实有差距