从版本 2.37 开始,添加了在低端机器(如弱笔记本电脑)上运行 TRex 的功能。
要启用此模式,请在平台配置文件中定义 low_end 参数:
- - version: 2
- interfaces: ['82:00.0', '82:00.1']
- low_end: true 1
- low_end_core: 3 2
- ...
说明:
1:启用低端模式。
2:设置此核心的进程亲和性(默认为 0)
此模式意味着以下内容:
所有 TRex 线程将分配给单核
(默认为 0,可通过 low_end_core 配置)
较低的内存分配/要求。
如果您已经在没有 low_end 参数的情况下启动,请重新启动 Linux 以释放大页面。
在调度程序中休眠而不是忙等待
(不太准确,但可以节省电量)
如果队列已满,请勿重试发送数据包。
配置文件中的“平台”部分被忽略。
我们已经使用以下虚拟机进行了测试:
1个核心
475MB 内存
两个虚拟网卡 E1000
比如无状态IMIX:
- >start -f stl/imix.py -m 100kpps
- Tx bps L2 | 289.67 Mbps | 289.67 Mbps | 579.34 Mbps
- Tx bps L1 | 305.68 Mbps | 305.68 Mbps | 611.36 Mbps
- Tx pps | 100.07 Kpps | 100.07 Kpps | 200.14 Kpps
- Line Util. | 30.57 % | 30.57 % |
- "top" output:
-
- %CPU COMMAND
- 1.0 _t-rex-64
- 0.0 `- eal-intr-thread
- 13.0 `- Trex DP core 1
- 3.0 `- TRex RX
- 0.0 `- Trex Publisher
- 0.0 `- Trex Publisher
- 0.0 `- Trex ZMQ sync
- 0.0 `- Trex Watchdog
- 0.0 `- Trex ZMQ sync
- 0.0 `- Trex ZMQ sync
2. Linux 接口
另一个有趣的低端用例是使用原生 Linux 接口。
(从 2.37 版本开始)
优点:
可以使用任何类型的 NIC(Linux 支持),尤其是没有 PCI 地址的虚拟接口。
不需要大页面。
可以在 Linux 中捕获流量(Wireshark / tcpdump 等)。
启动速度非常快(网卡未初始化)
不需要特殊的内核模块(igb_uio.ko 等)
缺点:
单个 TX/RX 内核,特别是速率将限制在 ~1Mpps。
需要更多的 CPU 利用率。
整体降低 Linux 速度。
平台配置文件示例:
- - port_limit: 2
- version: 2
- interfaces: ['eth2', 'eth3']
- ...
在幕后,它被替换为以下内容(也可以使用这个完整的语法,可能包含另一个 DPDK 参数):
- - port_limit: 2
- version: 2
- interfaces: ['--vdev=net_af_packet0,iface=eth2', '--vdev=net_af_packet1,iface=eth3']
- ...
它包装了共享内存红外环。有四个参数可以将 2 个 memif 互连以进行通信:socket
、id
、role、
secret
Socket、id 和 secret 需要相同(对于连接的 memif 对),角色必须不同。
其中一对需要有角色master
和第二个slave
。
套接字用于交换协议控制消息。(FD.io VPP 中的默认 /run/vpp/memif.sock)Id 必须匹配。每对 memif 都是独一无二的。Secret 是必须匹配的可选字符串(默认为空)。
3.1 memif 环回示例
要将两个 memif 互连到环回中:
- - port_limit: 2
- version: 2
- interfaces: ["--vdev=net_memif0,id=0,role=master",
- "--vdev=net_memif1,id=0,role=slave"]
3.2 memif 互连的 trex 和 FD.io VPP 示例
要将 trex 与两个 VPP memif 接口连接:
- - port_limit: 2
- version: 2
- interfaces: ["--vdev=net_memif0,socket=/run/vpp/memif.sock,role=slave,id=0",
- "--vdev=net_memif1,socket=/run/vpp/memif.sock,role=slave,id=1"]
用于创建相应接口的 VPP CLI 命令:
- vpp# create interface memif id 0 master
- vpp# set interface state memif0/0 up
- vpp# create interface memif id 1 master
- vpp# set interface state memif0/1 up
然后可以通过以下方式验证状态:
vpp# show memif
可以选择 TRex 在交互模式 (STL/ASTF) 中如何响应 ping/ARP 的方法。(从版本 2.43 开始)
有效值:
"legacy" - 默认值,TRex 使用它自己的代码来回答 pings/ARPs。
"linux_based" - ARPs/pings 被重定向到处理它们的 Linux 接口。
Linux 接口驻留在单独的网络命名空间中,以便拥有自己的 ARP 表并且不干扰系统的其余部分。
将来可以扩展到:
支持 Linux 原生支持的其他协议
许多 [数千] 模拟客户端,而 TRex 端口充当连接所有客户端的交换机。
平台配置文件示例:
- - version: 2
- interfaces: ['82:00.0', '82:00.1']
- stack: linux_based
- ...
Stack: | legacy | linux_based |
---|---|---|
L2: | yes | yes |
IPv4: | yes | yes |
IPv6: | no | yes |
VLAN: | yes | yes |
STL: | fully | in service |
ASTF: | fully | fully |
表. 堆栈的特征
linux_based 栈需要服务模式才能在 STL 模式下处理 RX 数据包
配置示例:
控制台:
L2、IPv4、VLAN - 以相同方式配置两个堆栈。
IPv6:
- trex>ipv6 --help
- usage: port [-h] -p PORT (--off | --auto | -s SRC_IPV6)
-
- Configures IPv6 of a port
-
- optional arguments:
- -h, --help show this help message and exit
- -p PORT, --port PORT source port for the action
- --off Disable IPv6 on port.
- --auto Enable IPv6 on port with automatic address.
- -s SRC_IPV6, --src SRC_IPV6
- Enable IPv6 on port with specific address.
API:
虚拟端口可用于解决 2 个问题:
奇数个接口。例如,只有一个接口的 TRex。
相邻接口属于不同 NUMA 时的性能下降。
配置示例:
- ...
- interfaces: ['07:00.0', 'dummy', 'dummy', '8a:00.0']
- ...
错误配置示例:
- ...
- interfaces: ['dummy', 'dummy', 'dummy', '8a:00.0']
- ....
(每对端口应至少有一个非虚拟端口)
自 v2.38+ 起在 TRex 中受支持。
早于 v2.38 的客户端(Python API、trex-console)将无法使用虚拟端口。将您的客户端更新到 v2.38 或更高版本。
虚拟端口可用于所有 TRex 模式(无状态、有状态和 ASTF)。
如果为单个接口 TRex 生成器使用虚拟端口,请考虑以下事项:
配置 | 模式 | 支持状态 | 注释 |
单 TRex 发生器,单接口 | 无状态 | 功能性的 | 单向 |
| 有状态的 | 半功能 | 只会发送流的单向侧 |
| ASTF | 取决于远程 | 需要双向 TCP 栈,如果远程支持 TCP 栈,将工作,否则将不工作 |
两个 TRex 发生器,单一界面 | 无状态 | 功能性的 | 双向 |
| 有状态的 | 半功能 | 将“工作”,但流程不会同步 |
| ASTF | 功能性的 | 完整的 TCP 堆栈 |
它提供了与 Linux 绑定驱动程序类似的功能。模式 4 支持链路聚合 802.3AD。有关详细信息,请参见此处。
配置示例:
- ...
- interfaces: [ '--vdev=net_bonding0,mode=0,slave=d8:00.0,slave=d8:00.1', 'dummy' ]
- ...
绑定设备从第一个从设备继承属性。所有从设备应具有相同的速度和双工。
当使用模式 4 时,可能需要更多的稳定时间。使用 -w 命令行选项为其提供足够的时间。
7. 配置为使用路由器(或其他 L3 设备)作为 DUT 运行
您可以按照此演示文稿获取有关如何将路由器配置为 DUT 的示例。
本指南将帮助您将Cisco ASR1K配置为DUT连接到TRex并以有状态模式运行。
这可以很容易地用于任何L3设备。最后还显示了将Linux配置为DUT的等效命令。
为配置路由器提供了两个选项。基于策略的路由和静态路由。你应该选择一个适合你需要的。
TRex应直接连接到ASR1K端口,并将充当客户端和服务器。
安装描述:
TRex将模拟下图所述的网络(在DUT的每一侧,路由器连接到一个或多个客户端/服务器网络)。
请注意,不支持以下设置(让TRex模拟通过交换机连接到DUT的一组主机)。这意味着“generator”部分中定义的TRex IP地址应位于不同的网络中,而不是port\u info部分中定义的DUT地址和TRex地址。
您可以指定由--cfg命令行参数使用的配置文件,或使用默认的配置文件/etc/trex_cfg.yaml
下面是如何配置TRex IP地址的示例。TRex将在每个端口上为default_gw发出ARP,并为ip发送免费的ARP。从TRex版本2.10开始,这就可以工作了。如果您想手动配置MAC地址(相当于静态ARP),或运行较旧的TRex版本,则在演示文稿的末尾提供了相关信息。配置文件参数的完整说明可在手册中找到。
- - port_limit : 2
- port_info :
- - default_gw : 11.11.11.1 #<1>
- ip : 11.11.11.2 #<2>
- - default_gw : 12.12.12.1 #<3>
- ip : 12.12.12.2 #<4>
说明:
1、TRex端口0配置-应该是路由器的TenG 0/0/0 IP。TRex将尝试通过发送ARP请求来解析此地址。
2、路由器的下一跳TenG 0/0/0。TRex将发送此地址的免费ARP。
3、TRex端口1配置-应为路由器的TenG 0/0/1 IP。TRex将尝试通过发送ARP请求来解析此地址。
4、路由器的下一跳TenG 0/0/0。TRex将发送此地址的免费ARP。
流量配置文件中的TRex仿真服务器/客户端IPs定义
您可以通过使用-f 运行TRex来指定流量配置文件,-f <file name>(TRex有状态模式)。
客户端配置文件的示例位于TREX_ROOT/scripts/cfg目录中。
在流量配置文件中添加以下部分,以定义客户端和服务器的IP范围。
- generator :
- distribution : "seq"
- clients_start : "16.0.0.1"
- clients_end : "16.0.0.255"
- servers_start : "48.0.0.1"
- servers_end : "48.0.0.240"
在此示例中,有:
255个客户端与240个服务器对话
路由器配置. 步骤 1 - 静态路由
- interface TenGigabitEthernet0/0/0
- ip address 11.11.11.1 255.255.255.0
- !
- `
- interface TenGigabitEthernet0/0/1
- ip address 12.12.12.1 255.255.255.0
- !
- ip route 16.0.0.0 255.0.0.0 11.11.11.2 <1>
- ip route 48.0.0.0 255.0.0.0 12.12.12.2 <2>
说明:
1、将客户端网络路由到TRex服务器仿真接口。
2、将服务器网络路由到TRex客户端仿真接口。
路由器配置. 步骤 2 - PBR
路由器配置为静态路由数据包,从0/0/0到0/0/1,从0/0/1到0/0/0。
路由器配置:
- interface TenGigabitEthernet0/0/0
- ip address 11.11.11.1 255.255.255.0 <1>
- ip policy route-map p1_to_p2 <2>
- load-interval 30
- !
-
- interface TenGigabitEthernet0/0/1
- ip address 12.12.12.1 255.255.255.0 <1>
- ip policy route-map p2_to_p1 <2>
- load-interval 30
- !
说明:
1、配置端口的ip地址。
2、配置PBR策略-请参考如下
- route-map p1_to_p2 permit 10
- set ip next-hop 12.12.12.2 <1>
- !
- route-map p2_to_p1 permit 10
- set ip next-hop 11.11.11.2 <2>
说明:
1、在TenG 0/0/1子网中,将目标设置为12.12.12.2。
2、将目标设置为11.11.11.2,子网中设置为TenG 0/0/0。
验证电缆连接
要验证TRex端口0是否真的连接到路由器0/0/0,可以运行以下操作。
$./t-rex-64 -f cap2/dns.yaml -m 1 -d 10 -l 1000 --lo --lm 1
它仅从TRex端口0(-lm 1)发送数据包
要仅从TRex端口1发送,请执行以下操作:
$./t-rex-64 -f cap2/dns.yaml -m 1 -d 10 -l 1000 --lo --lm 2
如果连接到交换机,则必须先从两个方向发送数据包几秒钟,以便交换机了解双方的MAC地址。
$./t-rex-64 -f cap2/dns.yaml -m 1 -d 10 -l 1000
基于MAC的配置
如果您使用的TRex版本早于2.10,或者希望使用基于MAC的配置,则TRex配置文件必须包含以下内容(而不是“ip”和“default_gw”)。
- - port_limit : 2
- port_info : # set eh mac addr
- - dest_mac : [0x0,0x0,0x0,0x1,0x0,0x0]
- src_mac : [0x0,0x0,0x0,0x2,0x0,0x0]
- - dest_mac : [0x0,0x0,0x0,0x3,0x0,0x0]
- src_mac : [0x0,0x0,0x0,0x4,0x0,0x0]
注意:
1、应该是路由器的TenG 0/0/0 mac地址。
2、路由器应配置为发送到此mac地址。
3、应该是路由器的TenG 0/0/1 mac地址。
4、路由器应配置为发送到此mac地址。
在路由器端,您必须添加以下静态ARP配置。
- arp 11.11.11.2 0000.0002.0000 ARPA #<1>
- arp 12.12.12.2 0000.0004.0000 ARPA #<2>
说明:
1、TRex端口0源mac地址。
2、TRex端口1源mac地址。
Linux配置
假设Linux的设置与DUT相同,而不是路由器,则可以执行以下操作。
将Linux接口的IP配置为12.12.12.1和11.11.11.1
- route add -net 48.0.0.0 netmask 255.0.0.0 gw 12.12.12.2
- route add -net 16.0.0.0 netmask 255.0.0.0 gw 11.11.11.2
如果您有基于MAC的TRex配置,还应添加:
- arp -s 11.11.11.2 00:00:00:02:00:00 #<1>
- arp -s 12.12.12.2 00:00:00:04:00:00 #<2>
说明:
1、TRex端口0源mac地址。
2、TRex端口1源mac地址。
静态路由配置-IPV6
- interface TenGigabitEthernet1/0/0
- ip address 11.11.11.1 255.255.255.0
- ip policy route-map p1_to_p2
- load-interval 30
- ipv6 enable #<1>
- ipv6 address 2001:DB8:1111:2222::1/64 #<2>
- ipv6 policy route-map ipv6_p1_to_p2 #<3>
- !
-
-
- ipv6 unicast-routing #<4>
-
- ipv6 neighbor 3001::2 TenGigabitEthernet0/1/0 0000.0002.0002 #<5>
- ipv6 neighbor 2001::2 TenGigabitEthernet0/0/0 0000.0003.0002
-
- route-map ipv6_p1_to_p2 permit 10 #<6>
- set ipv6 next-hop 2001::2
- !
- route-map ipv6_p2_to_p1 permit 10
- set ipv6 next-hop 3001::2
- !
-
-
- csi-mcp-asr1k-40(config)#ipv6 route 4000::/64 2001::2
- csi-mcp-asr1k-40(config)#ipv6 route 5000::/64 3001::2
说明:
1、启用ipv6
2、添加ipv6地址
3、添加pbr
4、启用ipv6路由
5、Mac地址设置应类似于TRex
6、PBR配置