前言

很多人测试硬盘性能只测空盘的前 10G,但真实场景下硬盘满负载运行时,SLC 缓存耗尽后的缓外速度、全盘读写稳定性才是决定使用体验的关键,尤其是工控、服务器、数据存储等场景。

本文将手把手教你用行业标准的FIO工具完成NVMe 硬盘全盘读写测试,并用原生gnuplot生成专业的性能曲线图,全程无坑,复制粘贴就能用。


一、测试环境与工具准备

1.1 硬件环境

  • 处理器:飞腾 D2000(ARM 架构)
  • 测试磁盘:NVMe SSD(任意型号)
  • 操作系统:统信 UOS(Debian 系,其他 Linux 发行版通用)

1.2 安装必需工具

一行命令安装所有依赖,包括测试工具、磁盘管理工具和绘图工具:

sudo apt update && sudo apt install fio gnuplot nvme-cli smartmontools -y

二、测试前必做!数据安全第一

⚠️ 重要警告:全盘写入测试会永久擦除磁盘所有数据!执行前必须:

  1. 确认目标磁盘设备名(绝对不能写错!)
  2. 已完成磁盘所有数据的全量备份
  3. 卸载磁盘所有分区

2.1 确认目标磁盘设备名

lsblk

输出示例中,/dev/nvme0n1就是我们要测试的 NVMe 磁盘(注意区分系统盘和数据盘!)

root@grg:/home/grg# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0 953.9G  0 disk
├─sda1        8:1    0   300M  0 part /boot/efi
├─sda2        8:2    0   1.5G  0 part /boot
├─sda3        8:3    0   100G  0 part /
├─sda4        8:4    0   100G  0 part
├─sda5        8:5    0 713.1G  0 part /data
├─sda6        8:6    0    28G  0 part /recovery
└─sda7        8:7    0    11G  0 part [SWAP]
nvme0n1     259:0    0 238.5G  0 disk
├─nvme0n1p1 259:1    0   300M  0 part /media/grg/EFI
├─nvme0n1p2 259:2    0   1.5G  0 part /media/grg/Boot
├─nvme0n1p3 259:3    0   100G  0 part /media/grg/Roota
├─nvme0n1p4 259:4    0   100G  0 part /media/grg/Rootb
├─nvme0n1p5 259:5    0   6.7G  0 part /media/grg/_dde_data
├─nvme0n1p6 259:6    0    14G  0 part /media/grg/Backup
└─nvme0n1p7 259:7    0    16G  0 part

2.2 卸载磁盘所有分区

sudo umount /dev/nvme0n1*

如果提示 "target is busy",先关闭所有访问该磁盘的程序,或重启系统后再执行

2.3 清理系统缓存(每次测试前必做)

避免系统缓存影响测试结果准确性:

sudo echo 3 > /proc/sys/vm/drop_caches

2.4 采集硬盘基础信息(永久留存)

测试前先记录硬盘的型号、固件、序列号和健康状态,方便后续对比:

# 硬盘基础信息
sudo nvme list > disk-info.txt
# 硬盘SMART健康信息
sudo nvme smart-log /dev/nvme0n1 >> disk-info.txt
# 查看保存的信息
cat disk-info.txt

三、第一阶段:安全只读测试(不破坏数据)

先做只读测试,既能验证磁盘基本性能,又不会损坏现有数据,推荐必做。

3.1 全盘顺序读取测试

测试目标:获取硬盘从第一个扇区到最后一个扇区的完整读取性能分布

fio --filename=/dev/nvme0n1 \
    --direct=1 --rw=read --bs=128k \
    --iodepth=16 --ioengine=libaio \
    --group_reporting --name=full-disk-read \
    --log_avg_msec=1000 \
    --write_bw_log=full-disk-read \
    --write_iops_log=full-disk-read \
    --write_lat_log=full-disk-read \
    --size=100%

生成日志文件:full-disk-read_bw.1.logfull-disk-read_iops.1.logfull-disk-read_lat.1.log

3.2 4K 随机读取测试

测试目标:模拟日常办公、系统启动等负载,获取最影响使用体验的随机读取 IOPS 和延迟

fio --filename=/dev/nvme0n1 \
    --direct=1 --rw=randread --bs=4k \
    --iodepth=32 --numjobs=4 \
    --ioengine=libaio --group_reporting \
    --name=rand-read \
    --log_avg_msec=1000 \
    --write_bw_log=rand-read \
    --write_iops_log=rand-read \
    --write_lat_log=rand-read \
    --size=10G --runtime=120

四、第二阶段:全盘写入测试(会擦除所有数据)

⚠️ 再次警告:此步骤会永久删除磁盘上的所有数据!仅用于空盘或已备份的磁盘!

4.1 全盘顺序写入测试

测试目标:获取硬盘完整写入性能分布,精准识别 SLC 缓存大小和缓外速度

fio --filename=/dev/nvme0n1 \
    --direct=1 --rw=write --bs=128k \
    --iodepth=16 --ioengine=libaio \
    --group_reporting --name=full-disk-write \
    --log_avg_msec=1000 \
    --write_bw_log=full-disk-write \
    --write_iops_log=full-disk-write \
    --write_lat_log=full-disk-write \
    --size=100%

生成日志文件:full-disk-write_bw.1.logfull-disk-write_iops.1.logfull-disk-write_lat.1.log

4.2 写入后验证测试(推荐)

测试目标:验证数据写入正确性,同时生成读写对比曲线

fio --filename=/dev/nvme0n1 \
    --direct=1 --rw=read --bs=128k \
    --iodepth=16 --ioengine=libaio \
    --group_reporting --name=full-disk-verify \
    --log_avg_msec=1000 \
    --write_bw_log=full-disk-verify \
    --size=100%

4.3 4K 随机写入测试

测试目标:模拟数据库、虚拟机等随机写入负载

fio --filename=/dev/nvme0n1 \
    --direct=1 --rw=randwrite --bs=4k \
    --iodepth=32 --numjobs=4 \
    --ioengine=libaio --group_reporting \
    --name=rand-write \
    --log_avg_msec=1000 \
    --write_bw_log=rand-write \
    --write_iops_log=rand-write \
    --write_lat_log=rand-write \
    --size=10G --runtime=120

五、第三阶段:一键生成专业性能图表

不用装任何第三方软件,用原生gnuplot一键生成高清性能曲线图,100% 兼容飞腾 ARM 平台。

5.1 一键生成所有速率图

复制以下所有内容到终端执行,会自动生成 3 张核心图表:

# 1. 生成全盘读取速率图
cat > plot-read.gp << 'EOF'
set terminal png size 1200,600 enhanced font "Verdana,10"
set output "full-disk-read.png"
set title "Full Disk Read Bandwidth (MB/s) - NVMe SSD"
set xlabel "Time (seconds) - Disk Position (Start → End)"
set ylabel "Read Bandwidth (MB/s)"
set grid
set key left top
plot "full-disk-read_bw.1.log" using 1:($2/1024) with lines title "Read Bandwidth" lw 2 linecolor rgb "#009933"
EOF

# 2. 生成全盘写入速率图
cat > plot-write.gp << 'EOF'
set terminal png size 1200,600 enhanced font "Verdana,10"
set output "full-disk-write.png"
set title "Full Disk Write Bandwidth (MB/s) - NVMe SSD"
set xlabel "Time (seconds) - Disk Position (Start → End)"
set ylabel "Write Bandwidth (MB/s)"
set grid
set key left top
plot "full-disk-write_bw.1.log" using 1:($2/1024) with lines title "Write Bandwidth" lw 2 linecolor rgb "#0066cc"
EOF

# 3. 生成读写对比图
cat > plot-compare.gp << 'EOF'
set terminal png size 1200,600 enhanced font "Verdana,10"
set output "full-disk-rw-compare.png"
set title "Full Disk Read/Write Bandwidth Comparison"
set xlabel "Time (seconds) - Disk Position (Start → End)"
set ylabel "Bandwidth (MB/s)"
set grid
set key left top
plot "full-disk-read_bw.1.log" using 1:($2/1024) with lines title "Read" lw 2 linecolor rgb "#009933", \
     "full-disk-write_bw.1.log" using 1:($2/1024) with lines title "Write" lw 2 linecolor rgb "#0066cc"
EOF

# 执行所有绘图脚本
gnuplot plot-read.gp
gnuplot plot-write.gp
gnuplot plot-compare.gp 2>/dev/null || true

echo "✅ 所有图表生成完成:"
ls -lh *.png
root@grg:/home/grg/test3# ls -lh *.png
-rw-r--r-- 1 root root 15K 4月   8 15:07 full-disk-read.png
-rw-r--r-- 1 root root 11K 4月   8 15:07 full-disk-rw-compare.png
-rw-r--r-- 1 root root 11K 4月   8 15:07 full-disk-write.png

5.2 生成写入 IOPS 图(可选)

cat > plot-iops.gp << 'EOF'
set terminal png size 1200,600 enhanced font "Verdana,10"
set output "full-disk-write-iops.png"
set title "Full Disk Write IOPS"
set xlabel "Time (seconds)"
set ylabel "IOPS"
set grid
plot "full-disk-write_iops.1.log" using 1:2 with lines title "Write IOPS" lw 2 linecolor rgb "#ff6600"
EOF

gnuplot plot-iops.gp
root@grg:/home/grg/test3# ls -lh *.png
-rw-r--r-- 1 root root  15K 4月   8 15:07 full-disk-read.png
-rw-r--r-- 1 root root  11K 4月   8 15:07 full-disk-rw-compare.png
-rw-r--r-- 1 root root 8.5K 4月   8 15:08 full-disk-write-iops.png
-rw-r--r-- 1 root root  11K 4月   8 15:07 full-disk-write.png

七、常见问题与避坑指南

  1. 设备名写错导致系统盘被格式化:永远先用lsblk确认设备名,不要凭记忆输入!
  2. 测试速度偏低:每次测试前必须执行sudo echo 3 > /proc/sys/vm/drop_caches清理缓存
  3. gnuplot 字体乱码:安装中文字体后,将脚本中的"Verdana,10"改为"WenQuanYi Micro Hei,10"
  4. umount 提示设备忙:执行sudo fuser -km /dev/nvme0n1强制结束占用进程

八、测试文件归档

测试完成后,务必保存以下文件,方便后续分析和对比:

  • 硬盘基础信息:disk-info.txt
  • FIO 测试终端输出:复制保存为test-results.txt
  • 所有性能图表:*.png
  • 原始测试日志:*.log

总结

这套测试方案不仅适用于飞腾 + UOS 平台,也能在任何 Linux 系统上使用。通过全盘测试,你能真正了解一块硬盘的真实性能,避免被厂商的 "峰值速度" 宣传误导。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐