2. 测试环境搭建:硬件选型与软件栈

吞吐测试这件事,说白了就是「用硬件堆出确定性」。我见过太多团队在软件层面死磕,结果发现瓶颈在网卡中断分配不均,或者交换机 buffer 太小。环境搭对了,问题就暴露了一半。这一章,我把这些年踩过的坑和验证过的方案,掰开揉碎讲给你听。

2.1 服务器选型:别让 CPU 成为瓶颈

很多人觉得吞吐测试嘛,CPU 够用就行。其实不然。我遇到过一台 32 核的机器,跑 10G 线速时 CPU 直接飙到 90%,后来发现是 NUMA 架构没对齐。你想想看,数据从网卡进来,跨 NUMA 节点访问内存,延迟直接翻倍。

我的建议是:

  • CPU 主频 > 2.5GHz,核心数至少 8 核以上。别用低频节能型 CPU,那玩意儿跑吞吐测试就是给自己挖坑。
  • NUMA 节点数越少越好。单节点最好,双节点也能接受。我曾经在 4 节点机器上做测试,光调中断亲和性就花了两天。
  • 内存至少 64GB,DDR4 3200 以上。吞吐测试时,内存带宽往往先于 CPU 成为瓶颈。

关键参数速查表

组件最低要求推荐配置我的备注
CPU8 核 @2.0GHz16 核 @3.0GHz别用 AMD EPYC 的某些低频型号
内存32GB DDR4128GB DDR5带宽比容量更重要
PCIe 插槽PCIe 3.0 x8PCIe 4.0 x16网卡带宽全靠它

2.2 网卡选型:决定吞吐上限的关键

网卡这东西,一分钱一分货。我见过有人用消费级网卡跑 40G 测试,结果丢包率惨不忍睹。说白了,服务器级网卡和桌面级网卡,根本是两个物种。

我个人习惯这样选:

  • Mellanox ConnectX 系列:做吞吐测试的首选。驱动成熟,工具链完善。我手头有块 ConnectX-5,跑了三年没出过问题。
  • Intel E810 系列:兼容性最好。如果你用的是 Intel CPU,这套组合基本不会踩坑。
  • Broadcom NetXtreme 系列:性价比高。预算有限时可以考虑,但驱动调优要花些功夫。

避坑指南:我曾经贪便宜买了块「拆机」网卡,结果 firmware 版本太老,死活不支持 PTP 时间戳。后来花了三天才刷好固件。记住,网卡 firmware 版本一定要和驱动匹配,这是血的教训。

2.3 交换机选型:别让网络成为瓶颈

很多人只关注服务器,忽略了交换机。其实,交换机才是吞吐测试的「隐形杀手」。我遇到过一台交换机,标称 40G 端口,实际跑 30G 就开始丢包。为什么?因为它的 buffer 只有 4MB。

选型要点:

  • 端口速率:至少 25G/100G。别用 10G 交换机测 25G 网卡,那叫自欺欺人。
  • Buffer 大小:至少 8MB 每端口。吞吐测试时,突发流量全靠 buffer 扛。
  • 支持 PFC/ECN:如果你要做 RoCEv2 测试,这两项必须支持。

注意:有些交换机标称「线速转发」,但实际开启 ACL 或 QoS 后性能会下降。我建议你在选型时,要求厂商提供「最差情况」下的吞吐数据,而不是「理想情况」。

2.4 软件栈:OS、驱动与工具链

硬件选好了,软件就是灵魂。我见过有人用 Ubuntu Desktop 做吞吐测试,结果被 GUI 进程抢了 CPU。嗯,这里要注意:吞吐测试的 OS,越干净越好。

我的推荐组合:

组件推荐版本理由
OSUbuntu Server 22.04 LTS / CentOS Stream 9内核新,驱动支持好
内核5.15+ 或 6.x支持 XDP、AF_XDP 等新特性
网卡驱动mlx5_core 最新版Mellanox 官方驱动,性能最优
DPDK22.11 LTS稳定,社区活跃
测试工具iperf3 / pktgen-dpdk / TRex覆盖 TCP/UDP/原始包

驱动安装要点:

# 以 Mellanox ConnectX-5 为例
# 1. 下载官方驱动
wget https://www.mellanox.com/downloads/MLNX_OFED/MLNX_OFED_LINUX-5.8-1.0.1.1/MLNX_OFED_LINUX-5.8-1.0.1.1-ubuntu22.04-x86_64.tgz

# 2. 安装依赖
sudo apt-get install -y gcc make libelf-dev

# 3. 安装驱动
sudo ./mlnxofedinstall --force

# 4. 重启后检查
ibdev2netdev -v

小技巧:安装完驱动后,记得执行 sudo mlxconfig -d /dev/mst/mt4119_pciconf0 set ADVANCED_PCI_SETTINGS=1。这个参数能开启网卡的高级 PCIe 特性,吞吐能提升 5-10%。

2.5 整体架构图

下面这张图,是我做吞吐测试时的标准拓扑。你照着搭,基本不会出大问题。

吞吐测试环境架构图 吞吐测试环境架构图 服务器 A CPU: 16核 @3.0GHz 内存: 128GB DDR5 网卡: ConnectX-5 100G 服务器 B CPU: 16核 @3.0GHz 内存: 128GB DDR5 网卡: ConnectX-5 100G 交换机 100G 端口 × 4 Buffer: 16MB/端口 说明 两台服务器通过 100G 直连交换机,中间无其他设备干扰 OS 使用最小化安装,关闭所有非必要服务

2.6 环境验证清单

硬件和软件都搭好了,别急着跑测试。先做一轮验证,确保环境没问题。我每次都会按这个清单走一遍:

  1. 链路层验证:ethtool eth0 | grep -i link,确认端口 up,速率正确。
  2. 驱动版本检查:ethtool -i eth0,确认驱动版本和 firmware 匹配。
  3. 中断亲和性:cat /proc/interrupts | grep eth0,确认中断均匀分布在各个 CPU 核心上。
  4. 基础连通性:ping -c 10 -s 1472 192.168.1.2,确认 MTU 1500 下无丢包。
  5. 吞吐基线:iperf3 -c 192.168.1.2 -t 30 -P 4,确认能达到预期带宽的 90% 以上。

重要:如果 iperf3 测试结果低于预期,不要急着调优。先检查网卡配置:ethtool -K eth0 gro on gso on tso on。我遇到过好几次,都是因为 offload 没开导致性能腰斩。

环境搭好了,下一步就是抓包。但抓包工具怎么选、参数怎么配,那又是另一门学问了。不过别急,先把这套环境跑稳了再说。