一,问题影响
磁盘 I/O 延迟过高会直接导致:
- 系统整体卡顿:所有依赖磁盘读写的操作(如日志写入、数据库读写、文件存储)都会变慢
- 业务响应超时:数据库查询、接口调用、服务启动等耗时大幅增加,甚至引发超时
- 服务稳定性下降:严重时会导致进程夯住、服务宕机,影响业务连续性
二,排查步骤(按优先级)
-
快速定位高 I/O 进程
登录目标主机 ,执行以下命令:
bash# 实时查看I/O占用最高的进程(按%iowait排序) iostat -x 1 5 # 或更直观的进程级I/O监控 iotop -oP
- 重点关注 %util(磁盘利用率,接近 100% 说明磁盘饱和)、r_wait/w_wait(读写等待时间)
- 找到占用 I/O 最高的进程 PID,进一步排查对应服务(如 MySQL、日志服务、备份任务等)
-
分析磁盘分区与挂载
bash# 查看sda分区与挂载情况 df -h /dev/sda* lsblk # 检查是否存在分区满、inode耗尽 df -i
- 若分区使用率 > 90%,会直接导致 I/O 飙升,需清理冗余数据
- 检查挂载参数是否异常(如错误使用同步挂载、noatime 未配置等)
- 针对性排查常见场景
| 常见场景 | 排查命令 | 处理建议 |
|---|---|---|
| 数据库 I/O 过高 | mysqladmin processlist / show processlist; | 优化慢查询、调整 InnoDB 缓冲池、分库分表 |
| 日志 / 备份任务 | du -sh /var/log/* / ps aux grep backup |
清理过期日志、调整备份时间至业务低峰 |
| 磁盘硬件故障 | smartctl -a /dev/sda | 检查磁盘健康状态,若有坏道需更换磁盘 |
| 系统 IO 调度器问题 | cat /sys/block/sda/queue/scheduler | 机械盘用 mq-deadline/noop,SSD 用 none |
三,分析iostat -x 1 5结果,查看I/O占用
bash
[root@db ~]# iostat -x 1 5
Linux 3.10.0-957.el7.x86_64 (26) 2026年04月13日 _x86_64_ (52 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.90 0.00 0.17 0.86 0.00 98.07
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.02 0.76 0.23 55.51 12.83 3256.20 117.29 0.04 0.77 11.15 0.73 0.37 2.07
dm-0 0.00 0.00 0.02 0.10 1.29 0.95 39.42 0.00 29.63 6.73 33.72 9.91 0.11
dm-1 0.00 0.00 0.03 0.03 0.10 0.11 8.00 0.00 43.84 14.47 70.65 5.40 0.03
dm-2 0.00 0.00 0.21 56.14 11.43 3255.13 115.94 0.04 0.71 11.44 0.67 0.35 2.00
avg-cpu: %user %nice %system %iowait %steal %idle
2.35 0.00 0.33 1.75 0.00 95.57
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 85.00 0.00 4072.00 95.81 1.53 18.09 0.00 18.09 9.24 78.50
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-2 0.00 0.00 0.00 82.00 0.00 4144.00 101.07 1.53 18.73 0.00 18.73 9.56 78.40
avg-cpu: %user %nice %system %iowait %steal %idle
1.89 0.00 0.27 0.87 0.00 96.98
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 54.00 0.00 3160.00 117.04 0.93 17.35 0.00 17.35 7.83 42.30
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-2 0.00 0.00 0.00 53.00 0.00 2960.00 111.70 0.93 17.66 0.00 17.66 7.96 42.20
avg-cpu: %user %nice %system %iowait %steal %idle
0.98 0.00 0.27 1.60 0.00 97.15
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 92.00 0.00 9036.00 196.43 2.32 24.62 0.00 24.62 7.01 64.50
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-2 0.00 0.00 0.00 95.00 0.00 9084.00 191.24 2.32 23.82 0.00 23.82 6.80 64.60
avg-cpu: %user %nice %system %iowait %steal %idle
2.33 0.00 0.40 1.75 0.00 95.51
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 89.00 0.00 3916.00 88.00 1.55 18.02 0.00 18.02 7.39 65.80
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-2 0.00 0.00 0.00 86.00 0.00 3868.00 89.95 1.54 18.60 0.00 18.60 7.64 65.70
[root@db ~]#
- 磁盘确实在持续高写压力
- sda 利用率 %util 瞬间冲到 44% → 66% → 71%
- 几乎全是写:r/s≈0,w/s 46~92,wkB/s 3000~5000
- await 13~20ms
-
已排查系统盘空间、inode 都完全正常。mysql的库都在/home里
-
服务器是离线环境,没有安装iotop工具,若有网,可按照iotop排查
先装 iotop:
bash
yum install -y iotop
然后执行:
bash
iotop -oP
- 更通用的工具排查
bash
# 按IO排序看进程
ps aux --sort=-pcpu,-rss
# 看哪个目录在疯狂写
du -sh --exclude=/proc /home/* | sort -rh
或者
bash
# 实时看文件写入
lsof | grep -E 'REG|DIR' | grep -E '/home' | head -20
- 排查出可疑进程后
- 若存在非mysql的进程,比如python,可以看看这个 Python 脚本在干嘛,比如pid为455850
bash
pstree -p 455850
ll /proc/455850/cwd
ls -l /proc/455850/fd | grep mysql
- 看 MySQL 当前在跑什么 SQL
bash
show processlist;
或者
bash
SELECT * FROM information_schema.processlist WHERE Command != 'Sleep' ORDER BY Time DESC;