TRex 命令行参数与配置文件
TRex 命令通常包括以下主要参数,但只是-f必需的。
[bash]>sudo ./t-rex-64 -f <traffic_yaml> -m <multiplier> -d <duration> -l <latency test rate> -c <cores>
--active-flows
一个实验性的开关,用于扩大或缩小活动流的数量。由于流调度程序的量化,它不准确,并且在某些情况下不起作用。示例:--active-flows 500000 会将活动流的范围设置为 ~0.5M。
--allow-coredump
允许创建核心转储。
--arp-refresh-period <num>
为我们的地址发送免费 ARP 之间的时间间隔(以秒为单位)。值 0 表示“从不发送”。
--astf
从 2.29 版开始。
指定高级状态模式的标志。在这种情况下,-f 参数应该是 Python ASTF 配置文件。目前作为批处理,WIP 添加交互式支持。
-c <num>
每个接口对使用的硬件线程数。对于 TRex 40Gbs,至少使用 4 个。
TRex 使用 2 个线程来满足内部需求。可以使用其余线程。这里的最大数,可以是空闲线程数除以接口对数。
对于 VM 上的虚拟 NIC,我们始终为每个接口对使用一个线程。
--cfg <file name>
要使用的 TRex 配置文件。有关所有配置文件选项,请参阅相关手册部分。
--checksum-offload-disable
使用 DPDK 启用 IP、TCP 和 UDP tx 校验和卸载。这需要所有使用的接口都支持这一点。
--client_cfg <file>
描述客户端配置的 YAML 文件。在这里查看详细信息。
-d <num>
测试持续时间(以秒为单位)。
-e
同-p,但根据端口更改 src/dst IP。使用它,您将从同一端口获得相同流的所有数据包,并具有相同的 src/dst IP。
它不适用于 NBAR,因为它希望所有客户端 ip 都从同一方向发送。
-f <yaml file>
指定要使用的流量 YAML 配置文件。有状态模式的强制选项。
--hops <num>
在设置中提供跳数(默认为一跳)。仅在启用 Rx 检查时相关。在这里查看详细信息。
-i
指定交互模式的标志。目前用于无状态(WIP 添加高级有状态)
--iom <mode>
输入/输出模式。可能的值:0(静音)、1(正常)、2(短)。
--ipv6
将模板转换为 IPv6 模式。
-k <num>
在开始测试之前运行“预热”流量 num 秒。如果 TRex 连接到交换机运行的生成树,则需要这样做。您希望交换机在开始发送真实数据之前查看来自所有相关源 MAC 地址的流量。仅适用于延迟测试(-l 选项)。发送的流量与延迟测试使用的流量相同。
当前限制(适用于 TRex 版本 1.82):在 VM 上无法正常工作。
-l <rate>
在测试的同时,运行延迟检查,从每个接口以每秒速率发送数据包。
--learn-mode <mode>
学习动态 NAT 转换。在这里查看详细信息。
--learn-verify
用于测试 NAT 学习机制。像 DUT 进行 NAT 一样进行学习,但要验证数据包实际上没有改变。
--limit-ports <port num>
限制使用的端口数。覆盖配置文件中的“port_limit”。
--lm <hex bit mask>
指定哪些端口将发送流量的掩码。例如,0x1 - 只有端口 0 会发送。0x4 - 只有端口 2 会发送。这可用于验证端口连接性。您可以从一个端口发送数据包,并查看 DUT 上的计数器。
--lo
仅延迟 - 仅发送延迟数据包。不要从模板/pcap 文件发送数据包。
-m <num>
率乘数。TRex 将每个模板的 CPS 率乘以 num。
--nc
如果设置,将在指定持续时间结束时终止。这提供了更快、更准确的 TRex 终止。默认情况下(没有此选项),TRex 等待所有流正常终止。如果流程很长,终止可能会延长。
--no-flow-control-change
从 2.21 版开始。
防止 TRex 更改流控制。默认情况下(没有此选项),TRex 在启动时禁用所有卡的流量控制,英特尔 XL710 40G 卡除外。
--no-hw-flow-stat
仅与 Intel x710 无状态模式相关。不要将硬件计数器用于流量统计。
启用此功能将支持较低的流量速率,但也会报告 RX 字节计数统计信息。
--no-key
守护程序模式,不要从键盘获取输入。
--no-watchdog
禁用看门狗。
-p
从同一方向发送同一流的所有数据包。对于每个流,TRex 将在客户端端口和服务器端口之间随机选择,并从该端口发送所有数据包。src/dst IP 保持它们的值,就好像从两个端口发送数据包一样。意思是,我们从客户端到服务器以及从服务器到客户端都使用相同的端口数据包。
如果您将其与路由器一起使用,则不能中继路由规则以将流量传递到 TRex,您必须配置基于策略的路由以将所有流量从一个 DUT 端口传递到另一个端口。
-pm <num>
平台因素。如果设置包括分离器,您可以将 TRex 显示的所有统计数字乘以该因子,以便它们与 DUT 计数器匹配。
-pubd
禁用 ZMQ 监视器的发布者。
--queue-drop
从 2.37 版开始。
不要在失败时重试发送数据包(队列已满等)。
--rx-check <sample rate>
启用 Rx 检查模块。使用它,每个线程随机采样 1/sample_rate 的流,并检查采样流的数据包顺序、延迟和其他统计信息。注意:此功能适用于 RX 线程。
--sleeps
从 2.37 版开始。
在调度程序中使用睡眠而不是忙等待(不太准确,更省电)
--software
从 2.21 版开始。
不要配置任何硬件规则。在此模式下,所有 RX 数据包都将由软件处理。将不使用硬件辅助来丢弃(计数时)数据包。此模式适用于启用每个流统计和 延迟等功能,支持数据包类型,HW 流导向器规则不支持(例如 QinQ)。
您还可以使用此模式在显示为受 TRex 支持的接口上运行 TRex,但实际上支持较少的硬件功能。例如,DPDK e1000_igb 驱动程序支持的网卡,但与 i350 具有不同的硬件功能。
这样做的缺点是因为软件必须处理所有接收到的数据包,所以 RX 流的总速率要低得多。直到v2.49(不包括),此模式也仅限于使用一个 TX 内核(和往常一样使用一个 RX 内核)。现在它为 RX 和 TX 使用多队列,主要用于虚拟接口的规模。
-v <verbosity level>
显示调试信息。值 1 显示启动时的调试信息。值为 3,在某些情况下显示运行期间的调试信息。可能会减慢运行速度。
--vlan
仅与 Intel 82599 10G NIC 的无状态模式相关。在为每个流规则配置流统计和延迟时,假设所有流都使用 VLAN。
-w <num seconds>
在 NIC 初始化和发送流量之间等待额外的时间。如果 DUT 需要额外的设置时间,可能会很有用。默认值为 1 秒。
TRex 命令行示例
简单 HTTP 1Gb/秒 100 秒
[bash]>sudo ./t-rex-64 -f cap2/simple_http.yaml -c 4 -m 100 -d 100
简单 HTTP 1Gb/秒,延迟 100 秒
[bash]>sudo ./t-rex-64 -f cap2/simple_http.yaml -c 4 -m 100 -d 100 -l 1000
SFR 35Gb/秒流量
[bash]>sudo ./t-rex-64 -f avl/sfr_delay_10_1g.yaml -c 4 -m 35 -d 100 -p
SFR 20Gb/秒流量,有延迟
[bash]>sudo ./t-rex-64 -f avl/sfr_delay_10_1g.yaml -c 4 -m 20 -d 100 -l 1000
具有延迟的 SFR ipv6 20Gb/秒流量
[bash]>sudo ./t-rex-64 -f avl/sfr_delay_10_1g_no_bundeling.yaml -c 4 -m 20 -d 100 -l 1000 --ipv6
支持 NAT 转换的简单 HTTP 1Gb/秒
[bash]>sudo ./t-rex-64 -f cap2/simple_http.yaml -c 4 -m 100 -d 100 -l 1000 --learn-mode 1
IMIX 1G/秒 ,1600 流量
[bash]>sudo ./t-rex-64 -f cap2/imix_fast_1g.yaml -c 4 -m 1 -d 100 -l 1000
IMIX 1Gb/秒,100K 流
[bash]>sudo ./t-rex-64 -f cap2/imix_fast_1g_100k.yaml -c 4 -m 1 -d 100 -l 1000
64 字节 ~1Gb/秒,1600 个流
[bash]>sudo ./t-rex-64 -f cap2/imix_64.yaml -c 4 -m 1 -d 100 -l 1000
| 姓名 | 描述 |
|---|---|
| cap2/dns.yaml | 简单的 dns pcap 文件 |
| cap2/http_simple.yaml | 简单的http cap文件 |
| avl/sfr_delay_10_1g_no_bundeling.yaml | 从 Avalanche 捕获 sfr 流量配置文件 - Spirent 不支持 RTT=10 毫秒(延迟机器)的捆绑支持,这可以与 --ipv6 和 --learn-mode 一起使用 |
| avl/sfr_delay_10_1g.yaml | 从 Avalanche 捕获的头端 sfr 流量配置文件 - Spirent 具有 RTT=10 毫秒(延迟机器)的捆绑支持,对于 m=1,它被标准化为 1Gb/秒 |
| avl/sfr_branch_profile_delay_10.yaml | 从 Avalanche 捕获分支 sfr 配置文件 - Spirent 具有 RTT=10 毫秒的捆绑支持,对于 m=1,标准化为 1Gb/秒 |
| cap2/imix_fast_1g.yaml | 具有 1600 个流的 imix 配置文件归一化为 1Gb/秒。 |
| cap2/imix_fast_1g_100k_flows.yaml | 将 100k 流标准化为 1Gb/秒的 imix 配置文件。 |
| cap2/imix_64.yaml | 64字节UDP数据包配置文件 |
全局流量 YAML 部分
- - duration : 10.0 1
- generator : 2
- distribution : "seq"
- clients_start : "16.0.0.1" 8
- clients_end : "16.0.0.255"
- servers_start : "48.0.0.1"
- servers_end : "48.0.0.255"
- clients_per_gb : 201 9
- min_clients : 101 10
- dual_port_mask : "1.0.0.0"
- tcp_aging : 1 11
- udp_aging : 1 12
- cap_ipg : true 3
- cap_ipg_min : 30 4
- cap_override_ipg : 200 5
- vlan : { enable : 1 , vlan0 : 100 , vlan1 : 200 } 6
- mac_override_by_ip : true 7
说明:
1、测试持续时间(秒)。可以使用-d选项覆盖。
2、在此处 查看有关生成器部分的完整说明。
3、true(默认值)表示 IPG 取自 cap 文件(如果存在,还考虑 cap_ipg_min 和 cap_override_ipg)。false 表示 IPG 取自每个模板部分。
4、以下两个选项可以以微秒为单位设置最小 ipg:(if (pkt_ipg<cap_ipg_min) { pkt_ipg=cap_override_ipg} )
5、要覆盖的值(微秒),如上所述。
6、启用负载平衡功能。有关信息,请参阅trex 负载平衡部分。
7、启用基于 IP 的 MAC 地址替换。完整的解释。
8、见元组生成器
9、已弃用。不曾用过
10、已弃用。不曾用过
11、以秒为单位的时间来延迟 TCP 流的重新分配(特别是将 src_port 返回到池中)。适用于套接字利用率非常高 (>50%) 并且需要验证套接字源端口未包装和重用的情况。默认值为零。从性能的角度来看,最好保持这种状态。高价值可能会造成性能损失
12、与 UDP 流的 #11 相同
定时器轮部分配置
(从 v2.13 开始)流调度器使用计时器轮来调度流。要针对大量流进行调整,可以更改默认值。这是一个高级配置;如果您不知道自己在做什么,请不要使用它。它可以在全局trex_cfg.yaml文件和每个trex 流量配置文件中进行配置。
- tw :
- buckets : 1024 1
- levels : 3 2
- bucket_time_usec : 20.0 3
说明:
1、每个级别中的存储桶数量,更高的数量会提高性能,但会降低最大级别。
2、多少级。
3、usec 中的存储桶时间。更高的数字将产生更多的爆发。
每个模板部分
- - name: cap2/dns.pcap 1
- cps : 10.0 2
- ipg : 10000 3
- rtt : 10000 4
- w : 1 5
- server_addr : "48.0.0.7" 6
- one_app_server : true 7
- multi_flow_enabled: true 8
- flows_dirs: [0, 1] 9
- keep_src_port: true 10
- ip_header_offset: 50 11
- max_ip_tunnels: 1000 12
说明:
1、模板 pcap 文件的名称。可以是 t-rex-64 图像目录的相对路径,也可以是绝对路径。pcap 文件应该只包含一个流。(例外:在插件的情况下)。
2、每秒连接数。这是从命令行指定 -m 1 时将使用的值(给 -mx 将乘以这个
3、如果 YAML 文件的全局部分包含cap_ipg : false,则此行设置包间间隔(以微秒为单位)。
4、应设置为与 ipg(微秒)相同的值。
5、默认值:w=1。这向 IP 生成器指示如何生成流。如果 w=2,将在一次突发中生成来自同一模板的两个流(对于具有突发流的 HTTP 更多)。
6、如果one_app_server设置为 true,则此模板的所有流将使用同一服务器。
7、如果需要相同的服务器地址,请将此值设置为 true。(默认为假)
8、版本 v2.62 中的新功能。设置后,允许模板中存在多个流。需要配置 flow_dirs 以指定每个流的方向。
注意:来自池的 IP 值以及源端口对于 pcap 中的所有流都是相同的。
9、版本 v2.62 中的新功能。设置流向。如果设置为 0,则无效。如果设置为 1,服务器将使用原始目标端口向客户端发起流(及其 IP)。
注意:不适用于--learn 模式。
10、v2.66 版中的新功能。保留来自 pcap 的原始 TCP/UDP 源端口。
11、新客户端 IP 标头偏移量(以字节为单位)。当捕获中存在多个 IP 标头(例如隧道流量)时很有用。覆盖解析找到的第一个 IP 标头的默认行为。
12、新建 如果模板中存在 IP 隧道,它会配置最大隧道数。通过将外部 IP 递增 (inner src IP % max_ip_tunnels) 来调整外部 IP。
YAML 格式的配置文件配置 TRex 行为,包括:
每个端口(源和目标)的 IP 地址或 MAC 地址。
屏蔽接口,以确保 TRex 不会尝试将管理端口用作流量端口。
更改 zmq/telnet TCP 端口。
您可以通过将 --cfg <file name> 添加到命令行参数来指定要使用的配置文件。
如果没有给出 --cfg,/etc/trex_cfg.yaml则使用默认值。
配置文件示例可以在$TREX_ROOT/scripts/cfg文件夹中找到。
基本配置
- - port_limit : 2 #mandatory 1
- version : 2 #mandatory 2
- interfaces : ['03:00.0', '03:00.1'] #mandatory 3
- #dpdk_devargs : ['txq_inline_min=1','txq_inline_max=700'] # optional devargs 20
- #ext_dpdk_opt: ['--vdev=net_vdev_netvsc0,iface=eth1', '--vdev=net_vdev_netvsc1,iface=eth2'] # ask DPDK for failsafe # 18
- #interfaces_vdevs : ['net_failsafe_vsc0','net_failsafe_vsc1'] # use failsafe # 19
- #enable_zmq_pub : true # optional 4
- #zmq_pub_port : 4500 # optional 5
- #zmq_rpc_port : 4501 # optional 16
- #prefix : setup1 # optional 6
- #limit_memory : 1024 # optional 7
- #rx_desc : 1024 # optional 17
- #tx_desc : 1024 # optional 17
- c : 4 # optional 8
- port_bandwidth_gb : 10 # optional 9
- services_core : 0 # optional 10
- port_info : # set eh mac addr mandatory
- - default_gw : 1.1.1.1 # port 0 11
- dest_mac : '00:00:00:01:00:00' # Either default_gw or dest_mac is mandatory 11
- src_mac : '00:00:00:02:00:00' # optional 12
- ip : 2.2.2.2 # optional 13
- vlan : 15 # optional 14
- - dest_mac : '00:00:00:03:00:00' # port 1
- src_mac : '00:00:00:04:00:00'
- - dest_mac : '00:00:00:05:00:00' # port 2
- src_mac : '00:00:00:06:00:00'
- - dest_mac : [0x0,0x0,0x0,0x7,0x0,0x01] # port 3 15
- src_mac : [0x0,0x0,0x0,0x8,0x0,0x02]
说明:
1、端口数。应等于 3 中列出的接口数量。 - 强制
2、必须设置为 2。 - 强制
3、要使用的接口列表。运行sudo ./dpdk_setup_ports.py --show以查看您可以选择的列表。- 强制的。在某些情况下,一个 PCI 可以有多个端口(例如 MLX4 驱动程序),为此您可以使用 dd:dd.d/d 格式,例如 03:00.0/1,表示此设备的第二个端口。列表的顺序很重要,首先是虚拟端口 0。
4、为统计数据启用 ZMQ 发布者,默认为 true。
5、ZMQ 端口号。默认值是好的。如果在同一台机器上运行两个 TRex 实例,则应为每个实例指定不同的编号。否则,可以删除此行。
6、如果在同一台机器上运行两个 TRex 实例,则应为每个实例指定不同的名称。否则,可以删除此行。(作为 --file-prefix arg 传递给 DPDK)
7、限制使用的数据包内存量。(作为 -m arg 传递给 dpdk)
8、TRex 将使用每个接口对的线程数(核心数)(可以通过 -c 命令行选项覆盖)
9、每个接口的带宽,以 Gbs 为单位。在本例中,我们有 10Gbs 接口。对于 VM,放 1。用于调整 TRex 分配的内存量。
10、在(Scapy、PyBird 和 Emu)上运行服务的核心。如果没有给出并且启用了low_end,它将使用low_end_core,如果没有给出,它将使用0。当“low_end”未启用时,它将使用master_thread_id,如果未提供所有内容,它将使用核心0。
11、TRex 需要知道要在每个端口上使用的目标 MAC 地址。您可以通过以下两种方式之一指定它:
直接指定 dest_mac。
指定 default_gw(从 2.10 版开始)。在这种情况下(仅当没有给出 dest_mac 时),TRex 将向该 IP 发出 ARP 请求,并将结果用作 dest MAC。如果没有给出 dest_mac,也没有收到 ARP 响应,TRex 将退出。
12、从该接口发送数据包时使用的源 MAC。如果未给出(自 2.10 版起),将使用端口的 MAC 地址。
13、如果给定(自 2.10 版起),TRex 将为适当端口上的 ip + src MAC 对发出免费 ARP。在有状态模式下,每个 ip 的免费 ARP 将每 120 秒发送一次(可以使用 --arp-refresh-period 参数更改)。
14、如果给定(自 2.18 版起),端口上的所有流量都将使用此 VLAN 标记发送。
15、旧的 MAC 地址格式。从 v2.09 版本开始支持新格式。
16、无状态 ZMQ RPC 端口号。默认值是好的。如果在同一台机器上运行两个 TRex 实例,则应为每个实例指定不同的编号。否则,可以删除此行。
17、覆盖 Rx/TX dpdk 驱动程序描述符的默认数量。为了在虚拟接口上获得更好的性能,最好将这些数字扩大到 Rx=4096
18、高级 DPDK 选项,由 Azure/failsafe 驱动程序使用
19、在故障安全的情况下选择正确的驱动程序
20、指定为 devargs 的 DPDK 驱动程序选项
如果您使用早于 2.10 的版本,或者选择省略“ip”并具有基于 mac 的配置,请注意 TRex 不会发送任何免费 ARP 并且不会响应 ARP 请求。在这种情况下,您必须配置指向 DUT 上的 TRex 端口的静态 ARP 条目。对于示例配置,您可以查看 此处。
具有虚拟接口的设置(SR-IOV/VMXNET3/virtio)默认情况下,每个队列只有 512 个 ex 描述符,最好将其放大以用于多 rx 队列/高性能设置
要找出可以使用哪些接口(NIC 端口),请执行以下操作:
- [bash]>>sudo ./dpdk_setup_ports.py --show
-
- Network devices using DPDK-compatible driver
- ============================================
-
- Network devices using kernel driver
- ===================================
- 0000:02:00.0 '82545EM Gigabit Ethernet Controller' if=eth2 drv=e1000 unused=igb_uio *Active* #1
- 0000:03:00.0 '82599ES 10-Gigabit SFI/SFP+ Network Connection' drv= unused=ixgb #2
- 0000:03:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection' drv= unused=ixgb
- 0000:13:00.0 '82599ES 10-Gigabit SFI/SFP+ Network Connection' drv= unused=ixgb
- 0000:13:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection' drv= unused=ixgb
-
- Other network devices
- =====================
- <none>
说明:
1、我们看到 02:00.0 处于活动状态(我们的管理端口)。
2、可以使用所有其他 NIC 端口(03:00.0、03:00.1、13:00.0、13:00.1)。
最低配置文件为:
- <none>
- - port_limit : 4
- version : 2
- interfaces : ["03:00.0","03:00.1","13:00.1","13:00.0"]
内存段配置
内存部分是可选的。当需要调整 TRex 数据包管理器使用的内存量时使用它。默认值(来自 TRex 源代码)通常适合大多数用户。除非您有一些不寻常的需求,否则您可以消除此部分。
- - port_limit : 2
- version : 2
- interfaces : ["03:00.0","03:00.1"]
- memory : 1
- mbuf_64 : 16380 2
- mbuf_128 : 8190
- mbuf_256 : 8190
- mbuf_512 : 8190
- mbuf_1024 : 8190
- mbuf_2048 : 4096
- traffic_mbuf_64 : 16380 3
- traffic_mbuf_128 : 8190
- traffic_mbuf_256 : 8190
- traffic_mbuf_512 : 8190
- traffic_mbuf_1024 : 8190
- traffic_mbuf_2048 : 4096
- dp_flows : 1048576 4
- global_flows : 10240 5
说明:
1、内存段头
2、每个端口对为传输中的数据包分配的内存缓冲区数。数字是按数据包大小指定的。
3、分配用于保存每个模板保持不变的数据包部分的内存缓冲区的数量。仅当您有大量模板时,您才应在此处增加数字。
4、分配的 TRex 流对象的数量(为了获得最佳性能,它们是预先分配的,而不是动态分配的)。如果您期望的并发流比默认值 (1048576) 多,请放大它。
5、编号对象 TRex 分配用于保持 NAT“传输中”连接。在有状态模式下,TRex 通过查看 DUT 对每个流的第一个数据包所做的地址更改来学习 NAT 转换。因此,这些是 TRex 为其发送第一个流数据包但尚未学习转换的流的数量。同样,这里的默认值(10240)应该很好。仅当您使用 NAT 并发现问题时才增加。
平台部分配置
平台部分是可选的。它用于调整性能并将内核分配给正确的 NUMA 配置文件现在具有以下结构以支持多实例
- - version : 2
- interfaces : ["03:00.0","03:00.1"]
- port_limit : 2
- ....
- platform : 1
- master_thread_id : 0 2
- latency_thread_id : 5 3
- dual_if : 4
- - socket : 0 5
- threads : [1,2,3,4] 6
说明:
1、平台部分标题。
2、控制线程的硬件 thread_id。
3、RX 线程的硬件 thread_id。
4、“dual_if”部分定义接口对的信息(根据“接口”列表中的顺序)。每个以“-socket”开头的部分定义了不同接口对的信息。
5、将从中分配内存以供接口对使用的 NUMA 节点。
6、用于为接口对发送数据包的硬件线程。线程固定在内核上,因此指定线程实际上决定了硬件内核。
我们在主板上连接了 2 个彼此靠近的 Intel XL710 NIC。他们共享相同的 NUMA:

CPU 利用率非常高~100%,c=2 和 c=4 结果是一样的。
然后,我们将卡片移动到不同的 NUMA:

+ 我们在 /etc/trex_cfg.yaml 中添加了配置:
- platform :
- master_thread_id : 0
- latency_thread_id : 8
- dual_if :
- - socket : 0
- threads : [1, 2, 3, 4, 5, 6, 7]
- - socket : 1
- threads : [9, 10, 11, 12, 13, 14, 15]
这给出了最好的结果:在~98 Gb/s TX BW 和 c=7 的情况下,CPU 利用率变为~21%!(40%,c=4)