Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

/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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
cat /proc/diskstats
1 0 ram0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 ram1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 2 ram2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 3 ram3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 4 ram4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 5 ram5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 6 ram6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 7 ram7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 8 ram8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 9 ram9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 10 ram10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 11 ram11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 12 ram12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 13 ram13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 14 ram14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 15 ram15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 0 loop0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 1 loop1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 2 loop2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 3 loop3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 4 loop4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 5 loop5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 6 loop6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 7 loop7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
8 0 sda 2054 513 253714 1007 0 0 0 0 0 2030 1007 0 0 0 0 0 0
8 16 sdb 102 0 4456 8 2 0 8 2 0 60 12 0 0 0 0 1 1
8 32 sdc 450720 136075 28303146 201119 790950 312463 145427344 9711095 0 1291390 10050195 266436 187117 23221483656 26374 101434 111606

3. 工具辅助分析

  1. iostat
    直接显示磁盘 I/O 统计(基于 /proc/diskstats):

    1
    iostat -x 1  # 每秒刷新详细统计
    • %util: 磁盘利用率(接近 100% 表示饱和)。
    • r/s, w/s: 每秒读写次数。
    • rkB/s, wkB/s: 读写吞吐量。
  2. dstat
    实时监控磁盘活动:

    1
    dstat -d
  3. atop
    综合性能监控工具,包含磁盘 I/O 详情。

4. 常见问题排查

4.1. 磁盘饱和(高 %util

  • 现象:%util 接近 100%,响应时间(await)升高。
  • 可能原因:频繁 I/O 请求或磁盘性能瓶颈。

4.2. 高延迟(高 await

  • 现象:await(平均 I/O 等待时间)显著增加。
  • 可能原因:磁盘硬件问题或并发请求过多。

4.3. 频繁合并请求(高 merged

  • 现象:Reads MergedWrites Merged 值高。
  • 可能原因:I/O 调度算法(如 deadlinemq-deadline)优化相邻请求。

4.4. 突增的 I/O 队列(高 I/O in Progress

  • 现象:I/O in Progress 持续大于 1(对机械硬盘可能异常)。
  • 可能原因:突发大量请求或磁盘响应缓慢。

5. 总结

  • 核心字段:读/写次数、扇区数、耗时、队列深度。
  • 关键指标:IOPS、吞吐量、延迟、利用率。
  • 工具推荐iostat 结合 /proc/diskstats 是分析磁盘性能的黄金组合。

通过监控和分析 /proc/diskstats,可以快速定位磁盘 I/O 瓶颈,优化系统性能。

推荐阅读
Linux系统监控数据 - /proc/stat Linux系统监控数据 - /proc/stat Linux系统监控数据 - /proc/net/dev Linux系统监控数据 - /proc/net/dev adb用法详解 adb用法详解

评论