本文由 Codex 根据一次网络设备性能测试讨论辅助整理生成。文中的数值用于说明方法,不代表某台设备的实测结果。
测试路由器、交换机或软路由时,只跑一次 iperf3,最多只能回答“这组 TCP 流量跑了多快”,不能完整说明设备性能。
一套有意义的测试,至少应该同时观察:吞吐、PPS、丢包、时延、并发流和长时间稳定性。如果被测对象带有 NAT、防火墙或负载均衡功能,还要增加并发连接数和每秒新建连接数等指标。
先明确测试对象和指标
DUT 是 Device Under Test 的缩写,即被测设备。例如:
1 | 流量发生器 A ────── DUT ────── 流量接收器 B |
A 负责产生流量,B 负责接收流量,测试流量必须经过 DUT。
常见指标如下:
| 指标 | 含义 | 主要反映什么 |
|---|---|---|
| Throughput | 无丢包时可持续转发的最大速率 | 带宽与综合转发能力 |
| PPS | 每秒转发的包数 | 逐包处理能力 |
| Frame Loss | 输入帧与输出帧的数量差 | 是否超过设备极限 |
| Latency | 帧经过 DUT 所需的时间 | 转发和排队时延 |
| Jitter | 时延的波动程度 | 实时业务体验 |
| Concurrent Flows | 同时存在的流数量 | NAT、防火墙、负载均衡容量 |
| CPS | 每秒新建连接数 | 有状态设备的连接建立能力 |
| Stability | 持续高负载下的表现 | 温度、内存泄漏、降频等问题 |
其中最容易被忽略的是:Gbps 高不代表 PPS 高。
什么是线速
线速(Line Rate 或 Wire Speed)不是五类线、六类线的分类,而是物理链路的额定传输速率。
例如一个 10GbE 网口的线速是:
1 | 10,000,000,000 bit/s |
如果 DUT 能在持续输入 10 Gbit/s 流量时全部转发,没有丢包,通常称为“线速转发”。
网线类别与线速属于不同层次:
1 | Cat5e / Cat6 / Cat6A |
为什么要测试 64B 小包
Ethernet 规定,从目的 MAC 到 FCS 的最小帧长度是 64B。以无 Payload 的 IPv4 + TCP 帧为例:
1 | Destination MAC 6B |
源、目的 MAC,源、目的 IP,源、目的端口只是各层 Header 的一部分。IPv4 和 TCP 还需要长度、TTL、协议号、序列号、确认号、Flags、Checksum 等控制字段。
Padding 是什么
Padding 是没有业务含义的填充字节。当 Ethernet Header、上层 Header 和 Payload 不足以组成最小帧时,网卡会自动补齐。
上面的 IPv4 + TCP 内容在 FCS 前只有 54B,而 FCS 前至少需要 60B,因此需要:
1 | 60B - 54B = 6B Padding |
接收端根据 IP 层的长度字段识别有效内容,不会把 Padding 当成上层数据。
为什么计算 PPS 时按 84B
64B 是 Ethernet Frame 本身的大小,但连续发送一个最小帧所占用的链路时间还包括:
1 | Preamble + SFD 8B |
其中 IFG 是 96 bit-times 的线路空闲时间,并不是真的发送了 12B 数据。为了计算方便,可以把它折算成 12 Byte-times。
因此,1GbE 上 64B 小包的理论最大包速率是:
1 | 1,000,000,000 ÷ ((64 + 8 + 12) × 8) |
10GbE 则约为:
1 | 14.88 Mpps |
同一条 10GbE 链路发送大帧时,每秒需要处理的帧少得多:
| Ethernet Frame | 10GbE 理论帧率 |
|---|---|
| 64B | 14.88 Mpps |
| 128B | 8.45 Mpps |
| 256B | 4.53 Mpps |
| 512B | 2.35 Mpps |
| 1024B | 1.20 Mpps |
| 1280B | 0.96 Mpps |
| 1518B | 0.81 Mpps |
计算公式为:
1 | PPS = 链路速率 ÷ ((Ethernet Frame + 8B Preamble/SFD + 12B IFG) × 8) |
因此,64B 小包会把 ASIC、CPU、FIB 查询、ACL、conntrack、队列、DMA 和网卡描述符的逐包开销放大。设备可能在 1518B 大帧下跑满 10GbE,却无法在线速下转发 64B 小包。
可以简单记成:大包主要测带宽,小包主要测 PPS。
搭建隔离测试拓扑
路由器的基础拓扑可以是:
1 | Server A DUT Server B |
交换机则让 A 和 B 接在不同端口,并确保流量经过待测转发路径。
测试环境应满足以下条件:
- A、B 的网卡和 CPU 能产生、接收高于 DUT 极限的流量;
- 固定链路速率、MTU、流数量、帧大小、方向和测试时长;
- 同时记录 DUT 与测试机的 CPU、IRQ、丢包计数和网卡统计;
- 分别测试单向、反向和双向流量;
- 使用独立实验网络,避免互联网、共享链路和其他业务流量污染结果。
RFC 6815 明确指出,RFC 2544 的方法用于隔离实验环境,不应直接用于承载用户流量的生产网络。它会主动制造过载,既可能影响业务,也无法在存在外部丢包时得到可靠结果。
第一阶段:用 iperf3 检查基本吞吐
先在 Server B 启动服务端:
1 | iperf3 -s |
在 Server A 测试单条 TCP 流:
1 | iperf3 -c 10.0.1.1 -t 60 |
再逐步增加并发流:
1 | iperf3 -c 10.0.1.1 -P 4 -t 60 |
反向测试:
1 | iperf3 -c 10.0.1.1 -P 8 -t 60 -R |
如果单流只有 5 Gbit/s,八条流可以达到 9.8 Gbit/s,不能直接认定 DUT 的单流转发上限只有 5G。TCP 窗口、RTT、单核 CPU、IRQ、RSS 和网卡队列都可能限制单流结果。
还可以使用 UDP 逐步提高发送速率,观察 Lost/Total Datagrams:
1 | iperf3 -c 10.0.1.1 -u -b 8G -t 60 |
iperf3 适合做基础连通性和 TCP/UDP 吞吐检查,但它不是专业的 PPS 基准测试工具。
第二阶段:用流量发生器测试 PPS
测试不同帧长、精确控制发包速率时,可以使用:
- TRex
- MoonGen
- Linux pktgen
- DPDK pktgen
- Ostinato
按照 RFC 2544 的建议,Ethernet 至少覆盖:
1 | 64、128、256、512、1024、1280、1518B |
对每种帧长逐步提高 offered load,寻找无丢包的最大速率。RFC 2544 对 Throughput 的定义,就是 DUT 收到的测试帧数量与发出的测试帧数量相等时,所能达到的最高速率。最终确认应使用不少于 60 秒的完整测试轮次。
结果不能只写“跑到 10G”,而应记录:
| Frame Size | Offered Load | Throughput | PPS | Loss | Latency | DUT CPU |
|---|---|---|---|---|---|---|
| 64B | 待测 | 待测 | 待测 | 待测 | 待测 | 待测 |
| 128B | 待测 | 待测 | 待测 | 待测 | 待测 | 待测 |
| 256B | 待测 | 待测 | 待测 | 待测 | 待测 | 待测 |
| 512B | 待测 | 待测 | 待测 | 待测 | 待测 | 待测 |
| 1024B | 待测 | 待测 | 待测 | 待测 | 待测 | 待测 |
| 1280B | 待测 | 待测 | 待测 | 待测 | 待测 | 待测 |
| 1518B | 待测 | 待测 | 待测 | 待测 | 待测 | 待测 |
第三阶段:测负载下的时延
空载 ping 只能提供基础 RTT。更有价值的是比较不同负载下的时延:
1 | 空载 → 50% → 90% → 接近最大无丢包吞吐 |
设备可能空载时延只有 0.2 ms,接近满载时却因为队列堆积增长到几十毫秒。此时即使吞吐看起来很高,实时业务体验也会明显下降。
记录时至少应包含:
- 平均时延;
- P50、P95、P99;
- 最大时延;
- 抖动;
- 测量时的 offered load 和帧大小。
有状态设备还要测连接能力
如果 DUT 开启了 NAT、conntrack、防火墙或负载均衡,单纯测试无状态转发不够,还应覆盖:
1 | 并发连接数 |
10GbE stateless routing 与 10GbE NAT + conntrack 的处理成本不同,必须把测试模式、规则数量和功能开关写入报告。
路由器还可以增加不同路由表规模下的数据面测试,并单独观察路由收敛、路由写入 FIB 和 Withdraw 等控制面性能。控制面与 Gbps、PPS 等数据面指标不能混为一谈。
一套可复现的验收矩阵
实验室中可以按以下顺序执行:
- 用
iperf3验证正向、反向 TCP 基础吞吐; - 增加 TCP 并发流,排除单流与单核瓶颈;
- 用 UDP 初步定位出现丢包的负载区间;
- 用 TRex 等流量发生器测试 64~1518B 的 PPS;
- 对每种帧长搜索 0 丢包的最大持续转发速率;
- 在不同负载下记录时延、抖动和丢包;
- 重复正向、反向、双向和多流测试;
- 开启真实使用的 ACL、NAT、conntrack 等功能后重新测试;
- 进行数小时长稳测试,观察 CPU、温度、内存和接口计数;
- 保存拓扑、配置、软件版本、流量模型和原始结果。
最后,报告至少要回答四个问题:
- 哪种帧长、方向和流量模型?
- offered load 是多少,测试持续多久?
- 最大无丢包吞吐和 PPS 分别是多少?
- 瓶颈确实在 DUT,还是在流量发生器、网卡或测试方法?
只有把这些边界写清楚,不同设备、不同版本和不同测试轮次之间的结果才真正可比较。