NVMe 硬盘满盘读写性能测试 + gnuplot 可视化全攻略
前言
很多人测试硬盘性能只测空盘的前 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
二、测试前必做!数据安全第一
⚠️ 重要警告:全盘写入测试会永久擦除磁盘所有数据!执行前必须:
- 确认目标磁盘设备名(绝对不能写错!)
- 已完成磁盘所有数据的全量备份
- 卸载磁盘所有分区
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.log、full-disk-read_iops.1.log、full-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.log、full-disk-write_iops.1.log、full-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
七、常见问题与避坑指南
- 设备名写错导致系统盘被格式化:永远先用
lsblk确认设备名,不要凭记忆输入! - 测试速度偏低:每次测试前必须执行
sudo echo 3 > /proc/sys/vm/drop_caches清理缓存 - gnuplot 字体乱码:安装中文字体后,将脚本中的
"Verdana,10"改为"WenQuanYi Micro Hei,10" - umount 提示设备忙:执行
sudo fuser -km /dev/nvme0n1强制结束占用进程
八、测试文件归档
测试完成后,务必保存以下文件,方便后续分析和对比:
- 硬盘基础信息:
disk-info.txt - FIO 测试终端输出:复制保存为
test-results.txt - 所有性能图表:
*.png - 原始测试日志:
*.log
总结
这套测试方案不仅适用于飞腾 + UOS 平台,也能在任何 Linux 系统上使用。通过全盘测试,你能真正了解一块硬盘的真实性能,避免被厂商的 "峰值速度" 宣传误导。
更多推荐

所有评论(0)