前言:
在网络设备开发过程中,性能测试、性能调优需要强大而灵活的发包工具。传统的基于内核的打流工具,例如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级别)。
另外,还要注意以下问题:
- 测试过程中不能丢包,否则无法测试出精确时延。
- 数据包必须有足够的空间容纳时间戳,大约是64字节以上。
- 数据包原路返回时,源、目的MAC、IP、Port需要恰好相反或者保持不变,不能随意变化。否则哈希值会发生变化,导致正反数据包不能命中同一个core,从而无法计算时延。