Linux IO 过高怎么定位?iostat 和 iotop 使用详解
Linux IO 过高怎么定位?iostat 和 iotop 使用详解
1. 前言
Linux 服务器变慢时,不一定是 CPU 不够。
很多时候真正的瓶颈是磁盘 IO。
常见现象:
- CPU 使用率不高,但系统很卡;
- Load Average 很高;
- 接口响应慢;
- 数据库查询慢;
- 日志写入慢;
- iowait 很高;
- 磁盘读写延迟高。
排查 IO 问题常用工具:
iostat
iotop
vmstat
pidstat
dstat
本文重点讲解 iostat 和 iotop。
2. 什么是 IO
IO 指输入输出。
在服务器排查中,通常指磁盘读写。
例如:
- MySQL 读写数据文件;
- 日志写入磁盘;
- 程序读取大文件;
- Docker 写 overlay;
- 备份压缩文件;
- 大量小文件读写。
磁盘 IO 慢会拖慢整个系统。
3. 安装工具
iostat 来自 sysstat:
Ubuntu / Debian:
sudo apt install sysstat -y
CentOS / RHEL:
sudo yum install sysstat -y
iotop 安装:
sudo apt install iotop -y
或:
sudo yum install iotop -y
4. top 中先看 iowait
执行:
top
看 CPU 行:
%Cpu(s): 10.0 us, 5.0 sy, 80.0 id, 5.0 wa
其中:
wa
表示 iowait,也就是 CPU 等待 IO 的时间比例。
如果 wa 长期很高,说明系统可能卡在磁盘 IO 上。
5. iostat 基本用法
查看磁盘 IO:
iostat
更常用:
iostat -x 1
参数说明:
| 参数 | 作用 |
|---|---|
-x |
显示扩展指标 |
1 |
每 1 秒输出一次 |
示例字段:
Device r/s w/s rkB/s wkB/s await %util
sda 10 100 1024 20480 30.5 95.0
6. iostat 关键字段
| 字段 | 含义 |
|---|---|
r/s |
每秒读请求数 |
w/s |
每秒写请求数 |
rkB/s |
每秒读 KB |
wkB/s |
每秒写 KB |
await |
IO 平均等待时间,毫秒 |
r_await |
读等待时间 |
w_await |
写等待时间 |
%util |
设备繁忙程度 |
重点关注:
await
%util
rkB/s
wkB/s
7. 如何判断磁盘忙
一般判断:
| 指标 | 说明 |
|---|---|
%util 接近 100% |
磁盘长期很忙 |
await 很高 |
IO 延迟较大 |
w/s 很高 |
大量写请求 |
r/s 很高 |
大量读请求 |
wa 高 |
CPU 等 IO |
注意:
%util接近 100% 不一定绝对代表性能瓶颈,但如果同时 await 很高,基本要重点关注。
8. iotop 查看哪个进程在读写
iostat 能告诉你哪块磁盘忙。iotop 能告诉你哪个进程在读写。
执行:
sudo iotop
只看正在进行 IO 的进程:
sudo iotop -o
常用字段:
| 字段 | 含义 |
|---|---|
TID |
线程 ID |
PRIO |
IO 优先级 |
USER |
用户 |
DISK READ |
读速度 |
DISK WRITE |
写速度 |
SWAPIN |
换入 |
IO> |
IO 等待比例 |
COMMAND |
命令 |
如果看到某个进程写入特别高,就要进一步看它在写什么。
9. pidstat 查看进程 IO
也可以用:
pidstat -d 1
查看指定进程:
pidstat -d -p PID 1
字段:
| 字段 | 含义 |
|---|---|
kB_rd/s |
每秒读取 KB |
kB_wr/s |
每秒写入 KB |
kB_ccwr/s |
取消写入 KB |
Command |
命令 |
10. 找进程打开了哪些文件
如果知道 PID,可以用:
sudo lsof -p PID
只看普通文件:
sudo lsof -p PID | grep REG
查看某个目录是否被频繁写:
sudo lsof +D /var/log
+D 在大目录下可能比较慢,线上谨慎使用。
11. 常见 IO 高场景
11.1 日志写入过多
表现:
- iotop 中应用进程写入高;
/var/log或应用日志目录增长快。
排查:
du -sh /var/log/*
tail -f app.log
处理:
- 降低日志级别;
- 配置日志切割;
- 避免循环打印错误日志。
11.2 数据库 IO 高
MySQL、PostgreSQL 经常是 IO 大户。
排查:
iotop -o
iostat -x 1
结合数据库慢查询日志。
处理方向:
- 优化索引;
- 优化 SQL;
- 增加缓存;
- 调整 buffer pool;
- 使用更快磁盘;
- 分库分表或归档历史数据。
11.3 备份任务导致 IO 高
例如:
tar
rsync
mysqldump
这些任务可能占用大量读写。
查看:
ps aux | grep -E "tar|rsync|mysqldump"
iotop -o
可以调整备份时间到低峰期。
11.4 Swap 导致 IO 高
内存不足时频繁使用 Swap,也会导致磁盘 IO 高。
查看:
free -h
vmstat 1
如果 si、so 持续不为 0,说明 Swap 活跃。
12. IO 排查流程
top
iostat -x 1
iotop -o
pidstat -d 1
lsof -p PID
du -sh 相关目录
流程:
top 看 wa 是否高
↓
iostat 看哪块磁盘忙
↓
iotop 找哪个进程读写
↓
pidstat 看进程 IO 趋势
↓
lsof 看进程打开文件
↓
结合业务日志定位原因
13. 小结
IO 排查核心命令:
top
iostat -x 1
sudo iotop -o
pidstat -d 1
sudo lsof -p PID
关键指标:
wa:CPU 等 IO
await:IO 等待时间
%util:磁盘繁忙程度
DISK READ/WRITE:进程读写速度
IO 高的问题,最终往往落在:
日志过多
数据库慢查询
备份任务
大文件读写
Swap 活跃
磁盘性能不足
排查时要先判断是哪个磁盘忙,再定位到哪个进程,最后结合业务判断为什么读写这么多。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)