IO 高为什么让整机变慢
磁盘是相对慢的部件,当读写请求排队时,等待时间会快速上升,表现为处理器不忙但业务响应缓慢:日志写入阻塞、数据库提交变慢、页面加载等待。排查的核心不是看磁盘使用率的高低,而是看等待时间与队列长度是否长期处于高位。
先分层再定责
第一层看磁盘指标,确认是随机读、顺序写还是两者都在等待;第二层按进程统计,找出真正产生读写量的程序;第三层结合业务判断,是高峰写入、日志刷盘、批量任务还是介质劣化。分层之后结论才站得住,也便于和业务方沟通。
基本信息
| 磁盘层指标 | 利用率、平均等待、每秒读写次数与吞吐 |
|---|---|
| 进程层指标 | 按进程聚合的读写量与 IO 等待占比 |
| 常见来源 | 日志刷盘、批量任务、数据库刷脏页 |
| 排除项 | 先确认磁盘空间是否正常 |
典型使用场景
- 业务反馈变慢但处理器使用率不高
- 数据库提交延迟升高,需要确认是否存储瓶颈
- 批量任务运行时在线业务受影响,需要错峰
- 磁盘健康告警后性能下降,需要评估是否更换
- 容量规划时评估存储能否支撑预期写入量
磁盘层
磁盘层
iostat -x 1 5 # 利用率、平均等待与队列
df -h # 先排除空间不足带来的异常
smartctl -H /dev/sda 2>/dev/null || true # 顺带查看介质健康
lsblk -o NAME,SIZE,ROTA,MOUNTPOINT # 区分机械盘与固态盘
dmesg -T | grep -iE 'I/O error' | tail -5 # 排除底层报错进程层
进程层
iotop -oPa 2>/dev/null || echo '未安装 iotop'
pidstat -d 1 5 2>/dev/null # 按进程查看读写
# 定位后核对三件事:
# 1) 日志级别与刷盘策略是否合理
# 2) 批量任务时间窗是否与业务高峰重叠
# 3) 缓存与预读参数是否需要调整指标与判断
| 指标 | 含义 | 判断 |
|---|---|---|
| 利用率长期高位 | 设备几乎无空闲 | 结合等待时间判断是否真瓶颈 |
| 平均等待上升 | 请求排队明显 | 定位到具体进程与业务 |
| 写入量突增 | 批量任务或日志刷盘 | 错峰或调整刷盘策略 |
| 读写比例变化 | 业务模式变化 | 核对新上线功能 |
| 伴随底层报错 | 介质或链路异常 | 按磁盘告警流程处理 |
整体盘阵列与固态盘的性能特征差异明显,单看某一块盘的绝对值容易误判;在阵列或分布式存储上做结论时,要结合整体指标判断。