新闻  |   论坛  |   博客  |   在线研讨会
【工具】Trex使用教程
电子禅石 | 2024-09-03 14:01:24    阅读:560   发布文章

简介

TRex 是一种高性能的网络流量生成工具,它通过创新和可扩展的软件实现,

利用标准和开放的软件以及x86/UCS硬件,解决了传统商业状态感知流量生成器的问题。

TRex 的关键特点包括:


生成和分析L4-7流量:TRex 能够模拟传输层到应用层的流量,为网络性能测试提供全面的解决方案。

一体化商业L7工具能力:在一个软件包中集成了商业级L7工具的功能,提供成本效益高的测试解决方案。

基于预处理和智能重放的状态流量生成器:使用真实流量模板进行预处理和智能重放,以生成状态流量。

生成和放大客户端和服务器端流量:能够同时生成和放大客户端请求和服务器响应流量,模拟真实的网络交互。

可定制的功能:用户可以根据需要添加自定义功能,以适应特定的测试需求。

扩展性强:能够扩展到200Gb/sec的速率,适用于单个UCS系统(使用Intel 40Gb/sec NICs)。

低成本:与商业流量生成器相比,TRex 提供了成本效益更高的选择。

易于安装和部署:作为一个自包含的软件包,TRex 可以轻松地安装和部署在多种环境中。

支持虚拟接口:TRex 支持在完全虚拟化的环境中使用,无需物理 NICs。

这使得 TRex 可以在多种虚拟化场景下使用。

使用示例:


Amazon AWS:在云环境中使用 TRex 进行网络性能测试。

Cisco LaaS:作为服务的一部分,使用 TRex 来提供网络测试能力。

TRex on your laptop:在个人笔记本电脑上部署 TRex,进行本地网络性能测试和学习。

TRex 的灵活性和高性能使其成为网络工程师和研究人员在进行网络性能测试和分析时的

理想选择。通过模拟复杂的网络流量,TRex 帮助用户发现潜在的性能瓶颈和安全问题,优化网络设计和配置。下面来介绍一下 TRex 的安装与使用。


下载安装

获取 TRex 最新版本安装包


wget --no-cache https://trex-tgn.cisco.com/trex/release/latest

获取 TRex 指定版本安装包


wget --no-cache https://trex-tgn.cisco.com/trex/release/vX.XX.tar.gz

版本号查询 TRex发布文档


安装包解压:tar -xzvf latest 或 tar -xzvf vX.XX.tar.gz


进入解压后的目录,对几个主要文件夹做一个说明:


├─astf

├─automation

├─avl

├─bird

├─cap2

├─cfg             // TRex 提供的配置文件示例

├─emu

├─exp

├─external_libs  // 引用的外部库

├─generated

├─ko

├─so

├─stl            // 使用Python Scapy 库构造各类报文的示例

├─trex_emu

└─x710_ddp

首次运行步骤

确认使用的网卡信息

TRex 是一款 Linux 应用程序,与 Linux 内核模块交互。它使用 DPDK(无需作为库安装 DPDK)。

TRex 应该能够在任何商用现货 (COTS) x86 服务器上运行。运行 TRex 的另一种选择是使用内核接口

以原始套接字模式运行,适用于低性能和低占用需求(由于内核限制,大约限制在 1MPPs)。

本文涉及的内容是基于 CentOS 进行描述的,收发包网卡使用DPDK驱动接管的方式

(无需手动绑定,TRex 运行会自动执行绑定)。


进入安装包所在目录,执行 sudo ./dpdk_setup_ports.py -s 查看网卡信息,执行完会看到类似如下信息:


[bash]>sudo ./dpdk_setup_ports.py -s


 Network devices using DPDK-compatible driver

 ============================================


 Network devices using kernel driver

 ===================================

 0000:03:00.0 '82599ES 10-Gigabit SFI/SFP+ Network Connection' drv= unused=ixgb #1

 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

 0000:02:00.0 '82545EM Gigabit Ethernet Controller (Copper)' if=eth2 drv=e1000 unused=igb_uio *Active* #2


 Other network devices

 =====================

 <none>

查看DPDK支持的网卡类型:官网链接


配置文件修改

默认配置文件路径:/etc/trex-cfg.yaml,有两种方式生成配置文件。


TRex提供了配置文件的demo,在此基础上进行修改,示例存放路径:cfg/ ,以 simple_cfg.yaml 文件为例,对各配置参数进行说明。

- port_limit      : 2

  version         : 2

#List of interfaces. Change to suit your setup. Use ./dpdk_setup_ports.py -s to see available options

  interfaces    : ["03:00.0","03:00.1"]

  port_info       :

            # Either default_gw or dest_mac is mandatory

          - ip         : 1.1.1.1    # port 0 src_ip

            default_gw : 2.2.2.2    # dst_ip

          - ip         : 2.2.2.2    # port 1

            default_gw : 1.1.1.1


          - dest_mac   : '00:00:00:01:00:00'  # port 0

            src_mac    : '00:00:00:02:00:00'

          - dest_mac   : '00:00:00:03:00:00'  # port 1

            src_mac    : '00:00:00:04:00:00'

port_limit:端口数量,必须等于 interfaces 中列出的接口数量

version:必须设置为2

interfaces:要使用的接口列表。运行 sudo ./dpdk_setup_ports.py -s 来查看可选列表

port_info:端口信息。TRex 需要知道每个端口对应的目的 MAC 地址,可以通过两种方式指定:

直接指定 dest_mac

指定 default_gw,TRex 将向此 IP 发出 ARP 请求,并使用结果作为目的 MAC

使用 dpdk_setup_ports.py 脚本生成,脚本提供了交互模式来生成配置文件,命令:sudo ./dpdk_setup_ports.py -i,根据提示信息选择要使用的网卡,生成的配置文件如下所示:

### Config file generated by dpdk_setup_ports.py ###


- version: 2

  interfaces: ['03:00.0', '03:00.1']

  port_info:

      - dest_mac: 00:bb:12:34:56:02 # MAC OF LOOPBACK TO IT'S DUAL INTERFACE

        src_mac:  00:bb:12:34:56:01

      - dest_mac: 00:bb:12:34:56:01 # MAC OF LOOPBACK TO IT'S DUAL INTERFACE

        src_mac:  00:bb:12:34:56:02


  platform:

      master_thread_id: 0                             #1

      latency_thread_id: 1                            #2

      dual_if:                                        

        - socket: 0                                   #3

          threads: [2,3,4,5,6]                        #4

master_thread_id:控制线程使用的 CPU 核

latency_thread_id:收包线程使用的 CPU 核

dual_if:定义了接口对的信息(依据interfaces列表中的顺序)。每个部分,从- socket开始,为不同的接口对指定配置。

socket:为接口对分配使用的内存的 NUMA 节点

threads:发包线程使用的 CPU 核列表,列表里所有的 CPU 要归属于socket指定的 NUMA 节点

查看 CPU 信息的命令:lscpu,可查看有几个NUMA节点,各NUMA节点上有哪些 CPU。


# 两个 NUMA节点,cpu 0-31 属于 NUMA node0,cpu 32-63 属于 NUMA node1

[root] lscpu

......

NUMA node0 CPU(s):   0-31

NUMA node1 CPU(s):   32-63

......


NUMA架构简单来说就是,系统有多个CPU处理器,每个处理器有自己的独立内存,CPU访问自己的内存,速度会更快,所以上述配置中,指定的CPU要归属于同一个NUMA节点。


运行

TRex 支持两种运行模式:stateful 和 stateless,可简单理解为,stateless 支持基本的 L2/L3 层测试,没有保存流中间状态的情况(如tcp流)。Stateful 模式的基础是由多个报文组成的流。Stateless 理解与使用起来比较简单,下文主要说明这种模式的运行。


stateless 模式(命令执行均在解压后的 TRex 安装包目录下)

把 TRex 作为 server 启动


[bash]>sudo ./t-rex-64 -i -c 4

#配置文件中指定的发包核个数是固定的,可以通过 -c 参数来指定实际使用几个核,若不指定,则使用全部


等server完全运行起来后,在本机另外打开一个终端,通过 trex-console 连接到 TRex,进入到 console 界面后,就可以通过各种命令进行发包测试了。


Stateless 模式下的发包主要使用 python scapy 库来构造报文的,基础报文构造脚本示例位于目录 stl/ 下。发包命令:


# 指定 port 0 发送 udp 报文,发包速率为 10kbps

trex> start -f stl/udp_1pkt_simple.py -p 0 -m 10kbps


# 指定 port 1 发送 udp 报文,发包速率为 10Mbps

trex> start -f stl/udp_1pkt_simple_1.py -p 1 -m 10Mbps


-p :指定发包网卡,不指定则使用配置文件指定的所有网卡

-f:构造发包的脚本路径及文件名

-m MULT:发包速率,指定格式:[number][<empty> | bps | kbps | mbps | gbps | pps | kpps | mpps | %],%代表占网卡带宽的百分比,即10Gbps的网卡,-m 10% 则代表1Gbps。

发包过程中可通过命令来更新发包速率


#更新所有网卡发包速率

update -m <参数>


#更新指定网卡发包速率

update -p <port_id> -m <参数>


其他常用命令:


# pause the traffic on all port

>pause -a                                                              


# resume the traffic on all port

>resume -a                                                             


# stop traffic on all port

>stop -a                                                              


查看实时统计信息


>tui

Global Statistics


Connection  : localhost, Port 4501

Version     : v3.04, UUID: N/A

Cpu Util    : 0.2%

            :

Total Tx L2 : 40.01 Mb/sec

Total Tx L1 : 52.51 Mb/sec

Total Rx    : 40.01 Mb/sec

Total Pps   : 78.14 Kpkt/sec

            :

Drop Rate   : 0.00 b/sec

Queue Full  : 0 pkts


Port Statistics


   port    |         0          |         1          |

 --------------------------------------------------------

 owner      |             hhaim |             hhaim |

 state      |            ACTIVE |            ACTIVE |

 --         |                   |                   |

 Tx bps L2  |        10.00 Mbps |        10.00 Mbps |

 Tx bps L1  |        13.13 Mbps |        13.13 Mbps |

 Tx pps     |        19.54 Kpps |        19.54 Kpps |

 Line Util. |            0.13 % |            0.13 % |

 ---        |                   |                   |

 Rx bps     |        10.00 Mbps |        10.00 Mbps |

 Rx pps     |        19.54 Kpps |        19.54 Kpps |

 ----       |                   |                   |

 opackets   |           1725794 |           1725794 |

 ipackets   |           1725794 |           1725794 |

 obytes     |         110450816 |         110450816 |

 ibytes     |         110450816 |         110450816 |

 tx-bytes   |         110.45 MB |         110.45 MB |

 rx-bytes   |         110.45 MB |         110.45 MB |

 tx-pkts    |        1.73 Mpkts |        1.73 Mpkts |

 rx-pkts    |        1.73 Mpkts |        1.73 Mpkts |

 -----      |                   |                   |

 oerrors    |                 0 |                 0 |

 ierrors    |                 0 |                 0 |


 status:  /


 browse:     'q' - quit, 'g' - dashboard, '0-3' - port display

 dashboard:  'p' - pause, 'c' - clear, '-' - low 5%, '+' - up 5%,

stateless GUI

TRex 提供了图形化界面工具,可以安装在 Windows 机器上,远程连接到 TRex 所在的 Linux 机器上,图形化界面上查看实时收发包流量统计,更为直观。

下载地址:https://github.com/cisco-system-traffic-generator/trex-stateless-gui


TRex 仿真

TRex 提供了仿真工具,可执行py脚本(使用scapy构造报文的脚本),然后以抓包格式输出,可用来验证构造的报文是否符合预期


./stl-sim -f stl/udp_1pkt_simple.py -o udp_test.pcap -l 500

1

-l :生成的报文个数,默认是5000

-o:若不指定绝对路径,生成的抓包文件位于当前目录

TRex 抓包

Service mode 下可以抓包,在console界面输入service就进入了service mode,抓包命令:


trex(service)> capture record start --rx port_id[ port_id ...]

1

--rx:抓收到的报文

--tx:抓发出的报文

若不指定 rx tx,收发的报文都抓

可指定抓某个port或某几个port的报文,不指定则全部port

举例说明:


trex(service)>capture record start --rx 0 1


Starting packet capturing up to 1000 packets                 [SUCCESS]


*** Capturing ID is set to '19' ***

*** Please call 'capture record stop --id 19 -o <out.pcap>' when done ***


根据开始抓包后界面回显的提示,停止抓包


*** Capturing ID is set to '19' ***

*** Please call 'capture record stop --id 19 -o <out.pcap>' when done ***


trex(service)> capture record stop --id 19 -o <out.pcap>


注:-o 指定保存抓包文件的路径,应使用绝对路径


TRex arp 学习

TRex 可自动获取对端 mac,cfg yaml文件内若指定的是IP,即default_gw,可指示 TRex 学习对端mac。以下命令均在service mode下执行。


打开混杂模式(确保网卡可以收到广播包)

trex(service)> portattr --prom on

1

使用arp命令使 TRex 主动发 arp 请求,获取对端 mac

trex(service)> arp -p port_id[port_id port_id...] -r <cnt>

1

-p 指定port

-r 指定重复次数

举例:


trex(service)>arp -p 0 1 -r 3


Resolving destination on port(s) [0, 1]:                     [SUCCESS]


Port 0 - Recieved ARP reply from: 49.0.0.3, hw: 50:7c:6f:14:67:79

Port 1 - Recieved ARP reply from: 48.0.0.2, hw: 50:7c:6f:14:67:78


285.42 [ms]


关闭service mode

service --off

————————————————


                        

原文链接:https://blog.csdn.net/Wendy1226/article/details/133211803


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
属于自己的技术积累分享,成为嵌入式系统研发高手。
推荐文章
最近访客