Linux 系统 I/O 监控命令大全
| 命令 | 主要功能 | 监控维度 | 实时性 | 优势 | 劣势 |
|---|---|---|---|---|---|
iostat |
磁盘I/O性能统计 | 块设备级 (如sda) | 周期性快照 | 提供详细的设备级性能指标(await, %util等) | 看不到具体的进程 |
iotop |
进程I/O监控 | 进程级 | 实时 | 直观显示哪个进程读写磁盘最频繁 | 需要root权限,看不到设备级详细指标 |
vmstat |
系统资源综合报告 | 系统级 (bi/bo) | 周期性快照 | 快速查看系统整体I/O压力 | I/O信息较为粗略,只有块计数 |
dstat |
多功能资源监控 | 系统级/设备级 | 实时 | 功能强大,输出颜色丰富易读 | 信息不如专用工具深入 |
ioping |
磁盘I/O延迟测试 | 设备/文件级 | 一次性/周期性 | 专门测试磁盘响应速度,非常精准 | 不提供吞吐量或进程信息 |
lsof |
列出打开文件 | 文件/进程级 | 瞬时快照 | 排查具体文件被谁占用或访问 | 不提供性能数据(速率、延迟) |
pidstat |
进程资源统计 | 进程级 | 周期性快照 | 可记录历史数据,适合长时间监控 | 实时性不如iotop |
/proc |
内核数据接口 | 所有维度 | 瞬时快照 | 最底层的数据源,信息最全面 | 原始数据,需要自行解析,不友好 |
命令详解、示例与输出解析
1. iostat (来自 sysstat 包)
功能 :提供系统级和块设备级的 CPU 和 I/O 性能统计。
安装 :sudo apt install sysstat 或 sudo yum install sysstat
命令示例:
每隔2秒报告一次扩展统计信息(共3次),以MB/s为单位
iostat -x -m 2 3
样例输出与解析:
sh
Linux 5.15.0-86-generic (ubuntu-server) 12/30/2025 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
4.21 0.01 1.35 0.21 0.00 94.22 # <- CPU统计。`%iowait`是关键,表示CPU等待I/O的时间百分比。
Device r/s w/s rMB/s wMB/s await aqu-sz %util
sda 3.52 20.66 0.04 0.16 5.85 0.14 2.42 # <- 设备sda的详细指标
nvme0n1 0.00 0.00 0.00 0.00 0.00 0.00 0.00
r/s,w/s:每秒读/写请求次数(IOPS)。rMB/s,wMB/s:每秒读/写的数据量(吞吐量)。await:平均每次I/O请求的等待时间(ms),衡量磁盘响应速度。%util:设备带宽利用率百分比,最直接的磁盘繁忙度指标,接近100%表示饱和。
2. iotop
功能 :类似 top,但实时监控每个进程的磁盘I/O使用情况。
安装 :sudo apt install iotop 或 sudo yum install iotop
命令示例:
以root权限运行,只显示正在产生I/O的进程,单位KB/s
sudo iotop -o -P -k
样例输出与解析:
sh
Total DISK READ: 0.00 K/s | Total DISK WRITE: 28.65 K/s # <- 系统总计I/O
Current DISK READ: 0.00 K/s | Current DISK WRITE: 28.65 K/s
PRIO USER PID DISK READ DISK WRITE SWAPIN IO> COMMAND
be/4 root 123 0.00 K/s 28.65 K/s 0.00 % 0.21 % [jbd2/sda1-8] # <- 进程级I/O详情
be/4 mysql 456 0.00 K/s 5.21 K/s 0.00 % 0.05 % mysqld
DISK READ,DISK WRITE:该进程的实时读写速率,直接定位高I/O进程。IO>:该进程I/O操作占用的CPU时间百分比。
3. vmstat
功能:报告进程、内存、分页、块I/O、中断和CPU活动的综合信息。
命令示例:
每隔1秒报告一次,共报告5次
vmstat 1 5
样例输出与解析:
sh
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 2468124 150432 3123456 0 0 5 23 101 156 4 1 95 0 0
bi(Blocks in):每秒从块设备读取的块数。bi * block size≈ 读速率。bo(Blocks out):每秒向块设备写入的块数。bo * block size≈ 写速率。wa(CPU wait):CPU等待I/O的时间百分比,与iostat的%iowait同义。
4. dstat
功能 :多功能替代工具,可同时查看CPU、磁盘、网络、内存等资源。
安装 :sudo apt install dstat 或 sudo yum install dstat
命令示例:
查看CPU、磁盘吞吐、负载、磁盘利用率和IOPS,每秒更新
dstat -cdl --disk-util --disk-tps 1
样例输出与解析:
sh
--total-cpu-usage-- -dsk/total- --load-avg- ---disk-util--- ---disk-tps---
usr sys idl wai stl| read writ| 1m 5m 15m| sda nvme0n1| sda nvme0n1
4 2 94 0 0| 12k 65k| 0.1 0.2 0.3| 2.1 0.0 | 15 0
dsk/total:系统总计读写流量。disk-util:按设备显示的利用率(%)。disk-tps:按设备显示的IOPS。
5. ioping
功能 :像网络ping一样测试磁盘的I/O延迟。
安装 :sudo apt install ioping 或 sudo yum install ioping
命令示例:
向设备/dev/sda1发送10次4KiB请求,测试其延迟
sudo ioping -c 10 /dev/sda1
样例输出与解析:
sh
4 KiB from /dev/sda1 (dev: 8,1): request=1 time=1.20 ms # <- 每次请求的延迟
...
--- /dev/sda1 (dev: 8,1) ioping statistics ---
10 requests completed in 9.10 ms, 40 KiB read, 1.10 k iops, 4.29 MiB/s
min/avg/max/mdev = 0.94 ms / 0.91 ms / 1.20 ms / 0.08 ms # <- 延迟统计数据
min/avg/max/mdev:最小/平均/最大/标准偏差延迟,是衡量磁盘响应速度的核心指标(SSD<1ms,HDD数ms)。
6. lsof
功能:列出当前系统打开的文件列表,用于排查文件占用。
命令示例:
查看谁正在使用/var/log/syslog文件
sudo lsof /var/log/syslog
样例输出与解析:
sh
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 789 syslog 1w REG 8,1 1234567 1234 /var/log/syslog # <- 以写模式打开
tail 901 root 4r REG 8,1 98765 1234 /var/log/syslog # <- 以读模式打开
- 输出表明 :
rsyslogd进程正在写入(w)该文件,tail命令正在读取(r)它。用于解决"文件被占用"问题。
7. pidstat (来自 sysstat 包)
功能:监控单个进程或任务的资源统计,包括I/O。
命令示例:
监控PID为456的进程的I/O情况,每2秒一次,共5次
pidstat -d -p 456 2 5
样例输出与解析:
sh
03:15:00 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
03:15:02 PM 112 456 0.00 512.66 0.00 123 mysqld
kB_rd/s,kB_wr/s:进程每秒读/写的数据量(KB)。iodelay:I/O延迟,进程等待I/O的时钟滴答数,值越大表示该进程受I/O阻塞越严重。
8. /proc 文件系统
功能:提供内核数据的接口,是许多监控工具的数据来源。
命令示例:
查看内核提供的原始磁盘统计信息
cat /proc/diskstats
查看PID为1的进程的I/O计数器
cat /proc/1/io
样例输出与解析:
sh
8 0 sda 123 456 7890 123 456 7890 0 0 0 321 456 # <- 原始设备数据,各列含义需查手册
rchar: 1234567
wchar: 987654
read_bytes: 4096000
write_bytes: 2048000
/proc/diskstats:iostat的数据源,需解析,不直观。/proc/[pid]/io:显示进程生命周期内累积的I/O字节数,非常详细但非实时速率。
总结:
- 快速定位高I/O进程 :
sudo iotop -o - 深入分析磁盘性能瓶颈 :
iostat -x 1(看%util,await) - 综合系统负载视图 :
dstat -cdl或vmstat 1 - 测试磁盘延迟(性能基准) :
sudo ioping -c 10 /dev/sda1 - 解决"文件已打开"错误 :
sudo lsof /path/to/file - 监控特定进程的I/O历史 :
pidstat -d -p <PID> 1 - 获取最底层原始数据 :查阅
/proc/diskstats和/proc/<pid>/io