Linux top 与 iotop 指标说明及 I/O 监控指南
前言
排查 Linux 服务器卡顿时,通常会先打开 top 看系统整体状态:负载高不高、CPU 是否打满、内存是否紧张、哪个进程最活跃。
如果 top 里 CPU 和内存都不算异常,但机器仍然响应很慢,就要进一步怀疑磁盘 I/O。iostat、nmon 这类工具偏向从磁盘或设备维度看读写情况;如果想定位具体是哪个进程在读写磁盘,就可以使用 iotop。
简单来说:
| 工具 | 适合回答的问题 |
|---|---|
top | 当前系统是否忙?忙在 CPU、内存还是进程状态? |
iotop | 哪个进程正在产生磁盘 I/O?读写速率是多少? |
一、先用 top 判断系统状态
top 的进程列表会展示每个进程的身份、调度、内存、CPU 等信息。字段很多,排查时可以按下面几类理解。
进程身份
| 指示符 | 含义 |
|---|---|
PID | 进程 ID |
USER | 进程所有者 |
COMMAND | 进程名称或命令行 |
这几个字段用来回答“这个进程是谁”。定位到异常进程后,通常会继续结合 ps -fp <PID>、业务日志或启动命令确认它属于哪个服务。
调度与状态
| 指示符 | 含义 |
|---|---|
PR | 进程调度优先级 |
NI | nice 值。负值表示优先级更高,正值表示优先级更低 |
S | 进程状态。常见值:D 不可中断睡眠,R 运行,S 睡眠,T 停止或被跟踪,Z 僵尸进程 |
重点关注 S 字段:
R多:说明有不少进程正在运行或等待 CPU。D多:常见于磁盘 I/O、网络文件系统等不可中断等待场景。Z出现:说明存在僵尸进程,需要检查父进程是否正常回收子进程。
内存相关
| 指示符 | 含义 |
|---|---|
VIRT | 进程使用的虚拟内存总量,通常包含代码、数据、共享库、映射文件以及已换出的内存等 |
RES | 进程当前占用的、未被换出的物理内存大小 |
SHR | 可能与其他进程共享的内存大小 |
%MEM | 进程使用的物理内存占系统总物理内存的百分比 |
注意:
VIRT和RES不适合简单理解为“真实占用内存”。排查内存问题时,通常需要结合%MEM、RES、进程类型以及/proc、pmap等信息一起判断。
CPU 相关
| 指示符 | 含义 |
|---|---|
%CPU | 从上次刷新到当前刷新间隔内,该进程占用的 CPU 百分比 |
TIME+ | 进程累计使用的 CPU 时间,精度通常到 1/100 秒 |
%CPU 适合看当前谁最忙,TIME+ 适合看进程从启动到现在累计消耗了多少 CPU 时间。如果某个进程 %CPU 长时间居高不下,就要结合线程、日志或性能分析工具继续定位。
二、再用 iotop 定位磁盘 I/O
当 top 中出现较多 D 状态进程,或者系统负载高但 CPU 并不高时,可以进一步使用 iotop 看磁盘 I/O 来源。
安装 iotop
CentOS / RHEL:
yum install iotop -y
Fedora / CentOS Stream / RHEL 8+:
dnf install iotop -y
Ubuntu / Debian:
apt install iotop -y
提示:
iotop通常需要 root 权限才能读取完整的进程 I/O 信息。
三、iotop 常用场景
场景 1:只看正在产生 I/O 的进程
iotop -o
-o 会过滤掉当前没有实际 I/O 的进程,排查磁盘读写抖动时非常常用。
场景 2:按进程维度聚合
iotop -P
默认情况下,iotop 可能按线程展示;加上 -P 后只显示进程,更适合快速定位业务进程。
场景 3:采样并保留现场
iotop -b -n 5 -d 1
含义:
| 参数 | 含义 |
|---|---|
-b | batch 模式,适合脚本或日志采集 |
-n 5 | 输出 5 次后退出 |
-d 1 | 每 1 秒刷新一次 |
四、iotop 参数速查
| 短参数 | 长参数 | 含义 |
|---|---|---|
| 无 | --version | 显示版本号 |
-h | --help | 显示帮助信息 |
-o | --only | 只显示正在产生 I/O 的进程或线程,交互模式下可按 o 切换 |
-b | --batch | 以非交互模式运行 |
-n NUM | --iter=NUM | 在非交互模式下设置显示次数 |
-d SEC | --delay=SEC | 设置刷新间隔秒数,支持小数 |
-p PID | --pid=PID | 只显示指定 PID 的信息 |
-u USER | --user=USER | 只显示指定用户的进程信息 |
-P | --processes | 只显示进程,不按线程展开 |
-a | --accumulated | 显示从 iotop 启动以来每个进程或线程累计完成的 I/O 总量 |
-k | --kilobytes | 以 KB 为单位显示数值 |
-t | --time | 在每一行前添加当前时间 |
五、推荐排查流程
遇到“服务器变慢、命令卡顿、服务响应抖动”这类问题时,可以按下面的顺序走:
- 先用
top查看系统整体负载,以及是否存在明显 CPU 或内存异常。 - 观察
top里的进程状态。如果D状态较多,优先怀疑 I/O 等待。 - 使用
iotop -o观察正在产生 I/O 的进程。 - 如果输出过多,使用
iotop -P聚合到进程维度。 - 如果问题是间歇性出现,使用
iotop -b -n 10 -d 1采样并保存输出。 - 定位进程后,再结合业务日志、进程启动参数和磁盘使用情况继续分析。
日常排查中,top 适合看系统和进程总体状态,iotop 则适合追踪磁盘 I/O 来源。两者配合使用,可以更快判断问题到底来自 CPU、内存还是磁盘读写。