跳转至

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

1
2
3
- port_limit    : 2    # 必填, 表示端口数目, 和下面的interfaces一致.
  version       : 2    # 必填
  interfaces    : ['eth3', 'eth4']   # 网口的PCIE号,或者网卡的名称, 

4、启动服务

nohup t-rex-64 -i --prefix test1 --hdrh --cfg /root/trex_cfg.yaml&

服务端启动命令

1
2
3
4
5
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 地址的虚拟接口
指定接口时可以直接使用名称

1
2
3
  - port_limit: 2
    version: 2
    interfaces: ['eth2', 'eth3']

确定 接口 在内核下和在dpdk下的关系

./dpdk_setup_ports.py -s

发包机器比较差

修改 /etc/trex_cfg.yaml 文件

1
2
3
  - version: 2
    interfaces: ['82:00.0', '82:00.1']
    low_end: true

PIC查询

官方手册

https://trex-tgn.cisco.com/trex/doc/