Linux如何查看硬盘的读写性能?全面指南

在Linux系统中,硬盘(包括机械硬盘HDD和固态硬盘SSD)的读写性能直接影响系统整体响应速度、应用程序运行效率乃至服务稳定性。无论是日常使用、服务器运维还是性能优化,准确掌握硬盘的I/O表现都是关键。例如,数据库服务器的随机读写延迟过高可能导致查询超时,文件服务器的吞吐量不足会限制数据传输速度,而普通用户则可能因硬盘性能瓶颈感受到系统卡顿。

本文将系统介绍Linux下查看硬盘读写性能的常用工具、使用方法、指标解读及最佳实践,帮助读者从基础到进阶全面掌握硬盘性能分析技能。

目录#

  1. 基础工具:快速评估硬盘性能
  2. 系统级监控工具:实时与历史I/O统计
  3. 进阶工具:模拟负载与深度性能测试
  4. 性能指标解读与最佳实践
  5. 总结
  6. 参考资料

1. 基础工具:快速评估硬盘性能#

1.1 dd:简单粗暴的读写测试#

dd 是Linux系统自带的文件复制工具,通过简单配置可快速测试硬盘的顺序读写性能。其原理是生成指定大小的文件并测量操作时间,间接反映硬盘速度。

适用场景:#

  • 快速验证硬盘顺序读写能力(非精确,但足够简单)。
  • 临时测试新挂载的硬盘或分区。

安装:#

dd 是核心工具,无需额外安装。

示例:测试顺序写入性能#

# 创建一个1GB的临时文件,测试写入速度
dd if=/dev/zero of=/tmp/test bs=1G count=1 oflag=direct
  • 参数说明
    • if=/dev/zero:输入源为“零设备”,持续生成空数据。
    • of=/tmp/test:输出文件路径(需确保所在分区有足够空间)。
    • bs=1G:块大小为1GB(可根据需求调整,如bs=4K模拟小文件写入)。
    • count=1:仅写入1个块(总大小=bs×count=1GB)。
    • oflag=direct:绕过系统缓存,直接写入硬盘(避免缓存干扰测试结果)。

输出解读:#

1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 8.23456 s, 130 MB/s
  • 130 MB/s 即为本次测试的顺序写入速度。

示例:测试顺序读取性能#

# 读取刚才创建的文件,测试读取速度
dd if=/tmp/test of=/dev/null bs=1G count=1 iflag=direct
  • iflag=direct:绕过缓存直接读取硬盘数据。

注意事项:#

  • dd 仅适用于顺序读写测试,无法模拟随机I/O场景(如数据库 workload)。
  • 测试后需手动删除临时文件:rm /tmp/test
  • 块大小(bs)会影响结果:大文件传输(如视频)适合bs=1G,小文件(如日志)适合bs=4K

1.2 hdparm:专注磁盘读取性能#

hdparm 是Linux下用于查询和调整IDE/SATA硬盘参数的工具,其 -t 选项可直接测试磁盘的无缓存顺序读取速度,准确性高于 dd

适用场景:#

  • 快速评估物理磁盘(而非分区)的读取性能上限。

安装:#

  • Ubuntu/Debian:sudo apt install hdparm
  • CentOS/RHEL:sudo yum install hdparm

示例:测试磁盘读取速度#

# 测试/dev/sda的读取速度(需替换为目标磁盘,如/dev/nvme0n1)
sudo hdparm -t /dev/sda

输出解读:#

/dev/sda:
 Timing buffered disk reads:  1200 MB in  3.00 seconds = 399.83 MB/sec
  • 399.83 MB/sec 为磁盘的无缓存顺序读取速度。

扩展选项:#

  • -T:测试缓存读取速度(反映系统内存缓存性能,非磁盘本身):
    sudo hdparm -T /dev/sda
    输出示例:Timing cached reads: 20000 MB in 2.00 seconds = 10000.00 MB/sec(缓存速度通常远高于磁盘物理速度)。

2. 系统级监控工具:实时与历史I/O统计#

基础工具适合单点测试,而系统级监控工具可实时跟踪I/O负载、分析瓶颈,甚至回溯历史数据。

2.1 iostat:I/O性能的“瑞士军刀”#

iostat 来自 sysstat 工具包,可提供CPU、磁盘I/O的实时统计数据,是分析系统I/O瓶颈的核心工具。

适用场景:#

  • 实时监控磁盘I/O负载(如服务器高峰期)。
  • 定位具体磁盘/分区的I/O压力来源。

安装:#

  • Ubuntu/Debian:sudo apt install sysstat
  • CentOS/RHEL:sudo yum install sysstat

基础用法:#

# 显示所有磁盘的I/O统计(默认输出一次)
iostat
 
# 每2秒刷新一次,共输出5次(实时监控)
iostat 2 5
 
# 显示扩展统计(含延迟、使用率等关键指标)
iostat -x 2

输出解读(iostat -x):#

Linux 5.4.0-125-generic (server)  10/20/2023  _x86_64_  (8 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.23    0.01    0.56    0.89    0.00   97.31

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
sda              5.23    3.12    209.25    124.80     0.12     0.34   2.23   9.87    2.15    3.22   0.02     40.0     40.0   0.89   0.74
nvme0n1         12.56    8.34    502.40    333.60     0.00     0.00   0.00   0.00    0.52    0.87   0.01     40.0     40.0   0.23   0.48

关键指标说明:

  • r/s, w/s:每秒读/写请求数(IOPS)。
  • rkB/s, wkB/s:每秒读/写字节数(吞吐量,KB/s)。
  • r_await, w_await:读/写请求的平均等待时间(毫秒),包含队列等待和服务时间,反映I/O延迟。
  • %util:磁盘繁忙率(0%~100%),接近100%表示磁盘I/O饱和,可能是性能瓶颈。
  • aqu-sz:平均请求队列长度,数值越大表示I/O请求堆积越多。

2.2 sar:历史I/O数据回溯#

sar 同样来自 sysstat 工具包,可收集、存储和分析系统历史性能数据,支持回溯几小时甚至几天前的I/O状态。

适用场景:#

  • 排查过去发生的I/O性能问题(如凌晨3点的服务卡顿)。
  • 分析I/O负载的周期性规律。

基础用法:#

# 查看当天的I/O统计(默认每10分钟采样一次)
sar -b
 
# 查看昨天的I/O数据(需提前配置sysstat保存历史数据)
sar -b -f /var/log/sysstat/saXX  # XX为日期(如sa20表示20日)
 
# 实时监控I/O,每1秒输出一次,共10次
sar -b 1 10

输出解读(sar -b):#

Linux 5.4.0-125-generic (server)  10/20/2023  _x86_64_  (8 CPU)

12:00:01 AM       tps      rtps      wtps   bread/s   bwrtn/s
12:10:01 AM      8.35      5.23      3.12     209.2     124.8
12:20:01 AM      9.12      5.87      3.25     234.8     130.0
...
  • tps:每秒总I/O请求数(=rtps+wtps)。
  • rtps/wtps:每秒读/写请求数。
  • bread/s/bwrtn/s:每秒读/写字节数(块大小默认512B,需×512转换为KB/s)。

2.3 dstat:多维度I/O监控集成工具#

dstat 是一个现代化工具,整合了 vmstatiostatifstat 等功能,可同时监控CPU、内存、磁盘I/O、网络等多维度指标,输出更直观。

适用场景:#

  • 快速定位系统瓶颈(如I/O高时是否伴随CPU或内存问题)。

安装:#

  • Ubuntu/Debian:sudo apt install dstat
  • CentOS/RHEL:sudo yum install dstat

基础用法:#

# 监控磁盘I/O(默认显示读/写吞吐量和请求数)
dstat -d
 
# 显示详细I/O指标(含延迟、队列等)
dstat --disk-util --disk-tps --io
 
# 同时监控CPU、内存、磁盘、网络
dstat -cdng

输出示例:#

-dsk/total- ------io/total-----
 read  writ| read  writ  recv  send
  0.0  20.0 |  0.0   5.0  238k  120k
  0.0  40.0 |  0.0  10.0  240k  122k
  • read/writ(dsk/total):磁盘读/写吞吐量(MB/s)。
  • read/writ(io/total):每秒读/写请求数(IOPS)。

3. 进阶工具:模拟负载与深度性能测试#

基础工具和系统监控适合观察现状,而 fio(Flexible I/O Tester) 可模拟复杂的真实负载(如随机读写、混合I/O),是专业性能测试的首选。

3.1 fio:灵活强大的I/O压力测试工具#

fio 支持自定义I/O模式(顺序/随机)、块大小、并发数、队列深度等参数,能模拟数据库、文件服务器、虚拟机等不同场景的负载。

适用场景:#

  • 评估硬盘在特定业务场景下的性能(如数据库随机读写、视频服务器顺序读写)。
  • 对比不同硬盘(如HDD vs SSD)或文件系统(如ext4 vs xfs)的性能差异。

安装:#

  • Ubuntu/Debian:sudo apt install fio
  • CentOS/RHEL:sudo yum install fio

示例1:测试顺序写入性能#

创建一个任务文件 seq-write.fio

[global]
ioengine=libaio       # 使用Linux异步I/O引擎
direct=1              # 绕过缓存,直接I/O
bs=1M                 # 块大小1MB(适合大文件传输)
size=10G              # 总测试数据量10GB
runtime=60            # 测试持续60秒(优先级高于size)
time_based            # 按时间而非数据量停止
filename=/tmp/fio-test # 测试文件路径
 
[seq-write]
rw=write              # 纯写入模式
iodepth=32            # 队列深度32(并发I/O请求数)
numjobs=1             # 1个进程执行

运行测试:

fio seq-write.fio

示例2:测试随机读写性能(模拟数据库负载)#

创建 rand-rw.fio

[global]
ioengine=libaio
direct=1
bs=4k                 # 块大小4KB(数据库常见页大小)
size=5G
runtime=60
time_based
filename=/tmp/fio-test
 
[rand-rw]
rw=randrw             # 随机读写混合
rwmixread=70          # 读占比70%,写30%
iodepth=16
numjobs=4             # 4个进程并发

输出关键指标解读:#

seq-write: (groupid=0, jobs=1): err= 0: pid=12345: Thu Oct 20 10:00:00 2023
  write: IOPS=180, BW=180MiB/s (189MB/s)(10.5GiB/60.0s)
    slat (usec): min=2, max=1234, avg=15.25, stdev=22.34
    clat (usec): min=10, max=5678, avg=168.52, stdev=120.10
     lat (usec): min=15, max=5690, avg=183.77, stdev=121.45
    bw (  MiB/s): min=150, max=200, per=100.00%, avg=180.00, stdev=10.00, samples=120
  iops        : min=150, max=200, avg=180.00, stdev=10.00, samples=120
  • IOPS:每秒I/O请求数(随机读写场景核心指标)。
  • BW:吞吐量(顺序读写场景核心指标)。
  • clat:完成延迟(从I/O请求提交到完成的时间,毫秒级,越低越好)。
  • iodepth:实际队列深度(反映并发请求处理能力)。

4. 性能指标解读与最佳实践#

4.1 关键I/O指标解析#

指标含义理想范围瓶颈信号
吞吐量(MB/s)每秒读写数据量SSD:2003000,HDD:50200远低于硬件标称值
IOPS每秒I/O请求数(随机场景关键)SSD:10k1000k,HDD:100200数据库查询延迟高,IOPS不足
延迟(ms)I/O请求平均等待+服务时间(await)SSD:<10ms,HDD:<50msawait > 100ms,应用响应卡顿
磁盘繁忙率%util磁盘处理I/O的时间占比<70%持续>90%,I/O请求排队,响应延迟
队列长度(aqu-sz)平均等待处理的I/O请求数<5>10,请求堆积,系统卡顿

4.2 测试最佳实践#

  1. 避免干扰生产环境:测试会占用磁盘资源,建议在离线环境或低峰期进行,且测试文件应放在独立分区(避免影响其他数据)。
  2. 使用直接I/O(direct=1/oflag=direct):绕过系统缓存,确保测试反映真实磁盘性能(缓存会使结果偏高)。
  3. 控制测试数据量:至少覆盖磁盘缓存大小(如SSD缓存通常1~10GB),避免“缓存命中”导致结果失真。
  4. 模拟真实负载:根据业务场景选择参数(如数据库用4K随机读写,视频服务器用1M顺序读写)。
  5. 多次测试取平均值:单次测试可能受系统波动影响,建议运行3次以上取平均。
  6. 监控CPU和内存:I/O测试可能消耗CPU(如fio多线程),需确保CPU不成为瓶颈(iostat%iowait 高而 %util 低可能是CPU瓶颈)。

5. 总结#

Linux提供了从基础到进阶的完整硬盘性能分析工具链:

  • 快速测试dd(简单)、hdparm(读取专用);
  • 实时监控iostat(详细I/O指标)、dstat(多维度集成);
  • 历史回溯sar(长期数据记录);
  • 深度测试fio(模拟复杂负载)。

通过结合这些工具,可全面掌握硬盘的读写性能,定位瓶颈并优化系统配置。关键在于根据场景选择合适的工具,并正确解读吞吐量、IOPS、延迟等核心指标。

6. 参考资料#