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,启动每流监控