磁盘 IO 是系统性能排障里的高频问题。无论您是在管理数据库、Web 应用程序还是云服务器,系统读取和写入数据的效率都会影响响应时间、吞吐和稳定性。
本文介绍 5 个 Linux 下常用的硬盘 IO 查看工具:iostat、iotop、vmstat、dstat 和 sar。它们关注的层面不同,有的适合看磁盘设备,有的适合找进程,有的适合回看历史。
先理解 Linux 磁盘 IO
磁盘 IO 是指 RAM 和存储设备(HDD、SSD 或网络存储)之间的读写操作。当应用程序请求数据时,系统要么从内存中读取(速度快),要么从磁盘中读取(速度慢)。多个进程争夺磁盘访问时,就可能出现 IO 争用和性能下降。
排查磁盘 IO 时,先不要急着换磁盘或扩容。更有效的顺序是:
- 判断是不是 IO 瓶颈。
- 判断瓶颈发生在哪块磁盘或哪个设备。
- 找出产生 IO 的进程或 workload。
- 区分读压力、写压力、队列等待和设备利用率。
- 如果是历史问题,再回看故障时间窗口的数据。
IO 要监控的关键指标
Throughput:数据传输速度,常见单位是 MB/s、GB/s。IOPS:每秒发生的磁盘读写次数。Latency:读写操作完成所需的时间,常见单位是 ms。Disk Utilization:磁盘主动处理请求的时间百分比。
有趣的事实:在 AWS 中,您获得的 IOPS 与磁盘的大小有关。
这些指标要放在一起看。比如 %util 很高不一定表示磁盘已经饱和,尤其是能并发处理 IO 的设备;await 高、队列增长、应用响应变慢一起出现时,才更像真实瓶颈。
五个工具怎么选
| 工具 | 主要用途 | 最适合回答的问题 |
|---|---|---|
iostat |
查看块设备吞吐、延迟、利用率 | 哪块磁盘慢?读写延迟是多少? |
iotop |
按进程查看实时 IO | 哪个进程正在大量读写? |
vmstat |
系统整体 CPU、内存、IO 快照 | 系统是否在等 IO?是否有大量阻塞进程? |
dstat |
组合查看 CPU、磁盘、网络等实时指标 | 想在一个界面里看多类资源趋势 |
sar |
历史性能数据 | 故障已经过去,如何回看当时的 IO? |
1. iostat:查看磁盘设备性能概况
iostat 是跟踪磁盘 IO 性能的最有效方法之一。默认情况下,大多数 Linux 发行版不包含 iostat,可以通过 sysstat 安装:
sudo apt install sysstat # Debian/Ubuntu
sudo yum install sysstat # RHEL/CentOS
sudo dnf install sysstat # Fedora
基本用法:
iostat -x 1
-x:提供扩展统计信息,包括利用率和队列深度。1:每秒更新一次统计信息。
[root@iZ2ze4oi71k3qgdxwsyn07Z ~]# iostat -x 1
Linux 4.18.0-193.28.1.el8_2.x86_64 (iZ2ze4oi71k3qgdxwsyn07Z) 02/19/2025 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
1.54 0.00 1.34 0.27 0.00 96.84
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
vda 1.24 106.23 43.79 1717.17 0.00 0.34 0.06 0.32 11.21 0.59 0.03 35.21 16.16 0.48 5.17
vdb 0.07 7.68 2.52 88.60 0.00 8.43 0.15 52.33 2.71 0.43 0.00 34.51 11.54 0.44 0.34
avg-cpu: %user %nice %system %iowait %steal %idle
1.76 0.00 2.02 0.25 0.00 95.97
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
vda 9.00 136.00 136.00 2091.00 0.00 7.00 0.00 4.90 0.67 0.91 0.06 15.11 15.38 0.41 6.00
vdb 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 0.00 0.00
输出中的关键指标:
r/s, w/s:每秒发生的读/写次数。rkB/s, wkB/s:每秒读/写的数据量。r_await, w_await:每个 I/O 请求的平均等待时间,单位是毫秒,包括请求在队列中的等待时间和实际处理时间。%util:磁盘繁忙的时间百分比。如果这持续高于 80-90%,磁盘可能是瓶颈。当然,即便已经 100%,也不一定饱和,尤其是对于并发处理 IO 的硬盘,需要结合await等其他指标判断。
问:有时看到 %util 很高但是 r/s、w/s 很低,这是为什么?
答:通常是因为单个请求较大。IO 次数不高,但每次请求处理时间长,设备仍然可能长时间处于忙碌状态。
2. iotop:按进程查看 IO
iotop 是一种实时磁盘监控工具,工作方式与 top 类似,但专门用于跟踪进程的磁盘读写活动。它能帮助您确定哪些应用程序或服务产生的 IO 负载最多。
安装:
sudo apt install iotop # Debian/Ubuntu
sudo yum install iotop # RHEL/CentOS
执行 iotop 命令即可看到实时的磁盘 IO 活动:
[root@iZ2ze4oi71k3qgdxwsyn07Z ~]# iotop

DISK READ/DISK WRITE:显示每个进程每秒读取和写入的数据量。SWAPIN %:指示进程是否正在使用交换空间,值越低越好。IO>:进程等待 IO 的时间百分比,较高表示进程受磁盘限制。COMMAND:显示使用磁盘资源的具体进程。
高 IO> 值(高于 80%)意味着进程受 IO 限制。这个应用程序会花大量时间等待磁盘读写,不仅自身变慢,也可能拖慢同一磁盘上的其他应用。
3. vmstat:查看系统范围的性能指标
vmstat 是一种多功能工具,用于监控整体系统性能,包括磁盘 IO、CPU、内存和进程。它不像 iotop 那样提供每个进程的详细信息,但可以快速判断系统是否整体受 IO 影响。
输入 vmstat 1 命令即可运行:
[root@iZ2ze4oi71k3qgdxwsyn07Z ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 145752 286128 3068024 0 0 12 455 1 0 2 1 97 0 0
1 0 0 145480 286128 3068048 0 0 0 1379 7568 14441 1 1 98 0 0
1 0 0 145452 286152 3068096 0 0 0 1833 7236 13618 1 2 97 1 0
1 0 0 145284 286124 3067744 0 0 0 3138 7555 14623 2 2 96 1 0
0 0 0 146536 286124 3067780 0 0 0 2119 7213 14066 1 1 97 0 0
0 0 0 146428 286148 3067852 0 0 0 2448 7525 15049 2 2 96 0 0
关键列含义:
r和b:运行队列进程数,以及阻塞进程数。阻塞通常和等待 IO 有关。bi和bo:读写 block 的数量。wa:等待 IO 的 CPU 时间百分比。高wa值(例如高于 20%)表明系统受 IO 限制。id:空闲 CPU 时间百分比。如果id较低且wa较高,说明主机上的应用正在等待磁盘,而不是执行大量计算。
症状与可能原因:
高 b:阻塞进程太多,可能是硬盘 IO 争用。高 bo 但是低 bi:写入密集型工作负载,可能来自日志或备份。高 wa:磁盘 IO 瓶颈,存储设备可能太慢或过载。高 bi 低 bo:读取密集型工作负载,常见于数据库查询或文件访问。
4. dstat:可定制的性能监控
dstat 是一个灵活的工具,结合了 iostat、vmstat 和 netstat 的部分能力。它以易于阅读的格式提供磁盘 IO、网络、CPU、内存等实时统计数据。
安装:
sudo apt install dstat # Debian/Ubuntu
sudo yum install dstat # RHEL/CentOS
基本用法:
dstat

使用 dstat 分析磁盘 IO 指标:
dstat -d --disk-util --disk-tps

read/write:读写吞吐。util:硬盘 IO 利用率。#read #write:每秒读写次数。
当你想同时观察 CPU、磁盘、网络之间的关系时,dstat 比单独使用多个命令更方便。
5. sar:查看历史磁盘 IO
sar(System Activity Reporter)适合捕获和分析历史性能数据。当您需要诊断过去某个时间窗口内发生的磁盘 IO 问题时,sar 比前面几个实时工具更合适。
需要注意,sar 依赖 sysstat 服务持续采集数据,而不只是一个临时命令。
安装:
sudo apt install sysstat # Debian/Ubuntu
sudo yum install sysstat # RHEL/CentOS
启动 sysstat 服务:
sudo systemctl enable --now sysstat
默认情况下,sar 每 10 分钟收集一次系统指标并将其存储在 /var/log/sysstat/。可以在配置文件 /etc/sysstat/sysstat 中更改频率。
查看当前磁盘 IO 指标:
sar -d 1 5

-d:显示磁盘 IO 统计信息。1:每秒更新一次统计信息。5:显示 5 次更新。
各列含义:
tps:每秒事务数。rd_sec/s & wr_sec/s:每秒读写的扇区。await:平均 I/O 请求等待时间,单位是毫秒。%util:磁盘 IO 利用率。
一个实用排查顺序
遇到“系统慢,怀疑磁盘 IO”的问题,可以按这个顺序查:
- 用
vmstat 1看wa和b,判断系统是否整体在等 IO。 - 用
iostat -x 1看具体磁盘的await、aqu-sz、%util、吞吐和 IOPS。 - 用
iotop找产生 IO 的进程。 - 用
dstat同时观察 CPU、磁盘和网络,确认是否存在资源联动。 - 如果问题已经过去,用
sar -d回看历史窗口。
FAQ
Q1:%util 到 100% 就一定是磁盘瓶颈吗?
不一定。需要结合 await、队列长度、吞吐、IOPS 和应用延迟一起判断。对支持并发 IO 的设备,%util 高并不总等于饱和。
Q2:想找哪个进程在写磁盘,用哪个工具?
优先用 iotop。它能按进程展示实时读写量和等待 IO 的比例。
Q3:故障过去了,还能查磁盘 IO 吗?
如果提前启用了 sysstat,可以用 sar 回看历史数据;如果没有采集历史数据,就只能依赖其他监控系统或日志。
总结
磁盘 IO 是系统性能的关键组成部分。iostat 适合看设备,iotop 适合找进程,vmstat 适合判断系统整体是否受 IO 影响,dstat 适合多资源联动观察,sar 适合回看历史。排查时不要只盯一个指标,应该把吞吐、IOPS、延迟、利用率和应用表现放在一起看。