4. 测试环境搭建

核心原理:基准测试是“受控实验”,不是“跑分表演”

存储性能基准测试的本质是在可重复、可隔离、可观测的条件下,测量存储系统在特定负载下的行为特征。任何未受控的变量都会污染测试结果,使数据失去横向对比和纵向追踪的意义。测试环境搭建的目标不是追求“最高分”,而是构建一个“变量最小化”的实验平台——让被测存储系统成为唯一的变化源,而硬件、操作系统、文件系统与网络都成为稳定的“背景条件”。

一个常见的认知误区是:只关注存储设备本身的规格(如 SSD 的顺序读带宽),却忽略了下层 PCIe 链路速率、CPU 中断亲和性、文件系统元数据开销、网络协议栈缓冲等“隐形瓶颈”。这些因素叠加后,往往会让标称 7GB/s 的 NVMe SSD 在真实测试中只能跑出 3GB/s。因此,测试环境搭建必须遵循“从底层到上层逐层校准”的原则:先确认硬件链路无误,再调优操作系统,然后选择匹配的文件系统,最后配置网络拓扑。

环境搭建的四个层级(自下而上):

  1. 硬件层:CPU、内存、PCIe 通道、存储设备接口——决定理论性能上限。
  2. 操作系统层:内核参数、中断绑定、调度策略、缓存策略——决定硬件性能能否被有效释放。
  3. 文件系统层:格式类型、挂载选项、块大小、日志模式——决定数据组织与元数据开销。
  4. 网络层:协议、带宽、延迟、队列深度——决定远端访问场景下的传输效率。
存储基准测试环境四层模型 ① 硬件层 CPU 核心数 / 频率 · 内存通道与容量 · PCIe Gen4/Gen5 通道分配 NVMe 盘位 · HBA/RAID 卡模式 · 供电与散热(影响持续负载稳定性) 校准动作 lspci 检查链路速率 确认 NUMA 节点拓扑 ② 操作系统层 内核版本与调度器 · 中断亲和性(irqbalance 关闭) · HugePages 配置 I/O 调度器(none/mq-deadline) · dirty_ratio/dirty_background_ratio 调整 校准动作 taskset 绑定测试进程 sysctl 持久化参数 ③ 文件系统层 XFS / ext4 / Btrfs / ZFS 选择 · 块大小(bs=4k/8k/1M) · 日志模式(data=ordered/writeback) 挂载选项(noatime,nodiratime) · 预分配策略 · 碎片整理状态 校准动作 mkfs 后记录格式化参数 df -T 确认挂载类型 ④ 网络层 协议(iSCSI/NFS/RDMA) · 网卡队列数(ethtool -L) · MTU 9000(jumbo frame) 交换机流控 · 延迟与带宽测试(iperf3 / qperf) · 多路径配置(MPIO) 校准动作 ping 延迟 < 0.1ms 自下而上逐层验证

方法流程:从硬件校准到网络验证的四步搭建法

测试环境搭建应遵循“先本地后远端、先单点后并发”的递进策略。以下四个步骤缺一不可,每一步都需记录日志,便于后续复现与排障。

步骤一:硬件配置与校验

  • CPU 与内存:关闭 CPU 频率缩放(cpupower frequency-set -g performance),避免睿频波动影响延迟测试;内存建议不低于被测存储容量的 1‰(例如测试 4TB 卷,内存 ≥ 8GB),并确保测试线程与 NUMA 节点亲和。
  • PCIe 链路:使用 lspci -vvv 检查 NVMe 控制器的 LnkSta 字段,确认速率达到 Gen4 x4(约 7GB/s 理论带宽)或 Gen5 x4(约 14GB/s)。若降速为 Gen3,需检查插槽物理通道与 BIOS 设置。
  • 存储设备:将被测盘直通给测试机,避免经过 RAID 卡(除非测试目标就是 RAID 阵列);若必须使用 RAID 卡,设置为 JBOD 或 HBA 模式,并关闭写缓存(WriteBack 会污染延迟数据)。

步骤二:操作系统内核参数调优

以下为 Linux 环境下的关键设置(以 CentOS/RHEL 9.x 为例):

# 关闭 IRQ 自动平衡,手动绑定网卡与 NVMe 中断到固定 CPU
systemctl stop irqbalance
# 设置 I/O 调度器为 none(NVMe 专用)
echo none > /sys/block/nvme0n1/queue/scheduler
# 调整脏页写回阈值(避免突发写流量导致延迟尖刺)
sysctl -w vm.dirty_ratio=20
sysctl -w vm.dirty_background_ratio=5
# 扩大网络缓冲区(用于 iSCSI/NFS 测试)
sysctl -w net.core.rmem_max=67108864
sysctl -w net.core.wmem_max=67108864
# 关闭透明大页(减少内存分配抖动)
echo never > /sys/kernel/mm/transparent_hugepage/enabled

步骤三:文件系统选择与格式化

文件系统适用场景推荐块大小关键挂载选项
XFS大文件顺序读写、高并发4k(元数据)/ 1M(大块)noatime, logbsize=256k
ext4通用场景、小文件随机读写4knoatime, data=writeback
Btrfs需要快照/压缩的场景4k(默认)compress=zstd(可选)
ZFS数据完整性要求极高recordsize=128katime=off, compression=lz4

格式化后务必使用 mount -o remount,noatime 确认选项生效,并记录 df -T 输出。

步骤四:网络配置与连通性验证

对于 iSCSI 或 NFS 测试,网络配置直接影响吞吐与延迟表现:

# 启用 jumbo frame(需交换机同步支持)
ip link set dev eth0 mtu 9000
# 查看网卡队列数(建议等于 CPU 物理核心数)
ethtool -l eth0
# 使用 iperf3 验证 TCP 带宽(目标:线速的 90% 以上)
iperf3 -c 192.168.1.100 -t 30 -P 8

案例/场景:一次 NVMe-over-Fabric 测试环境的搭建复盘

某互联网公司需要对一台双端口 NVMe SSD(标称顺序读 6.5GB/s)进行 4K 随机读延迟测试,测试机为双路 Intel Xeon 6338,操作系统为 Ubuntu 22.04。初始测试结果仅达到 3.2GB/s 吞吐,平均延迟 180μs,远低于预期。

排查过程:

  1. 硬件层:执行 lspci -vvv 发现 NVMe 控制器运行在 Gen3 x4(实际带宽约 3.5GB/s),原因是 CPU 直连的 PCIe 插槽被 GPU 占用,SSD 被插到了 PCH 提供的 Gen3 插槽。更换插槽后链路恢复 Gen4 x4。
  2. 操作系统层:检查发现 irqbalance 仍在运行,导致 NVMe 中断在多个 CPU 间迁移,产生额外延迟。关闭后使用 taskset -c 2-5 绑定测试进程。
  3. 文件系统层:原格式为 ext4 且未关闭 atime,导致每次读操作触发元数据更新。重新格式化为 XFS,挂载时添加 noatime,nodiratime。
  4. 网络层:测试机与存储之间使用 25GbE 网卡,但 MTU 为默认 1500,大包传输效率低。统一调整为 MTU 9000 后,TCP 吞吐从 1.8GB/s 提升至 2.3GB/s。

最终测试结果:4K 随机读平均延迟降至 78μs,吞吐达到 5.1GB/s(接近设备上限的 78%,剩余开销来自 NVMe 协议与 CPU 中断处理)。

误区/复盘:环境搭建中的五个典型陷阱

陷阱一:忽略 NUMA 拓扑——测试进程运行在 Node 0,而 NVMe 控制器挂在 Node 1,跨节点访问增加 20-30% 延迟。务必使用 numactl --hardware 确认拓扑,并用 numactl --cpunodebind=0 --membind=0 绑定。

陷阱二:文件系统未“预热”——新格式化的文件系统在首次写入时需分配元数据,导致前几分钟测试数据偏低。建议先用 fio --prepare 或 dd 填充全盘,再开始正式测试。

陷阱三:网络测试忽略 TCP 窗口——默认的 tcp_wmem 较小,在高带宽延迟乘积(BDP)下无法填满管道。应同步调整 net.ipv4.tcp_rmem 和 tcp_wmem 的最大值。

陷阱四:使用不同版本的内核或驱动——测试机 A 用 5.15 内核,测试机 B 用 6.1 内核,NVMe 驱动行为差异可能导致结果偏差 5-10%。所有对比测试必须在相同内核版本下进行。

陷阱五:忘记记录环境快照——测试完成后无法复现结果,因为不知道当时的具体参数组合。建议每次测试前执行 uname -a; lspci -vvv; mount | grep nvme; sysctl -a | grep -E 'dirty|swap' 并保存为日志文件。

测试环境搭建的最终验收标准是:连续三次运行同一基准测试,结果波动不超过 3%。若波动超过该阈值,应优先检查硬件链路(如 PCIe 降速、散热降频)或系统后台进程(如 cron 任务、日志清理)。只有环境稳定,后续的调优工作才有意义——否则你优化的是“环境噪声”,而不是存储系统本身。