单台设备如何模拟测试数据转发性能

本文最后更新于:2026年5月2日 下午

有时候想做快速转发性能优化,奈何本地只有一台电脑,怎么模拟测试性能好做对比呢?
本文基于linux的网络命名空间来做设备模拟,使用pktgen模块来测试转发pps。

1. 整体拓扑设计(单机模拟三台机器)

在一台 Ubuntu 上模拟:
client(ns1) –> router(ns2) –> server(ns3)
用 veth 连接:
ns1 <–> ns2 <–> ns3

整体模拟的拓扑效果图如下:


2. 创建网络环境

2.1. 创建 namespace

1
2
3
ip netns add ns1  
ip netns add ns2
ip netns add ns3

2.2. 创建 veth 对

1
2
ip link add veth1 type veth peer name veth1-peer  
ip link add veth2 type veth peer name veth2-peer

2.3. 分配到 namespace

1
2
3
4
5
ip link set veth1 netns ns1  
ip link set veth1-peer netns ns2

ip link set veth2 netns ns2
ip link set veth2-peer netns ns3

2.4. 配 IP

ns1

1
2
3
ip netns exec ns1 ip addr add 10.0.1.1/24 dev veth1  
ip netns exec ns1 ip link set veth1 up
ip netns exec ns1 ip route add default via 10.0.1.254

ns2(路由器)

1
2
3
4
ip netns exec ns2 ip addr add 10.0.1.254/24 dev veth1-peer  
ip netns exec ns2 ip addr add 10.0.2.254/24 dev veth2
ip netns exec ns2 ip link set veth1-peer up
ip netns exec ns2 ip link set veth2 up

ns3

1
2
3
ip netns exec ns3 ip addr add 10.0.2.1/24 dev veth2-peer  
ip netns exec ns3 ip link set veth2-peer up
ip netns exec ns3 ip route add default via 10.0.2.254

2.5. ns2上打开转发

1
ip netns exec ns2 sysctl -w net.ipv4.ip_forward=1

3. 验证连通性

1
ip netns exec ns1 ping 10.0.2.1

通了说明你的“转发路径”已经建立。


4. pktgen测试性能

pktgen是内核自带的发包器,内核线程里面直接发包。
iperf3这种是应用层发包,进程本身可能存在消耗和瓶颈,不适合测试内核的转发极限性能,所以pktgen非常适合这种测试。

4.1. 加载pktgen

1
modprobe pktgen

4.2. pktgen配置

pktgen挂载之后,通过/proc/net/pktgen/下的文件来进行配置和控制,内核源码中封装了一些简单的脚本来方便用户使用。脚本在内核目录的samples/pktgen
我们下面使用内核源码下的pktgen_sample01_simple.sh脚本来简要配置进行发包

4.2.1. 前置条件

因为pktgen发包有一个必要参数为目的mac,所以要查看虚拟接口的mac地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# ip netns exec ns2 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
6: veth1-peer@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 2a:cd:06:e5:5c:79 brd ff:ff:ff:ff:ff:ff link-netns ns1
inet 10.0.1.254/24 scope global veth1-peer
valid_lft forever preferred_lft forever
inet6 fe80::28cd:6ff:fee5:5c79/64 scope link
valid_lft forever preferred_lft forever
9: veth2@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 02:72:db:4c:af:08 brd ff:ff:ff:ff:ff:ff link-netns ns3
inet 10.0.2.254/24 scope global veth2
valid_lft forever preferred_lft forever
inet6 fe80::72:dbff:fe4c:af08/64 scope link
valid_lft forever preferred_lft forever

4.3. 测试

先打开性能监控

1
ip netns exec ns2 sar -n DEV 1

4.3.1. ns1发往ns2

1
ip netns exec ns1 ./pktgen_sample01_simple.sh -i veth1 -s 64 -n 0 -d 10.0.1.254 -m 2a:cd:06:e5:5c:79

-i 为ns1上的发送接口
-s 为包大小
-n 为发包个数,0表示无限个
-d 目的地址
-m 目的mac

看到的接收pps为41w

1
2
3
4
183827秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
183828秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
183828秒 veth1-peer 414358.00 1.00 25897.38 0.09 0.00 0.00 0.00 2.12
183828秒 veth2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

4.3.2. ns1发往ns3

1
ip netns exec ns1 ./pktgen_sample01_simple.sh -i veth1 -s 64 -n 0 -d 10.0.2.1 -m 2a:cd:06:e5:5c:79

注意:这里需要ns2转发,所以,mac地址依然填写ns2的veth1-peer接口

看到的ns2的接收发送pps为28w

1
2
3
4
184050秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
184051秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
184051秒 veth1-peer 283040.00 1.00 17690.00 0.09 0.00 0.00 0.00 1.45
184051秒 veth2 1.00 283039.00 0.09 17689.94 0.00 0.00 0.00 1.45

5. 总结

这是针对veth虚拟网卡做的测试,转发路径只走了linux内核协议栈这块儿,而真实的网卡还有驱动这块路径,需要注意区别。


人生苦短,远离bug Leon, 2026-04-01

单台设备如何模拟测试数据转发性能
https://leon0625.github.io/2026/04/01/5219218f2761/
作者
leon.liu
发布于
2026年4月1日
许可协议