在Linux系统中,尤其是Ubuntu操作系统,了解磁盘I/O性能对于系统管理员和开发者至关重要。本文将带你从零开始,深入浅出地讲解 /proc/diskstats 文件的作用、结构以及如何利用它进行Ubuntu磁盘性能监控和系统性能分析。
什么是 /proc/diskstats?
/proc/diskstats 是Linux内核提供的一个虚拟文件,位于 /proc
文件系统中。它实时记录了系统中每个块设备(如硬盘、SSD、分区等)的I/O统计信息。这些数据由内核自动收集,无需额外工具即可读取,是进行Linux磁盘统计的重要来源。

/proc/diskstats 的字段含义
执行以下命令可以查看当前系统的磁盘统计信息:
cat /proc/diskstats
输出通常如下所示(以sda为例):
8 0 sda 12345 100 200000 5000 6789 200 150000 3000 0 4000 8000
每行包含14个字段(较新内核版本),具体含义如下:
主设备号(major):设备的主设备号,如8代表SCSI/SATA设备。 次设备号(minor):设备的次设备号。 设备名称(device name):如 sda、sdb、nvme0n1 等。 读完成次数(reads completed successfully):成功完成的读操作次数。 合并读操作次数(reads merged):被合并的读请求数(提高效率)。 读扇区数(sectors read):总共读取的扇区数(每个扇区通常512字节)。 读耗时(ms spent reading):读操作花费的总时间(毫秒)。 写完成次数(writes completed):成功完成的写操作次数。 合并写操作次数(writes merged):被合并的写请求数。 写扇区数(sectors written):总共写入的扇区数。 写耗时(ms spent writing):写操作花费的总时间(毫秒)。 正在进行的I/O数(I/Os currently in progress):当前正在处理的I/O请求数。 I/O总耗时(ms spent doing I/Os):所有I/O操作累计耗时(毫秒)。 加权I/O耗时(weighted ms spent doing I/Os):考虑队列深度的加权时间,用于计算I/O延迟。实战:用脚本监控磁盘I/O
我们可以编写一个简单的Bash脚本来实时监控某个磁盘的读写速度。以下是一个示例脚本:
#!/bin/bashDEVICE="sda"INTERVAL=1while true; do # 读取两次数据,间隔1秒 LINE1=$(grep "$DEVICE " /proc/diskstats) sleep $INTERVAL LINE2=$(grep "$DEVICE " /proc/diskstats) # 提取第6列(读扇区数)和第10列(写扇区数) READ1=$(echo $LINE1 | awk '{print $6}') WRITE1=$(echo $LINE1 | awk '{print $10}') READ2=$(echo $LINE2 | awk '{print $6}') WRITE2=$(echo $LINE2 | awk '{print $10}') # 计算每秒读写字节数(扇区 * 512 / 秒) READ_BYTES=$(( (READ2 - READ1) * 512 / INTERVAL )) WRITE_BYTES=$(( (WRITE2 - WRITE1) * 512 / INTERVAL )) echo "$(date): Read: $READ_BYTES B/s, Write: $WRITE_BYTES B/s"done保存为
diskmon.sh,赋予执行权限后运行:
chmod +x diskmon.sh./diskmon.sh
与其他工具对比
虽然
iostat、
iotop等工具更直观,但它们底层也依赖
/proc/diskstats。直接读取该文件的优势在于: 无需安装额外软件包(轻量级) 可集成到自定义监控脚本中 适用于资源受限的嵌入式或容器环境
总结
/proc/diskstats是进行 Ubuntu磁盘性能监控 和 系统性能分析 的基础数据源。通过理解其字段含义并结合简单脚本,你可以轻松掌握磁盘I/O动态。无论是排查性能瓶颈,还是构建自动化监控系统,这项技能都不可或缺。
希望这篇教程能帮助你掌握 Linux磁盘统计 的核心方法。如果你有任何问题,欢迎在评论区留言交流!
