/proc/diskstats 是 Linux 系统中记录块设备(如磁盘、SSD、RAID、LVM 等)I/O 统计信息的虚拟文件。通过分析该文件,可以详细了解磁盘的读写操作、合并请求、I/O 时间等关键性能指标。以下是其字段解析及意义。
1. 文件格式
每行对应一个块设备,格式如下(字段数量可能因内核版本不同略有差异,以下以 Linux 5.10+ 为例):
1 | <主设备号> <次设备号> <设备名> <读操作次数> <合并读请求数> <读扇区数> <读耗时(ms)> <写操作次数> <合并写请求数> <写扇区数> <写耗时(ms)> <正在处理的I/O请求数> <I/O总耗时(ms)> <加权I/O总耗时(ms)> [其他字段...] |
1.1. 字段解析
1.1.1. 基础信息
- 字段1:主设备号 (Major)
设备的主设备号,标识设备类型(如 SCSI、IDE 等)。 - 字段2:次设备号 (Minor)
设备的次设备号,标识同一类型下的具体设备实例。 - 字段3:设备名 (Device)
块设备名称(如sda
,nvme0n1
等)。 - 示例数据
8 0 sda
1.1.2. 读操作统计
- 字段4:读操作次数 (Reads Completed)
成功完成的读请求总数(单位:次)。 - 字段5:合并读请求数 (Reads Merged)
合并的读请求数量(合并相邻的请求以提高效率)。 - 字段6:读扇区数 (Sectors Read)
读取的总扇区数(1 扇区 = 512 字节)。 - 字段7:读耗时 (Time Reading, ms)
所有读操作的总耗时(毫秒)。 - 示例数据
2054 513 253714 1007
1.1.3. 写操作统计
- 字段8:写操作次数 (Writes Completed)
成功完成的写请求总数(单位:次)。 - 字段9:合并写请求数 (Writes Merged) 合并的写请求数量。
- 字段10:写扇区数 (Sectors Written)
写入的总扇区数(1 扇区 = 512 字节)。 - 字段11:写耗时 (Time Writing, ms)
所有写操作的总耗时(毫秒)。 - 示例数据
0 0 0 0
1.1.4. 其他关键字段
- 字段12:正在处理的I/O请求数 (I/O in Progress)
当前正在处理的 I/O 请求数(瞬时值)。 - 字段13:I/O总耗时 (Time Spent on I/O, ms)
所有 I/O 操作(读 + 写)的总耗时。 - 字段14:加权I/O总耗时 (Weighted Time Spent on I/O, ms)
加权后的 I/O 总耗时(考虑并发和排队时间)。 - 字段15+(可选)
新版本内核可能包含其他操作(如discard
操作统计)。 - 示例数据
0 2030 1007
2. 完整示例数据
1 | cat /proc/diskstats |
3. 工具辅助分析
iostat
直接显示磁盘 I/O 统计(基于/proc/diskstats
):1
iostat -x 1 # 每秒刷新详细统计
%util
: 磁盘利用率(接近 100% 表示饱和)。r/s
,w/s
: 每秒读写次数。rkB/s
,wkB/s
: 读写吞吐量。
dstat
实时监控磁盘活动:1
dstat -d
atop
综合性能监控工具,包含磁盘 I/O 详情。
4. 常见问题排查
4.1. 磁盘饱和(高 %util
)
- 现象:
%util
接近 100%,响应时间(await
)升高。 - 可能原因:频繁 I/O 请求或磁盘性能瓶颈。
4.2. 高延迟(高 await
)
- 现象:
await
(平均 I/O 等待时间)显著增加。 - 可能原因:磁盘硬件问题或并发请求过多。
4.3. 频繁合并请求(高 merged
)
- 现象:
Reads Merged
或Writes Merged
值高。 - 可能原因:I/O 调度算法(如
deadline
或mq-deadline
)优化相邻请求。
4.4. 突增的 I/O 队列(高 I/O in Progress
)
- 现象:
I/O in Progress
持续大于 1(对机械硬盘可能异常)。 - 可能原因:突发大量请求或磁盘响应缓慢。
5. 总结
- 核心字段:读/写次数、扇区数、耗时、队列深度。
- 关键指标:IOPS、吞吐量、延迟、利用率。
- 工具推荐:
iostat
结合/proc/diskstats
是分析磁盘性能的黄金组合。
通过监控和分析 /proc/diskstats
,可以快速定位磁盘 I/O 瓶颈,优化系统性能。