title: 磁盘与存储测试
created: 2026-06-20
updated: 2026-08-14
type: concept
tags: [storage, benchmark, filesystem, raid, nvme]
sources:
- raw/scripts/0硬盘.sh
- raw/scripts/fio.sh
- raw/scripts/fio.nvme.sh
- raw/scripts/fio.conf
- raw/scripts/iozone.sh
- raw/scripts/RAID.sh
- raw/scripts/iscsi.sh
- raw/scripts/磁盘 .sh


磁盘与存储测试

磁盘与存储测试涵盖基本信息查看、I/O 基准测试(顺序/随机)、压力测试、NVMe 专项测试、RAID 阵列管理。本文重点解析 FIO 工具的配置参数和顺序/随机 I/O 性能特征。


1. 存储设备基本信息查看

lsblk

列出所有块设备的拓扑、型号和挂载点:

lsblk -o NAME,MAJ:MIN,MODEL,SERIAL,SIZE,WWN,HCTL,TRAN,VENDOR,TYPE

关键字段:
- MODEL — 硬盘型号
- SERIAL — 序列号
- SIZE — 容量
- WWN — World Wide Name(全局唯一标识)
- TRAN — 传输协议(sata / nvme / scsi)

lsscsi

查看 SCSI 设备信息:

lsscsi -s

输出的关键信息包括 HCTL(Host:Channel:Target:Lun)、厂商、型号和容量。

blkid / UUID

blkid                          # 查看所有设备 UUID 和文件系统类型
ls -l /dev/disk/by-uuid/       # UUID 软链接
ls -l /dev/disk/by-id/         # WWID 软链接

smartctl(SMART 信息)

通过 SMART(Self-Monitoring, Analysis and Reporting Technology)查看硬盘健康状态:

# 查看硬盘温度
smartctl -a /dev/sda | grep -i -E 'Temperature|emp'

# 查看使用时间与序列号
sudo smartctl -i -A /dev/sdd | grep -iE 'Device Model|Serial|Power|Product'

# 批量采集
for i in {a..z}; do
    smartctl -a /dev/sd$i >> smartctl.out
done

关键阈值指标:
- Reallocated_Sector_Ct — 重映射扇区数(应为 0)
- Power_On_Hours — 通电小时数
- Temperature_Celsius — 当前温度
- Pending_Sector — 待重映射扇区(应为 0)

iostat

实时 I/O 性能监控:

iostat -x 1    # 每 1 秒输出扩展统计
指标 含义
r/s, w/s 每秒读写请求数(IOPS)
rkB/s, wkB/s 每秒读写数据量(吞吐量)
await 平均 I/O 等待时间(ms),反映延迟
%util 设备利用率(不一定是瓶颈指标)

参见:cpu-testing(CPU 性能影响 I/O 调度)、memory-testing(缓存清理操作与磁盘测试的配合)


2. FIO(Flexible I/O Tester)详解

FIO 是 Linux 上最主流的存储基准测试工具,支持多种 I/O 引擎和可自定义的负载模式。

安装

yum install -y libaio-devel fio
# 或源码编译
wget http://brick.kernel.dk/snaps/fio-2.2.5.tar.gz
tar -zxvf fio-2.2.5.tar.gz && cd fio-2.2.5
make && make install

核心参数详解

基础参数

参数 说明 典型值
--name 测试任务名称 test
--filename 测试目标(设备或文件) /dev/sdb
--directory 测试目录(基于文件系统) /tmp
--size 每个作业的 I/O 总量 10G, 100%
--runtime 测试持续时间 60s, 300s, 600s

I/O 模式(--rw

模式 含义 典型场景
read 顺序读 大文件读取、视频流
write 顺序写 大文件写入、日志写入
rw 顺序混合读写(默认各 50%) 文件服务器
randread 随机读 数据库 OLTP 查询
randwrite 随机写 数据库日志、缓存刷新
randrw 随机混合读写 数据库 OLTP 综合负载

关键性能调优参数

参数 说明 典型值
--bs 单次 I/O 块大小 4k(随机), 1M(顺序)
--bsrange 块大小范围 512-4096
--iodepth I/O 队列深度(异步引擎) 顺序 4-8,随机 32-128
--numjobs 并发作业(进程/线程)数 顺序 2-4,随机 4-8
--direct 绕过操作系统缓存(=1 开启) 1
--ioengine I/O 引擎 libaio, psync, mmap
--group_reporting 汇总所有作业的输出 (启用此选项)
--cpus_allowed 绑核(CPU 亲和性) 64-79
--ramp_time 预热时间(正式记录前) 6s

各参数详细说明:

典型 FIO 命令示例

# 顺序写 1M 块,2 作业,队列深度 4,运行 600 秒
fio -name=1Mw -filename=/dev/sdb -bs=1M -numjobs=2 -iodepth=4 \
    -direct=1 -ioengine=libaio -runtime=600s -group_reporting -rw=write

# 顺序读 1M 块,4 作业,队列深度 8,运行 60 秒
fio -name=1Mr -filename=/dev/sdb -bs=1M -numjobs=4 -iodepth=8 \
    -direct=1 -ioengine=libaio -runtime=60s -group_reporting -rw=read

# 4k 随机写,2 作业,队列深度 4,运行 600 秒
fio -name=4Kw -filename=/dev/sdb -bs=4k -numjobs=2 -iodepth=4 \
    -direct=1 -ioengine=libaio -runtime=600s -group_reporting -rw=randwrite

# 4k 随机读,8 作业,队列深度 32,运行 60 秒
fio -name=4Kr -filename=/dev/sdb -bs=4k -numjobs=8 -iodepth=32 \
    -direct=1 -ioengine=libaio -runtime=60s -group_reporting -rw=randread

# 混合随机读写(写占 30%),块大小范围 512-4096
fio -name=mix -filename=/dev/sdb -bsrange=512-4096 -direct=1 -numjobs=4 \
    -iodepth=32 -rw=randrw -rwmixwrite=30 -ioengine=libaio -group_reporting -runtime=60s

FIO 配置文件模式

大型测试可以使用配置文件组织多个测试阶段(通过 stonewall 分隔):

fio fio.conf

示例 fio.conf(详见 raw/scripts/fio.conf):

[global]
ioengine=libaio
direct=1
thread=1
norandommap=1
randrepeat=0
ramp_time=6
size=1g
filename=/dev/sdb

[write1M-seq]
stonewall
group_reporting
bs=1M
rw=write
numjobs=2
iodepth=4
runtime=600

[read1M-seq]
stonewall
group_reporting
bs=1M
rw=read
numjobs=4
iodepth=8
runtime=60

[write4k-rand]
stonewall
group_reporting
bs=4k
rw=randwrite
numjobs=2
iodepth=4
runtime=600

[read4k-rand]
stonewall
group_reporting
bs=4k
rw=randread
numjobs=8
iodepth=32
runtime=60

结果解读

FIO 输出格式示例:

Jobs: 4 (f=4): [r(4)][100.0%][r=512MiB/s][r=128k IOPS][eta 00m:00s]
  read: IOPS=128k, BW=512MiB/s (537MB/s)(30.0GiB/60001msec)
    slat (usec): min=2, max=256, avg=5.83, stdev=3.21
    clat (usec): min=10, max=5123, avg=85.12, stdev=45.3
     lat (usec): min=15, max=5140, avg=91.02, stdev=46.1
    bw (MiB/s): min=480, max=540, per=100.00%

关键输出:
- BW — 吞吐量(带宽),越高越好
- IOPS — 每秒 I/O 操作数,随机读写主要关注指标
- slat — 提交延迟(submission latency)
- clat — 完成延迟(completion latency)
- lat — 总延迟(slat + clat)
- bw (min/max) — 带宽波动范围


3. 顺序读写 vs 随机读写

性能特征对比

指标 顺序读写(seq) 随机读写(rand)
关注指标 带宽(MB/s) IOPS
典型块大小 1M 4k
HDD 特征 ≈150-250 MB/s(7200rpm) ≈100-200 IOPS(极低)
SATA SSD 特征 ≈500-550 MB/s ≈50k-100k IOPS
NVMe SSD 特征 ≈3500-14000 MB/s ≈500k-1500k IOPS
主要瓶颈 接口带宽 芯片控制器 + NAND 通道

测试策略

NVMe 存储的额外特性

NVMe SSD 具有极高的并行性,需要足够的 iodepthnumjobs 才能压满:

# NVMe 顺序读(队列深度 64,4 作业)
fio -name=1Mr -filename=/dev/nvme0n1 -bs=1M -numjobs=4 -iodepth=64 \
    -direct=1 -ioengine=libaio -runtime=60s -group_reporting -rw=read

# NVMe 4k 随机读(8 作业,队列深度 128)
fio -name=4Kr -filename=/dev/nvme0n1 -bs=4k -numjobs=8 -iodepth=128 \
    -direct=1 -ioengine=libaio -runtime=60s -group_reporting -rw=randread

4. NVMe 专项测试与工具

nvme-cli

安装与常用命令:

dnf install -y nvme-cli

# 列出 NVMe 设备
sudo nvme list

# 设备信息
sudo nvme id-ctrl /dev/nvme0n1

# SMART 日志(包括温度、磨损、坏块)
sudo nvme smart-log /dev/nvme0n1

# 查看温度
sudo nvme smart-log /dev/nvme0 | grep "^temperature"

# 格式化(-l 1=4K 对齐,-s 1=安全擦除)
sudo nvme format /dev/nvme0n1 -n 1 -l 1
sudo nvme format /dev/nvme0n1 -s 1

# 安全擦除
sudo nvme sanitize /dev/nvme0n1

NVMe 全盘压测流程

fio.nvme.sh 的典型步骤:

  1. 格式化nvme format 重置设备状态
  2. 顺序写预热fio -rw=write -bs=1M -iodepth=64 运行 600s
  3. 顺序读fio -rw=read -bs=1M -iodepth=64 运行 60s
  4. 预处理fio -rw=readwrite -bs=4k -size=100% --loops=2 填充数据
  5. 4k 随机写fio -rw=randwrite -bs=4k -iodepth=64 运行 600s
  6. 4k 随机读fio -rw=randread -bs=4k -iodepth=128 运行 60s
  7. 温度记录 — 每个阶段后通过 nvme smart-log 记录温度
  8. 结果汇总 — 自动提取 IOPS、带宽、温度、延迟生成 CSV

查看 NVMe 拓扑信息

# PCIe 拓扑
ls -l /sys/block/
lspci -vvs 0004:02:00.0

# 查看 NUMA 节点
lspci -vvvs 01:00.0 | grep NUMA

# 查看最大 Payload 大小(MRPS)和最大读请求(MRRS)
lspci -vv -s 21:00.0 | grep -E "MaxPayload|MaxReadReq"

5. iozone

iozone 是另一个全面的文件系统基准测试工具:

# 下载编译
wget http://www.iozone.org/src/stable/iozone3_491.tar
cd iozone/src/current
make linux

# 全面自动测试(-a),生成 Excel 格式报告
./iozone -aIRb out.xls

# 指定设备,测试读写+随机读写
./iozone -f /dev/sdb -i 0 -i 1 -i 2 -aIRb sdb.xls

# 指定文件大小和记录大小
./iozone -f /dev/sdb -s 10g -r 2m -I

iozone 测试模式(-i 参数):

模式 说明
0 write/rewrite(写/重写)
1 read/re-read(读/重读)
2 random-read/write(随机读写)
5 stride-read(步进读)

关键参数:
- -a — 全自动模式(测试多种块大小和文件大小)
- -I — 直接 I/O(绕过缓存),等同于 FIO 的 direct=1
- -R — 生成 Excel 兼容输出
- -b out.xls — 输出到 Excel 文件
- -s N — 测试文件大小
- -r N — 记录块大小
- -n / -g — 文件大小最小/最大值
- -y / -q — 记录块最小/最大值


6. dd 快速测速

dd 是最简单的 I/O 测试工具,适合快速验证:

# 写测试
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/zero of=/tmp/dd.dbf bs=1M count=1000 oflag=direct

# 读测试
echo 3 > /proc/sys/vm/drop_caches
dd if=/tmp/dd.dbf of=/dev/null bs=1M count=1000 iflag=direct

# 直接读写块设备
dd if=/dev/sde of=/dev/null bs=1M count=1000 iflag=direct
dd if=/dev/zero of=/dev/sde bs=1M count=1000 oflag=direct

7. RAID 管理(storcli)

查看 RAID 信息

# 查看 RAID 卡
storcli show

# 查看具体控制器上的物理盘信息
storcli /c0 show

创建 RAID

# RAID 0
storcli /c0 add VD r0 drives=93:3-4

# RAID 1
storcli /c0 add VD r1 drives=30:3,30:4

# RAID 5
storcli /c0 add VD r5 drives=252:0-3

# 设置写策略为 WriteBack
storcli /c0/v1 set wrcache=awb

常见运维操作

# 点亮故障灯
storcli /c0/e2/s5 start locate
storcli /c0/e2/s5 stop locate

# 设置全局热备盘
storcli64 /c0/e8/s3 add hotsparedrive

# 删除虚拟驱动器
storcli /c0/v0 delete force

# JBOD 模式切换
storcli /c0 set personality=jbod

# RAID 重建速率
storcli /cx set rebuildrate=60

MegaCLI(旧版)

# 查看物理盘
megacli -PDList -aALL

# 创建 RAID5(物理盘 2,3,4,热备盘 5)
megacli -CfgLdAdd -r5 [1:2,1:3,1:4] WB Direct -Hsp[1:5] -a0

关键指标对比

工具 测试类型 主要关注指标 适用场景
FIO 综合 I/O 基准 IOPS, BW (MB/s), 延迟 标准存储验收
iozone 文件系统基准 各模式带宽 文件系统层测试
dd 快速 I/O 测试 吞吐速度 快速验证
smartctl 硬盘健康监控 重映射扇区、温度、通电时间 硬盘故障预测
nvme-cli NVMe 管理 温度、磨损、格式化 NVMe SSD 运维
storcli RAID 管理 虚拟驱动状态、物理盘状态 RAID 配置与维护
iostat 实时监控 r/s, w/s, await, %util 性能问题定位

出链


FIO 工具详解

FIO — 灵活的 I/O 测试工具

FIO(Flexible I/O Tester)是 Linux 平台上最流行的磁盘 I/O 基准测试工具,由 Jens Axboe(Linux 内核块层维护者)开发。它支持丰富的 I/O 引擎、多种读写模式和详细的性能报告,是评估存储系统性能的首选工具。

安装方法

包管理器安装

# RHEL/CentOS
yum install -y libaio-devel fio

# Ubuntu/Debian
sudo apt install -y fio

# Fedora/RHEL 9+
sudo dnf install -y libaio-devel fio

源码编译安装

当需要最新版本或特定功能时,推荐源码编译:

wget http://brick.kernel.dk/snaps/fio-2.2.5.tar.gz
tar -zxvf fio-2.2.5.tar.gz
cd fio-2.2.5
make
# 若编译报错,修改 os/os-linux.h 增加头文件:#include <sys/sysmacros.h>
make install

# 创建软链接(若安装路径不在 PATH 中)
ln -s /usr/local/bin/ /usr/bin/
fio --version

核心参数详解

参数 说明 示例值
--name 测试任务命名 test
--filename 测试目标(块设备或文件) /dev/sdb
--rw 读写模式 read, write, rw, randread, randwrite, randrw
--rwmixwrite 混合模式下写操作占比 30(30%写)
--bs 单次 I/O 块大小 4K, 1024k
--bsrange 块大小范围 512-4096
--size 每个线程处理的 I/O 总量 1G
--direct 绕过操作系统缓存(1=启用) 1
--ioengine I/O 引擎 psync, libaio
--iodepth I/O 队列深度 32
--numjobs 并发线程数 4
--group_reporting 汇总所有线程的测试结果
--runtime 测试运行时长 60s, 300s
--ramp_time 预热时间(不计入统计) 6

I/O 引擎说明

读写模式(--rw)

含义
read 顺序读
write 顺序写
rw 顺序混合读写
randread 随机读
randwrite 随机写
randrw 随机混合读写

典型测试场景

1. 4K 随机读写(数据库场景)

# 4K 随机读
fio -name 4Kr -filename /dev/sdb -bs=4k -numjobs 4 -iodepth=32 \
    -direct=1 -ioengine=libaio -runtime=300s -group_reporting -rw=randread

# 4K 随机写
fio -name 4Kw -filename /dev/sdb -bs=4k -numjobs 4 -iodepth=32 \
    -direct=1 -ioengine=libaio -runtime=300s -group_reporting -rw=randwrite

2. 1024K 顺序读写(大文件传输场景)

# 1024K 顺序读
fio -name 1024Kr -filename /dev/sdb -bs=1024k -numjobs 4 -iodepth=32 \
    -direct=1 -ioengine=libaio -runtime=300s -group_reporting -rw=read

# 1024K 顺序写
fio -name 1024Kw -filename /dev/sdb -bs=1024k -numjobs 4 -iodepth=32 \
    -direct=1 -ioengine=libaio -runtime=300s -group_reporting -rw=write

3. 变长块混合读写

# 512B ~ 4K 随机混合读写(写占 30%)
fio -name 512~4096brw -filename=/dev/sdb -bsrange=512-4096 \
    -direct=1 -numjobs=4 -iodepth=32 -rw=randrw -rwmixwrite=30 \
    -ioengine=libaio -group_reporting -runtime=60s

# 64K ~ 1024K 顺序混合读写(写占 30%)
fio -name 1Mrw -filename=/dev/sdb -bsrange=64k-1024k \
    -direct=1 -numjobs=4 -iodepth=4 -rw=rw -rwmixwrite=30 \
    -group_reporting -ioengine=libaio -runtime=60s

NVMe 专项测试

NVMe 设备具有更高的 IOPS 和更低的延迟,测试前建议先执行 echo 3 > /proc/sys/vm/drop_caches 清理缓存,并使用 n 前缀的 /dev/nvme*n* 设备路径。

# 获取 NVMe 设备的 WWID(用于唯一标识)
ll /dev/disk/by-id/

# 4K 随机读写测试(NVMe)
fio -name 4Kr -filename /dev/nvme0n1 -bs=4k -numjobs 4 -iodepth=32 \
    -direct=1 -ioengine=libaio -runtime=300s -group_reporting -rw=randread \
    > nvme-device.4k.randread.out

fio -name 4Kw -filename /dev/nvme0n1 -bs=4k -numjobs 4 -iodepth=32 \
    -direct=1 -ioengine=libaio -runtime=300s -group_reporting -rw=randwrite \
    > nvme-device.4k.randwrite.out

# 1024K 顺序读写测试(NVMe)
fio -name 1024Kr -filename /dev/nvme0n1 -bs=1024k -numjobs 4 -iodepth=32 \
    -direct=1 -ioengine=libaio -runtime=300s -group_reporting -rw=read

fio -name 1024Kw -filename /dev/nvme0n1 -bs=1024k -numjobs 4 -iodepth=32 \
    -direct=1 -ioengine=libaio -runtime=300s -group_reporting -rw=write

NVMe 全自动批量测试(fio.nvme.sh)

该脚本自动识别非系统盘的 NVMe 设备,逐个执行完整的读写压力测试,并记录 NVMe SMART 温度数据:

# 执行全盘 NVMe 测试(自动循环 3 轮)
sudo curl http://192.168.1.34/fio.nvme.sh | sh

测试流程:
1. 排除系统盘(通过 df 检测)
2. 对每个非系统 NVMe 设备依次执行:1M 顺序写 → 1M 顺序读 → 4K 随机写 → 4K 随机读
3. 每轮测试后记录 NVMe 温度
4. 生成 CSV 汇总报告(包含 IOPS、带宽、延迟、温度)

多盘并发压力测试

对多块磁盘同时施加压力,模拟 RAID/JBOD 场景。

命令行方式

date > fio.out
fio -name 1024Kr \
    -filename=/dev/sda -filename=/dev/sdb -filename=/dev/sdc \
    -filename=/dev/sdd -filename=/dev/sde -filename=/dev/sdf \
    -bs=1024k -numjobs 4 -iodepth=32 -direct=1 -ioengine=libaio \
    -runtime=36000s -group_reporting -rw=read -rwmixwrite=30 \
    >> fio.out
date >> fio.out

使用配置文件(fio.conf)

[global]
ioengine=libaio
direct=1
thread=1
norandommap=1
randrepeat=0
ramp_time=6
size=1g
filename=/dev/sdb
filename=/dev/sdc          # 可指定多块磁盘
; ...更多盘...

[write1M-seq]
stonewall
group_reporting
bs=1M
rw=write
numjobs=2
iodepth=4
runtime=600

[read1M-seq]
stonewall
group_reporting
bs=1M
rw=read
numjobs=4
iodepth=8
runtime=60

[write4k-rand]
stonewall
group_reporting
bs=4k
rw=randwrite
numjobs=2
iodepth=4
runtime=600

[read4k-rand]
stonewall
group_reporting
bs=4k
rw=randread
numjobs=8
iodepth=32
runtime=60

使用配置文件运行:

fio fio.conf

stonewall 指令表示上一个 job 完成后才执行下一个,确保测试间不互相干扰。

结果解读

FIO 输出示例(关键指标):

Jobs: 4 (f=4): [r(4)][100.0%][r=1234MiB/s][r=316k IOPS][eta 00m:00s]
  read: IOPS=316k, BW=1234MiB/s (1294MB/s)(1234MiB/1000msec)
    slat (nsec): min=142, max=10563, avg=245.77, stdev=78.45
    clat (usec): min=112, max=25314, avg=389.12, stdev=120.34
    lat (usec): min=113, max=25315, avg=389.36, stdev=120.35
指标 全称 说明
IOPS Input/Output Operations Per Second 每秒 I/O 操作数,随机读写的关键指标
BW Bandwidth 带宽,以 MiB/s 或 MB/s 为单位,顺序读写的关键指标
lat Latency I/O 延迟,包含 slat(提交延迟)、clat(完成延迟)、lat(总延迟)
slat Submission Latency 从提交到内核的延迟
clat Completion Latency 从提交到完成的延迟
lat Total Latency slat + clat 的总和
avg Average 平均延迟值
stdev Standard Deviation 延迟标准差,反映延迟稳定性

CSV 汇总脚本

for l in $(ls); do
  IOPS=$(cat $l | grep "IOPS" | awk '{printf $2}' | cut -d "=" -f 2 | cut -d "," -f 1)
  BW=$(cat $l | grep "IOPS" | awk '{printf $4}' | cut -d "(" -f 2 | cut -d ")" -f 1)
  lat=$(cat $l | grep "[^a-z]lat.*avg" | awk '{printf $6}' | cut -d "=" -f 2)
  echo "$l","$BW","$IOPS","$lat" >> fio.csv
done

相关概念