TRex,一个基于DPDK的数据包发生器,测试仪

1. introduction

  TRex是cisco基于Intel dpdk开发的软件程序。推荐在CentOS/RHEL 7.6, 64bits中运行,否则connectx-4网卡不可使用。

笔者在Ubuntu16.04中Intel-XL710网卡测试也成功。

  使用中高端服务器和最新的Intel网卡,TRex的发包性能可达到200Gbps,使用某些类型的网卡还支持基于硬件的每流统计量汇报(Intel-XL710 支持255条独立流)。

2. installation

mkdir -p /opt/trex

cd /opt/trex

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

tar -xzvf latest

  至此就结束了安装,解压出来都是可执行文件。

  另外,需要配置网卡设置:

sudo ./dpdk_setup_ports.py -s
# 查看网络接口配置

  设置配置文件,例如:给DPDK驱动使用:

cp  cfg/simple_cfg.yaml /etc/trex_cfg.yaml
#拷贝例子到默认配置文件路径

  根据接口情况手动修改配置文件:

sudo vim /etc/trex_cfg.yaml
<none>
- port_limit      : 2
  version         : 2
interfaces    : ["03:00.0", "03:00.1"]  #需要对此进行手动调整,填写网口pcie编号
port_info       :  
          - ip         : 1.1.1.1
            default_gw : 2.2.2.2
          - ip         : 2.2.2.2
            default_gw : 1.1.1.1

 

3. 配置多流流量

    sudo vim /opt/trex/v2.61/stl/simple_3pkt.py

def create_stream (self):

        # create a base packet and pad it to size
        size = self.fsize - 4 # no FCS
        base_pkt =  Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=12,sport=1025)       1
        base_pkt1 =  Ether()/IP(src="16.0.0.2",dst="48.0.0.1")/UDP(dport=12,sport=1025)
        base_pkt2 =  Ether()/IP(src="16.0.0.3",dst="48.0.0.1")/UDP(dport=12,sport=1025)
        pad = max(0, size - len(base_pkt)) * 'x'


        return STLProfile( [ STLStream( isg = 0.0,
                                        packet = STLPktBuilder(pkt = base_pkt/pad),
                                        mode = STLTXCont( pps = 10),                         2
                                        ),

                             STLStream( isg = 25000.0, #defined in usec, 25 msec
                                        packet  = STLPktBuilder(pkt = base_pkt1/pad),
                                        mode    = STLTXCont( pps = 20),                      3
                                        ),

                             STLStream(  isg = 50000.0,#defined in usec, 50 msec
                                         packet = STLPktBuilder(pkt = base_pkt2/pad),
                                         mode    = STLTXCont( pps = 40)                      4

                                        )
                            ]).get_streams()

  可分别对三种流量包头配置(IP),速度配置(PPS),启动时间配置(isg)。

4. 启动TRex,测试双网口网卡回环。

  将光线两端分别接入网卡的两个口。

  打开命令行终端,并开启TRex服务端程序:

sudo ./t-rex-64 -i 
# t-rex-64 是可执行文件,在安装目录中

  打开另外一个命令行终端,开启TRex客户端程序:

trex-console  

  在客户端程序中开启流量发送:

start -f stl/simple_3pkt.py -a

  常用操作:

pause -a 
#暂停所有发送

tui
#流量统计信息

  另外一个比较有用的操作是可以根据流量配置文件生成对应的pcap文件,在流量发送之前,

通过视察pcap文件,我们可以测试配置脚本是否正确:

sudo ./stl-sim -f stl/udp_1pkt_range_clients_splita.py -o flow1a64Byte60000.pcap -l 60000
#-o 输出文件名 -l 总包数

5. 启动硬件每流测量

  编写流量配置文件,其中需要设置流ID(pg_id = 7),以及打开统计功能(flow_stats) ,stl/4flow_stats.py:

from trex_stl_lib.api import *

class STLS1(object):

    def __init__ (self):
        self.fsize  =128; # the size of the packet


    def create_stream (self):

        # Create base packet and pad it to size
        size = self.fsize - 4; # HW will add 4 bytes ethernet FCS
        base_pkt =  Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=12,sport=1025)
        base_pkt1 =  Ether()/IP(src="16.0.0.2",dst="48.0.0.1")/UDP(dport=12,sport=1025)
        base_pkt2 =  Ether()/IP(src="16.0.0.3",dst="48.0.0.1")/UDP(dport=12,sport=1025)
        base_pkt3 =  Ether()/IP(src="16.0.0.4",dst="48.0.0.1")/UDP(dport=12,sport=1025)
        pad = max(0, size - len(base_pkt)) * 'x'


        return STLProfile( [ STLStream( isg = 1.0, # start in delay in usec
                                        packet = STLPktBuilder(pkt = base_pkt/pad),
                                        mode = STLTXCont( pps = 27500),
                                        flow_stats = STLFlowStats(pg_id = 7),
                                        ),

                             STLStream( isg = 2.0,
                                        packet  = STLPktBuilder(pkt = base_pkt1/pad),
                                        mode    = STLTXCont( pps = 27500),
                                        flow_stats = STLFlowStats(pg_id = 12),
                                        ),

                             STLStream(  isg = 3.0,
                                         packet = STLPktBuilder(pkt = base_pkt2/pad),
                                         mode    = STLTXCont( pps = 27500),
                                         flow_stats = STLFlowStats(pg_id = 15),

                                        ),
                             STLStream( isg = 4.0,
                                        packet = STLPktBuilder(pkt = base_pkt3/pad),
                                        mode    = STLTXCont( pps =27500),
                                        flow_stats = STLFlowStats(pg_id = 17),

                                        )
                            ]).get_streams()


    def get_streams (self, direction = 0, **kwargs):
        # create 1 stream
        return self.create_stream()


# dynamic load - used for trex console or simulator
def register():
    return STLS1()

  开始流量:

start -f stl/4flow_stats.py -a

  打开监控:

tui

  打开每流显示:

#对于版本不同可能采用不同方式, v2.6的打开方式如下:
# 先按下esc
# 再按下x,启动每流监控

 

posted @ 2019-10-02 17:11  熊猫滚滚  阅读(8909)  评论(1编辑  收藏  举报