引言
磁盘 I/O 是数据库性能分析中的关键因素之一。数据库的 SQL 执行、数据页读取、redo/归档写入、临时表空间排序、备份恢复等操作都会依赖底层存储性能。在生产环境中,可以通过操作系统层面的 iostat、iotop、pidstat 等工具快速观察磁盘负载、I/O 延迟、吞吐量和进程级 I/O 消耗,从而定位数据库是否存在磁盘 I/O 瓶颈。
iostat 属于 Linux sysstat 工具集,主要用于输出 CPU 与设备 I/O 统计信息。需要注意的是,iostat 默认第一组数据通常是系统启动以来的平均值,容易误导分析;生产排查时建议加 -y 跳过第一组历史平均值,只看实时采样数据。
一、常用监控命令
# 每 1 秒显示一次磁盘扩展统计,单位为 MB,跳过启动以来的第一组平均值
iostat -x -d -m -y 1
# 连续采样 10 次,每秒一次
iostat -x -d -m -y 1 10
# 显示所有磁盘和分区
iostat -x -d -m -p ALL -y 1
# 类似 top,按进程查看实时 I/O
iotop -oPa
# 查看每个进程的 I/O 统计
pidstat -d 1
# 查看 Oracle 数据库进程 I/O
pidstat -d -p $(pgrep -d, -f "ora_.*_${ORACLE_SID}") 1
# 先确认 MySQL 进程名
ps -ef | grep -i mysql | grep -v grep
# 查看 MySQL 进程 I/O
pidstat -d -p $(pidof mysqld) 1
# 查看 MySQL 进程下所有线程的 I/O
pidstat -d -t -p $(pidof mysqld) 1
# 先确认 达梦 进程名
ps -ef | grep -i dmserver | grep -v grep
# 查看指定进程 I/O,例如达梦 dmserver
pidstat -d -p $(pidof dmserver) 1
# 查看 达梦 进程下所有线程的 I/O
pidstat -d -t -p $(pidof dmserver) 1
二、iostat 核心指标解读
说明:以下阈值适用于通用数据库环境,重点以 Oracle OLTP/混合负载为基线,同时也适用于达梦、MySQL、PostgreSQL、SQL Server 等数据库的 I/O 初步判断。
实际阈值需要结合磁盘类型、RAID 级别、SAN/存储阵列、虚拟化平台、云盘规格以及业务基线综合判断。
| 指标 | 含义 | 通用数据库场景参考,以 Oracle 为基线 |
|---|---|---|
r/s, w/s |
每秒读 / 写请求次数,即 IOPS | 反映数据库随机读写压力。单块 10K/15K SAS HDD 通常约 150~300 IOPS;SATA SSD 通常数千到上万 IOPS;企业级 SAS/SATA SSD 可达数万 IOPS;NVMe SSD 可达数十万 IOPS,具体取决于型号、队列深度和阵列能力 |
rMB/s, wMB/s |
每秒读 / 写数据量,即吞吐量 | 反映数据库大块读写能力。HDD 单盘常见 100~250 MB/s;SATA SSD 常见 400~550 MB/s;企业级 SAS/SATA SSD 可达 500MB/s~数 GB/s;NVMe SSD 可达数 GB/s |
%util |
设备忙碌时间占比,表示该设备处理 I/O 的时间比例 | 单块传统磁盘持续 > 80% 需要关注;如果同时 await 升高,通常说明磁盘接近瓶颈。对于 NVMe、多队列设备、SAN、云盘,%util 高不一定代表瓶颈,必须结合 await、aqu-sz 和数据库等待事件判断 |
await |
平均每次 I/O 请求完成时间,单位毫秒,包含排队时间和实际服务时间 | 数据库最关键指标之一。Oracle redo log、控制文件、数据文件 I/O 都对延迟敏感。NVMe SSD 通常应 < 1ms~2ms;企业级 SSD 通常 < 2ms~5ms;SATA SSD 通常 < 5ms~10ms;HDD 通常 < 10ms~20ms。持续 > 20ms 需要重点排查,> 50ms 通常已经明显影响数据库性能 |
aqu-sz / avgqu-sz |
平均 I/O 队列长度,不同 sysstat 版本字段名可能不同 | 表示设备队列中等待处理的 I/O 数量。持续 > 2 且 await 升高,说明 I/O 开始排队;高并发数据库或高性能阵列中队列可以更高,但前提是 await 仍然稳定 |
avgrq-sz |
平均请求大小,通常以扇区为单位,1 扇区 = 512 字节 | 可用于判断 I/O 模式。Oracle 常见数据块大小为 8KB,也可能是 16KB、32KB;对应约 16、32、64 个扇区。小请求通常代表随机 I/O,大请求通常代表全表扫描、备份、数据泵、RMAN、并行查询等顺序 I/O |
rareq-sz, wareq-sz |
平均读 / 写请求大小,新版本 sysstat 中更常见 | 用于区分读请求和写请求的大小。读请求大,可能是全表扫描、并行查询、备份读取;写请求大,可能是数据文件批量写、归档、备份、临时文件写入等 |
常见磁盘类型参考
| 磁盘 / 存储类型 | IOPS 参考 | 吞吐量参考 | 延迟参考 | 数据库适用建议 |
|---|---|---|---|---|
| 7.2K SATA HDD | 80~150 IOPS | 100~180 MB/s | 10~20ms 或更高 | 不建议承载核心数据库随机 I/O,可用于备份、归档、低频数据 |
| 10K / 15K SAS HDD | 150~300 IOPS | 150~250 MB/s | 5~15ms | 传统数据库环境常见,适合中低并发业务,建议配合 RAID10 |
| SATA SSD | 数千到上万 IOPS | 400~550 MB/s | 0.5~5ms | 可用于中小型数据库,性能明显优于 HDD,但写入寿命和稳定性需关注 |
| 企业级 SAS SSD | 数万 IOPS | 500MB/s~数 GB/s | 0.2~2ms | 适合核心 OLTP 数据库,稳定性和持续写入能力更好 |
| NVMe SSD | 数十万 IOPS | 数 GB/s | 0.05~1ms | 适合高并发、低延迟数据库场景,需关注多队列、NUMA、文件系统和调度策略 |
| SAN 存储 | 取决于控制器、缓存、RAID、后端磁盘 | 取决于链路和阵列配置 | 取决于存储负载 | 企业 Oracle 常见架构,需要结合存储侧指标分析 |
| 云盘 / 分布式块存储 | 取决于购买规格 | 取决于购买规格 | 波动较大 | 重点关注 IOPS、吞吐上限、突发性能、云厂商限速策略 |
三、关键判断原则与典型现象表
| 现象 | 判断含义 | 可能原因 | 处理方向 |
|---|---|---|---|
%util 高,await 低 |
设备很忙,但响应速度正常 | 高性能 SSD、NVMe、多队列存储、SAN 缓存命中较好 | 不要单独根据 %util 判断瓶颈,继续观察数据库等待事件、SQL 响应时间和业务延迟 |
%util 高,await 高 |
磁盘忙且 I/O 响应变慢,存在明显瓶颈风险 | 磁盘能力不足、I/O 请求集中、存储后端繁忙、多个任务抢占同一磁盘 | 检查热点磁盘、数据文件、redo log、归档、备份、批处理任务 |
await 高,%util 不一定高 |
单次 I/O 延迟高,但设备未必满负载 | 存储链路抖动、虚拟化存储争用、SAN 后端延迟、云盘限速、磁盘故障 | 重点排查存储链路、云盘规格、SAN 性能、路径异常、数据库等待事件 |
aqu-sz / avgqu-sz 高,await 高 |
I/O 请求已经排队 | 并发 I/O 过高、存储处理能力不足、数据库大 SQL 或批处理集中运行 | 降低并发任务、错峰批处理、优化 SQL、提升存储能力 |
r/s 高,rMB/s 低 |
小块随机读较多 | 索引回表多、热点 SQL 高频访问、执行计划不合理、缓存命中率不足 | 检查索引、执行计划、统计信息、buffer cache 命中情况 |
r/s 高,await 高 |
随机读延迟明显 | 存储随机读能力不足、索引访问离散、数据分布差、热点块争用 | 优化 SQL 和索引,减少随机回表,检查数据库等待事件 |
rMB/s 高,avgrq-sz 大 |
大块顺序读较多 | 全表扫描、并行查询、RMAN 备份、Data Pump 导出、报表查询 | 检查大 SQL、并行度、备份任务、报表任务是否与业务高峰冲突 |
w/s 高,wMB/s 低 |
小块随机写较多 | 高频提交、小事务多、索引维护频繁、临时写入频繁 | 检查提交频率、索引数量、事务设计、临时表空间使用 |
wMB/s 高,await 高 |
大量写入且写延迟升高 | redo log 写入压力大、归档写入慢、批量 DML、备份或 ETL 写入 | 检查 redo、归档、批量任务、备份任务、临时表空间和存储写性能 |
await 高但 rMB/s、wMB/s 不高 |
吞吐没打满,但延迟很高 | 随机 I/O、存储抖动、虚拟化争用、云盘 IOPS 限制、磁盘坏道或路径异常 | 不要只看吞吐,重点排查 IOPS、延迟、队列、存储链路和数据库等待事件 |
avgrq-sz 较小,r/s 或 w/s 高 |
小 I/O 压力较大 | OLTP 随机访问、索引访问、频繁提交、热点数据访问 | 关注 IOPS 和延迟,优化 SQL、索引、缓存和事务提交方式 |
avgrq-sz 较大,rMB/s 或 wMB/s 高 |
大 I/O 压力较大 | 全表扫描、并行查询、备份、导入导出、批量装载 | 关注吞吐能力,检查任务时间窗口和存储带宽 |
CPU %iowait 高 |
CPU 大量时间在等待 I/O 完成 | 数据库 I/O 延迟高、存储响应慢、大量进程等待磁盘 | 结合 iostat、pidstat、top、数据库等待事件一起分析 |
pidstat 显示数据库进程读写很高 |
I/O 主要由数据库产生 | SQL、大事务、备份、归档、临时空间、检查点等数据库行为 | 继续从数据库内部定位具体 SQL、会话、等待事件和对象 |
pidstat 显示非数据库进程读写很高 |
I/O 被外部进程抢占 | 备份脚本、压缩、同步、杀毒、EDR、日志采集、系统任务 | 调整任务时间,限制 I/O,排除非数据库进程干扰 |
四、生产环境建议告警阈值
说明:以下阈值适用于通用数据库生产环境,重点以 Oracle OLTP/混合负载为基线,同时也适用于 MySQL、PostgreSQL、达梦、SQL Server 等数据库场景。
实际告警阈值不应只依赖固定数值,应结合业务高峰期基线、磁盘类型、RAID/SAN/云盘规格、数据库等待事件和 SQL 响应时间综合判断。
| 指标 | 关注阈值 | 告警阈值 | 严重告警阈值 | 说明 |
|---|---|---|---|---|
%util |
持续 > 70% | 持续 > 85% | 持续 > 95% 且 await 升高 |
传统 HDD 或单队列设备上参考价值较高;NVMe、多队列、SAN、云盘环境中不能单独判断瓶颈 |
await |
SSD 持续 > 5ms;HDD 持续 > 15ms | SSD 持续 > 10ms;HDD 持续 > 20ms | 持续 > 50ms | 数据库 I/O 排查最关键指标之一,表示平均 I/O 响应时间,包含排队时间和服务时间 |
aqu-sz / avgqu-sz |
持续 > 2 | 持续 > 5 | 持续 > 10 且 await 升高 |
表示 I/O 队列深度。队列高但延迟低,可能是高性能设备正常并发;队列高且延迟高,说明 I/O 排队严重 |
r/s, w/s |
达到历史高峰基线的 70% | 达到历史高峰基线的 90% | 超过历史高峰并伴随 await 升高 |
主要反映 IOPS 压力。小块随机读写场景下尤其重要 |
rMB/s, wMB/s |
达到设备或云盘规格上限的 70% | 达到规格上限的 85% | 达到规格上限的 95% 且业务变慢 | 主要反映吞吐压力。备份、导入导出、全表扫描、批处理场景下重点关注 |
avgrq-sz |
明显偏离业务基线 | 小 I/O 数量快速升高或大 I/O 持续打满 | 请求大小异常变化并伴随延迟升高 | 用于判断 I/O 类型变化。小请求通常偏随机 I/O,大请求通常偏顺序 I/O |
CPU %iowait |
持续 > 10% | 持续 > 20% | 持续 > 40% | 表示 CPU 等待 I/O 完成的比例。需要结合 iostat、pidstat 和数据库等待事件判断 |
数据库进程 kB_rd/s、kB_wr/s |
明显高于日常基线 | 长时间维持高位 | 高 I/O 同时业务响应明显下降 | 通过 pidstat -d 判断 I/O 是否主要由数据库进程产生 |
| 非数据库进程 I/O | 出现在业务高峰期 | 持续抢占磁盘带宽 | 导致数据库 await 升高 |
重点检查备份、压缩、同步、杀毒、EDR、日志采集、系统任务 |
不同磁盘类型的延迟参考
| 磁盘 / 存储类型 | 正常参考 | 关注阈值 | 告警阈值 | 说明 |
|---|---|---|---|---|
| 7.2K SATA HDD | 10~20ms | > 20ms | > 50ms | 不建议承载核心数据库随机 I/O |
| 10K / 15K SAS HDD | 5~15ms | > 15ms | > 30ms | 传统数据库环境常见,建议配合 RAID10 |
| SATA SSD | 0.5~5ms | > 5ms | > 10ms | 适合中小型数据库,需关注持续写入能力 |
| 企业级 SAS/SATA SSD | 0.2~2ms | > 3ms | > 5~10ms | 适合核心 OLTP 数据库 |
| NVMe SSD | 0.05~1ms | > 2ms | > 5ms | 高性能低延迟场景,需结合队列深度判断 |
| SAN 存储 | 取决于阵列和链路 | 明显高于历史基线 | 持续高于基线 2 倍以上 | 需要结合存储控制器、缓存、RAID、链路和多路径分析 |
| 云盘 / 分布式块存储 | 取决于购买规格 | 接近规格上限或延迟抖动 | 持续限速或延迟突增 | 重点关注 IOPS、吞吐上限、突发积分、云厂商限速策略 |
告警判断建议
生产环境中,不建议只设置单一指标告警。更推荐使用组合条件。
| 告警组合 | 判断含义 | 建议动作 |
|---|---|---|
%util > 85% 且 await > 20ms |
磁盘繁忙且 I/O 响应变慢 | 检查热点磁盘、数据库进程、备份、归档、批处理 |
aqu-sz > 5 且 await > 20ms |
I/O 请求排队明显 | 检查并发任务、存储能力、数据库大 SQL |
await > 50ms 持续 5 分钟 |
I/O 延迟严重 | 立即排查存储、数据库等待事件、系统任务 |
r/s 高但 rMB/s 不高,且 await 升高 |
小块随机读压力大 | 检查 SQL、索引、执行计划、缓存命中率 |
wMB/s 高且 await 升高 |
大量写入导致延迟升高 | 检查日志文件、归档、批量 DML、备份、ETL |
CPU %iowait > 20% 且 await 升高 |
系统明显等待磁盘 I/O | 结合 iostat、pidstat、数据库等待事件综合定位 |
| 非数据库进程 I/O 高且数据库响应变慢 | 外部任务抢占磁盘 | 调整备份、压缩、同步、杀毒、日志采集任务 |
五、总结
生产环境中的 I/O 告警不应只看 %util,更应关注 await、aqu-sz、IOPS、吞吐量和数据库内部等待事件的组合变化。对于数据库系统来说,磁盘是否“忙”不是最关键的问题,I/O 延迟是否持续升高、请求是否排队、业务 SQL 是否变慢,才是判断 I/O 瓶颈的核心依据。




