searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

pktgen-dpdk部署与测试手记

2023-10-08 07:16:36
167
0

前言:

在网络设备开发过程中,性能测试、性能调优需要强大而灵活的发包工具。传统的基于内核的打流工具,例如iperf、netperf等,性能和功能难以满足要求。pktgen-dpdkj基于用户态开发套件DPDK开发,拥有强大的性能和丰富的特性。本文给出一个经过验证的pktgen-dpdk的部署实例,供大家参考。

在下文中,很多组件都带有版本号,笔者保证这样的版本组合是经过验证的。其他版本组合可能需要探索、摸索。如果你需要快速搭建一个可以使用的环境的话,建议直接采用笔者验证过的版本组合。

具体步骤:

1、可以互通的两台虚拟机,虚拟机上部署CentOS-7。 另外,本案用到的dpdk-19.11需要虚拟机CPU支持SSE3指令集,否则会报错。最简单的办法,是配置虚拟机CPU采用直通方式。 例如基于KVM的虚拟机,可以使用如下方式:执行命令virsh edit <vm-name>,将如下配置

<cpu mode='custom' match='exact' check='full'>

<model fallback='forbid'>cpu64-rhel6</model>

<vendor>Intel</vendor>

修改为:

<cpu mode='host-passthrough'>

2、事先准备好如下软件

软件 版本 说明

dpdk

19.11.2

可以从DPDK官网下载。

菜单栏选择DPDK Core,选择Download,下载合适的版本。

libpcap-devel

1.5.3-12

yum install libpcap-devel

lua

5.4.3

注意不要使用yum安装,直接源码编译安装。

numactl-deve

2.0.12-5

yum install numactl-deve

numactl-libs

2.0.12-5

yum install numactl-libs

pktgen-dpdk

19.11.2

可以从Github下载,注意版本号与DPDK版本号一致。

libpcap-devel

1.5.3-12

yum install libpcap-devel

pciutils

 

yum install pciutils

readline-devel

6.2-11

yum install readline-devel

3、编译安装lua-5.4.3: 解压lua-5.4.3.tar.gz,然后进入解压目录执行make、make install。

4、编译安装DPDK

export RTE_SDK=`pwd`
export RTE_TARGET=x86_64-native-linux-gcc
make config T=${RTE_TARGET}
make -j 4 install T=${RTE_TARGET}

5、编译安装pktgen-dpdk

Pktgen-dpdk会根据接口的默认速率值来确定发送的最大带宽。当部署在虚拟机上时,virtio接口的最大带宽被识别为10G。这显然是不合适的(virtio接口速率可能远超10G)。故需要修改源码, 去掉10G带宽限制。具土方法为,在app/pktgen-stats.c文件中,找到rte_eth_link_get_nowait函数,在最后添加这样一行代码:info->link.link_speed = 200000; // 200G

然后执行make命令即可。

6、配置大页内存

双NUMA Node可执行:

echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

单NUMA Node可执行:

echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

注意1024为申请的2M大页的个数。可根据自身情况修改。

7、绑定网卡

执行 ethtool -i <网卡名称> 获取该网卡的PCI地址,形如:0000:00:03.0, 记录备用。使用如下命令将该网卡绑定至igb_uio驱动:

cd <dpdk源码路径>/x86_64-native-linux-gcc/kmod
modprobe uio
insmod igb_uio.ko
ip link set eth0 down
<dpdk源码路径>/usertools/dpdk-devbind.py -b igb_uio <网卡的pci地址>

8、运行pktgen

在pktgen源码目录中找到pktgen可执行文件,然后执行。下面是一个例子:

./pktgen  -c 0x1ffff -n 4 -w 0000:00:03.0 -- -p 0x1 -m [1-16:1-16].0 -T -P

注意-c 0x1ffff是使用core的掩码,-n 4是内存通道数目,-w 0000:00:03.0指定PCI网卡地址,--意思是后面是DPDK EAL参数, -p 0x1 指定端口,-m [1-16:1-16].0用来指定参与收包和发包的Core,-T 表示使用彩色显示,-P将网卡设定成混杂模式。

执行上述命名后,进入pktgen提示符,然后输入打流相关命令:

set 0 size 1400
set 0 type ipv4
set 0 proto udp
set 0 src mac 52:54:00:00:24:6b
set 0 dst mac 52:54:00:9c:7a:53
set 0 src ip 192.168.101.21/24
set 0 dst ip 192.168.100.11
set 0 sport 10000
set 0 dport 10000
enable 0 latency

输入start 0开始打流,最终效果如下:

 

干货(关于时延测试):

有些小伙伴可能注意到,在Pkgten命令提示符中有个enable latency命令,似乎是开启时延测试。你甚至还可以找到一个命令page latency,后者可以切换到时延显示界面。

但是很无奈的是,时延那一栏显示的值总是0。

原因在于,pktgen测试时延的方式,是在数据包中添加一个时间戳,然后发送。接收端需要将这个数据包原路返回,让发送端再次收到这个数据包发送端再次从系统中获取时间,与数据包中的时延对比,计算出数据包的往返时延。

接收端为什么不能直接计算时延呢?原因在于,接收端若想计算时延,需要接收端的时钟和发送端的时钟保持高度一致(精确到1us级别,数据包的时延往往是us级别),这是现在的时间同步手段难以做到的(现在的时间同步手段只能做到ms级别)。

另外,还要注意以下问题:

  1. 测试过程中不能丢包,否则无法测试出精确时延。
  2. 数据包必须有足够的空间容纳时间戳,大约是64字节以上。
  3. 数据包原路返回时,源、目的MAC、IP、Port需要恰好相反或者保持不变,不能随意变化。否则哈希值会发生变化,导致正反数据包不能命中同一个core,从而无法计算时延。
0条评论
0 / 1000
李****一
10文章数
2粉丝数
李****一
10 文章 | 2 粉丝