Trex
Cisco Trex是一种高性能的流量生成器,可以用于网络设备的测试、性能评估、负载测试等场景。它是由Cisco公司开发的一款开源软件,可运行于常见的服务器和云平台上。
支持多种协议的流量生成,包括以太网、VLAN、IPv4、IPv6、TCP、UDP等。用户可以使用Python脚本编写测试场景,指定流量类型、流量速率、流量数量等参数,生成符合要求的流量并向目标设备发送。
支持多种测试模式,包括线速模式、普通模式、模拟模式等,可以模拟不同的网络环境和设备特性。此外,它还支持实时统计和展示流量生成和接收的情况,帮助用户全面了解网络设备的性能和瓶颈。
trex工具支持2种模式.
1、无状态模式, 类似于IXIA发包仪, 可以构造报文然后按指定速率发送.无状态模式可以使用trex提供的GUI界面工具, 该工具可以通过界面来配置和编辑报文会方便一些.
https://github.com/cisco-system-traffic-generator/trex-stateless-gui.git
2、有状态模式, 有状态测试又分为2种模式.
基于报文pcap以及模板配置的测试. 相当于trex以提供的pcap文件为基础, 进行IP和端口的修改, 这样可以形成多条流. 通过提供多个pcap文件, 那么就可以发送混合流量.
ASTF模式, 为更高级的有状态模式, 需要编写python脚本.
安装server
环境推荐 centos7 or ubuntu22.04
步骤:
1、下载修改好的二进制包
https://github.com/kaozb/tools/releases/download/v1-trex/trex-server.tar.gz
2、解压
| tar -zxvf trex-server.tar.gz && cd trex-server
|
3、创建示例配置文件
vi /root/trex_cfg.yaml
| - port_limit : 2 # 必填, 表示端口数目, 和下面的interfaces一致.
version : 2 # 必填
interfaces : ['eth3', 'eth4'] # 网口的PCIE号,或者网卡的名称,
|
4、启动服务
| nohup t-rex-64 -i --prefix test1 --hdrh --cfg /root/trex_cfg.yaml&
|
服务端启动命令
| nohup t-rex-64 -i --prefix test1 --hdrh --cfg /root/trex_cfg.yaml&
不同类型网卡可以启动多个
nohup t-rex-64 -i --prefix test1 --hdrh --cfg /root/trex_cfg.yaml&
nohup t-rex-64 -i --prefix test2 --hdrh --cfg /root/trex_cfg2.yaml&
|
参数说明
| 参数 |
作用 |
| -c |
每个接口对使用的CPU核数. |
| –cfg |
trex配置文件, 默认为/etc/trex_cfg.yaml |
| -d |
测试时长, 单位为秒. |
| -f |
指明流量配置文件. |
| –ipv6 |
将模板转换为IPv6模式 |
| -l |
表示在测试基础上同时进行延迟测试, rate表示延迟测试时每秒发送报文数. |
| –lo |
仅进行延迟测试, 不发送模板文件里面的报文. |
| -v |
日志等级, 数字越大日志越多, 可能影响性能. |
| -m < num> |
每个流量模板的cps会乘以该数, 得到最终的cps值. 因此参数用于提高并发会话数. |
控制运行
两种,一种是通过windows GUI 来操控,不再赘述
GUI 下载 https://github.com/cisco-system-traffic-generator/trex-stateless-gui/releases
第二种CLI形式,效果如下
一个简单的例子 SFR 35Gb/sec traffic
./t-rex-64 -f avl/sfr_delay_10_1g.yaml -c 4 -m 20 -d 100 -l 1000
更多例子以及说明
https://trex-tgn.cisco.com/trex/doc/trex_manual.html#_trex_command_line_examples
运行过程中字段解释
| 字段 |
说明 |
| stats enabled Total-Tx |
总发送速率Mbps |
| stats table opackets |
发送报文总数 |
| obytes |
发包报文总字节数 |
| ipackets |
接收报文总数 |
| ibytes |
接收报文总字节数 |
| ierrors |
接收错误报文数 |
| oerrors |
发送错误报文数 |
| Tx Bw |
发送速率 |
| Total-Rx |
总接收速率Mbps |
| Total PPS |
当前发送的pps. |
| active-flows |
TRex当前的活跃会话数. 这个值和前面的Total-CPS不同. 原因不清楚. |
| open-flows |
启动后, TRex创建的所有会话总数, 包含已删除的. |
| drop-rate |
丢包率. “前面已描述, trex是接入交换机,直接转发的, 因此一般不会有丢包. |
windows client
下载指定版本
https://github.com/kaozb/tools/releases/download/v1-trex/trex-stateless-gui-v4.5.6.exe
如java报错 使用后面的jdk jdk-20_windows-x64_bin.exe
效果图

配置文件trex_cfg.yaml
配置只有 前三行必填 interfaces 中如果没有dpdk驱动或者不支持dpdk ,可以直接使用网卡名称
如 interfaces : [‘eth0’, ‘eth1’]
| - port_limit : 2 # 必填, 表示端口数目, 和下面的interfaces一致.
version : 2 # 必填
interfaces : ['03:00.0', '03:00.1'] # 网口的PCIE号, 如果不是DPDK方式, 也可以直接填系统里面的网口名称.
#dpdk_devargs : ['txq_inline_min=1','txq_inline_max=700'] # dpdk的设备配置参数.
#enable_zmq_pub : true # 可选参数, 配置是否开启发布zmq, 默认开启.
#zmq_pub_port : 4500 # 可选参数, 配置zmq的publisher的端口. 一般用于单系统里面运行多个trex的情况.
#zmq_rpc_port : 4501 # 可选参数, 配置zmq的rpc端口,一般用于单系统里面运行多个trex的情况.
#prefix : setup1 # 可选参数, 这个就是dpdk的执行参数, --file-prefix. 用于运行多个trex.
#limit_memory : 1024 # 可选参数, 是DPDK的执行参数, -m
#rx_desc : 1024 # 可选参数, 配置网口的收包描述符个数.
#tx_desc : 1024 # 可选参数, 配置网口的发包描述符个数.
c : 4 # 可选参数, 配置每对网口使用的CPU核数.
port_bandwidth_gb : 10 # 可选参数, 设置每个网口的带宽大小.
port_info : # 设置端口信息. 每个端口对应到前面interfaces里面一个网口.
- default_gw : 1.1.1.1 # 网关的IP地址.
dest_mac : '00:00:00:01:00:00' # 对端网口的MAC地址. 如果没有配置, 那么会使用default_gw来学习.
src_mac : '00:00:00:02:00:00' # 可选参数, 如果没有配置, 就使用网口的MAC.
ip : 2.2.2.2 # 可选参数, IP配置, 配置后, trex会发送免费ARP报文.
vlan : 15 # 可选参数, 用于设置报文vlan.
- dest_mac : [0x0,0x0,0x0,0x7,0x0,0x01] # 端口1的配置, 这里是另外一种MAC地址的配置格式.
src_mac : [0x0,0x0,0x0,0x8,0x0,0x02]
memory : # 可选参数, 内存使用相关配置
mbuf_64 : 16380 # 可选参数, 配置每种长度的报文使用的mbuf的数目.
mbuf_128 : 8190
mbuf_256 : 8190
mbuf_512 : 8190
mbuf_1024 : 8190
mbuf_2048 : 4096
traffic_mbuf_64 : 16380
# 可选参数, 配置流量模板使用的报文缓存. 一般用于模板pcap较多的情况. 该缓存里面的报文不会修改.
traffic_mbuf_128 : 8190
traffic_mbuf_256 : 8190
traffic_mbuf_512 : 8190
traffic_mbuf_1024 : 8190
traffic_mbuf_2048 : 4096
dp_flows : 1048576 # 可选参数, 预分配流的数目. 默认为1048576.
global_flows : 10240 # 可选参数, 也是预分配使用, 与NAT功能相关. 一般不用配置.
platform : # 可选配置
master_thread_id : 0 # 可选参数, 控制线程的CPU核
latency_thread_id : 5 # 可选参数, 延迟功能的线程
dual_if : # 可选参数, 每个网口对有一个配置
- socket : 0 # 配置第一个网口对内存分配使用的NUMA节点
threads : [1,2,3,4] # 配置该网口对发包使用的CPU核.
|
流量模板参数说明
整个流量模板有几个关键参数: pcap文件, cps, ipg, w, limit. 下面来描述这几个参数的作用.
trex在流量发送时, 首先选择一个三元组(源IP, 目的IP, 源端口), 然后将pcap文件里面的报文基于该三元组进行修改, 修改后发送pcap里面的报文.
cps: 表示1秒内, 会选择的三元组个数, 因为三元组不同, 那么就是一条新的流, 因此cps表示该模板的每秒新建会话数.
ipg: 在发送pcap文件里面的报文时, 2个报文之间的时间间隔, 单位是微秒, 一般配置为10000, 即10ms.
w: w配置用于调整三元组选择策略, 如果w等于3, 第一次选择三元组后, 后面两次选择三元组时, 源IP和目的IP不变, 源端口变化. 因此还是三条不同的流, 只不过IP会固定.
limit: limit表示限制会话数, 如果limit配置为3, 那么就会有3条流, 这3条流会重复发送. 这个时候cps就等价于pps. 使用limit的方式, 可以模拟stateless模式.
duration 表示测试时间, 即整个测试需要多少时间. 这个值可以通过trex命令行的-d参数指定.
配置文件
| - duration : 10.0 # 配置测试时间, 可以使用trex命令的-d参数进行设置.
generator : # 用于配置IP地址的生成方式.
distribution : "seq" # 生成IP地址的方式, 目前只有2个值, seq和random.
clients_start : "16.0.0.1" # 客户端IP的起始地址.
clients_end : "16.0.0.255" # 客户端IP的结束地址
servers_start : "48.0.0.1" # 服务端IP的起始地址.
servers_end : "48.0.0.255" # 服务端IP的结束地址.
tcp_aging : 1 # TCP流老化时间, 一般不用配置
udp_aging : 1 # UDP流老化时间, 一般不用配置
cap_ipg : true # 表示是否使用pcap文件里面的报文时间间隔. 如果是false, 那么会使用下面模板里面的ipg配置. 建议打开.
cap_ipg_min : 30 # 如果cap_ipg为true, 那么这个参数和下面的参数用于设置最小的ipg, if (pkg_ipg < cap_ipg_min) pkg_ipg = cap_override_ipg
cap_override_ipg : 200
cap_info : # 模板配置, 可以配置多个.
- name: cap2/dns.pcap # 配置当前模板使用的pcap文件路径.
cps : 10.0 # 配置每秒的会话数.
ipg : 10000 # 配置模板的ipg,如果前面设置了cap_ipg为true, 那么这个值就没有作用.
rtt : 10000 # 需要和ipg值一样.
w : 1 # 一般为1.
limit: 10 # 表示限制会话数为10
one_app_server : true # 表示只有一个服务端.
server_addr : "48.0.0.7" # 如果one_app_server为true, 那么设置服务端的IP地址.
multi_flow_enabled: true # 如果配置为true, 那么允许单个模板里面有多条流.
flows_dirs: [0, 1] # 在multi_flow_enabled开启后, flows_dirs用于配置每个流的方向. 如果设置为1, 那么表示服务端首先发起流量的报文.
keep_src_port: true # 设置为true, 那么原端口使用pcap文件里面的端口.
ip_header_offset: 50 # 设置IP头偏移, 一般用于隧道报文的情况,这时如果需要修改隧道内层的IP, 那么使用这个配置指定隧道内层IP头偏移.
max_ip_tunnels: 1000 # 针对隧道报文, 用于设置隧道数目.
|
多实例启动配置示例
cfg1.yaml
| - version: 2
interfaces: ['01:00.0', '01:00.1', '01:00.2', '01:00.3']
zmq_pub_port : 4500
zmq_rpc_port : 4501
port_info:
- ip: 1.1.1.1
default_gw: 2.2.2.2
- ip: 2.2.2.2
default_gw: 1.1.1.1
- ip: 3.3.3.3
default_gw: 4.4.4.4
- ip: 4.4.4.4
default_gw: 3.3.3.3
platform:
master_thread_id: 0
latency_thread_id: 1
dual_if:
- socket: 0
threads: [2,3]
- socket: 0
threads: [4,5]
|
cfg2.yaml
| - version: 2
interfaces: ['04:00.0', '04:00.1']
zmq_pub_port : 4600
zmq_rpc_port : 4601
port_info:
- ip: 1.1.1.1
default_gw: 2.2.2.2
- ip: 2.2.2.2
default_gw: 1.1.1.1
platform:
master_thread_id: 6
latency_thread_id: 7
dual_if:
- socket: 0
threads: [20,21,22,23]
|
启动
启动后就可以使用 windowGUI 登录控制 服务器
| nohup t-rex-64 -i --prefix test1 --hdrh --cfg /root/cfg.yaml&
nohup t-rex-64 -i --prefix test2 --hdrh --cfg /root/cfg2.yaml&
|
FAQ
只有一张网卡
当有些小伙伴只想使用一张网卡(或者网卡数目是奇数)进行流量发送时
可以使用 dummy 来作为虚拟的接口。需要注意的是(每对端口应至少有一个非虚拟端口)
| interfaces: ['07:00.0', 'dummy', 'dummy', '8a:00.0']
|
直接使用本机Linux接口
优点:可以使用任何 NIC 类型(Linux 支持),特别是没有 PCI 地址的虚拟接口
指定接口时可以直接使用名称
| - port_limit: 2
version: 2
interfaces: ['eth2', 'eth3']
|
确定 接口 在内核下和在dpdk下的关系
发包机器比较差
修改 /etc/trex_cfg.yaml 文件
| - version: 2
interfaces: ['82:00.0', '82:00.1']
low_end: true
|
PIC查询

官方手册
https://trex-tgn.cisco.com/trex/doc/