如何在DPDK 盒子上使用TRex

作者简介:李晓云,Intel 软件工程师,主要从事DPDK PMD的开发工作

文章转载自DPDK与SPDK开源社区

    1. 接线
      使用HDMI线连接盒子与显示器,将其中一个网络端口(下文以ETH0为例)接入有线网,并将电源插入电源接口,将USB外接键盘插入盒子的USB接口。DPDK盒子及接口示意图如图1所示。

  1. 启动登录
    接通电源后,待盒子里的系统启动完毕,输入用户名和密码:
    用户名: test 密码:tester
  2. 登陆后获取根用户权限: sudo bash,这里会提示需要输入密码,密码同上:tester
  3. 安装igb网卡驱动
    a. 使用其他电脑设备将igb 驱动下载保存至USB存储设备,并将其拷贝至盒子[1]。igb驱动下载链接:
    https://sourceforge.net/projects/e1000/files/igb%20stable/5.3.5.15/
    进入页面后下载对应版本的压缩包文件。
    b. 安装:
    tar –xvzf igb-xxxx.tar.gz
    cd /igb-xxxx/src
    make install
  4. 将接入有线网的端口绑到igb驱动上
    a. 查看端口状态信息,如图2所示:
    cd dpdk
    ./usertools/dpdk-devbind.py -s

    图2 端口状态信息(绑定igb_uio驱动)
    b. 绑定igb驱动:
    ./usertools/dpdk-devbind.py -b igb 02:00.0
    从图3可以看到,02:00.0口被绑到了igb上,接口名为eth0

    图3 端口状态信息(绑定igb驱动)

6.为eth0设置动态分配IP地址:
dhclient eth0

7.设置网络代理
export http_proxy=xxx
export https_proxy=xxx

8.从Github上下载 TRex
git clone href="https://github.com/cisco-system-traffic-generator/trex-core.git">https://github.com/cisco-system-traffic-generator/trex-core.git

9.安装TRex必需的库:
yum install zlib-devel
(如果提示由于网络问题yum install 失败, 编辑/etc/yum.conf, 加上一行设置代理: proxy= xxx)

10.不论实际使用1个还是多个端口,TRex需要至少两个端口,因此需要将绑到igb驱动的eth0绑回到原来的igb_uio(内核空间的驱动)上:
cd dpdk
./usertools/dpdk-devbind.py -b igb_uio 02:00.0

11.编辑TRex的配置文件:
vi /etc/trex_cfg.yaml(注意yaml文件的缩进格式)
在/trex-core/scripts/cfg下有一些配置文件示例可供参考。
也可使用TRex中的脚本dpdk_setup_ports.py来创建一个简单的文件,内容如图4所示。具体如何创建配置文件请参考TRex的官方网站[2]。

图4 配置文件示例
12.配置并编译TRex
cd /trex-core/linux_dpdk
./b configure
./b build

13.启动 TRex 服务器端,结果如图5所示:
cd /trex-core/scripts
./t-rex-64 -i -c 2(盒子的两个端口都需要有连接,不然会报错,详细的命令行参数请参考官方网站[2],另hugepage错误参见[3])

图5 启动TRex服务器端结果示意图
14.启动TRex客户端
cd /trex-core/scripts
./trex-console
(由于当前终端被服务器端占有,切换新的终端用来启动TRex客户端:CTRL+ALT+F2,CTRL+ALT+F1可切换回TRex服务器端)
trex> help(帮助命令,显示所支持的命令,如:发包命令start,停止发包stop,图形化显示命令tui)
trex> start -h (对于每条命令,加上-h或—help可以显示具体的帮助信息)
TRex客户端发包示例命令:
trex> start -f stl/bench.py -t size=64,vm=cached —port 0 -m 100%
(如果将ETH0和ETH1用网线互连,则该命令可实现从 port 0发送64 bytes长度的数据包到 port 1,结果如图6和图7所示。具体的参数用法参见start -h,下面给出该示例参数的含义。)
其中,-f表示加载的发包脚本文件,这里指定了文件stl/bench.py;
-t表示发包脚本bench.py可传递的参数,这里指定了数据包长度size=64,Virtual OS模式vm=cached;
-p或 —port表示发包端口,这里指定从0号端口发包;
-m 或 —multiplier表示发包速率,这里指定用线速的100%发包。

图6 TRex启动客户端后客户端结果示意图

图7 TRex启动客户端后服务器端结果示意图
15.编辑自己的发包脚本
步骤14指定发包脚本为bench.py,而用户可以参照示例根据需求编辑自己的发包脚本。scripts/stl目录下包含多种发包脚本示例,各个脚本的具体写法和用法参见
https://github.com/cisco-system-traffic-generator/trex-core/blob/master/doc/trex_stateless.asciidoc
接下来,以stl/udp_1pkt_simple.py为例稍作介绍。

其中register()和get_streams()两个函数是必须定义的。
STLPktBuilder()是构造数据包的函数,会构造出pkt数据包,并以mode模式进行发包。Trex采用scapy构造数据包,因此数据包pkt的构造与scapy一致,通过layer的叠加从而达到构造数据包的目的。scapy构造数据包的具体规则参见:http://scapy.readthedocs.io/en/latest/
STLTXCont()是连续发包模式,可携带参数指定发包速率,默认是10 pps。此外,还有STLTXSingleBurst()和STLTXMultiBurst()两种模式。模式的函数定义在rex库中,如果感兴趣,可以阅读注释了解更详细的内容:scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py

注:
[1] 从外接USB设备拷贝文件:
插入USB设备后,可以使用 dmesg 命令找到设备的路径。
以/dev/sdb1 为例,挂载该设备: mount /dev/sdb1 /mnt
加载后用常规的命令将文件拷贝至任意路径 (cp, mv等)
拷贝完毕后,取消USB设备挂载并拔除: umount /mnt

[2] TRex 官方手册: https://trex-tgn.cisco.com/trex/doc/trex_manual.html#

[3] 如何解决 hugepage相关报错:
在TRex的dpdk-setup_ports.py 脚本中,有hugepage配置函数config_hugepages()
由于盒子本身的空间不够会导致hugepage配置失败,该函数会报错。 可以将 “wanted_count = 2048” 中的数字改小, 如:“wanted_count = 512”, 从而使hugepage配置成功。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/21072.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于18-07-02
0