DPDK 配置和优化指南
针对 Ampere Altra 系列处理器
DPDK是数据平面开发工具包,它由一些库组成,可以加速在各种CPU架构上运行的数据包处理工作负载。可以运行在x86、POWER和ARM处理器上,并在开源BSD许可证下获得许可。
Pktgen-DPDK是一个由DPDK驱动的流量生成器。
本指南是为想要了解如何构建DPDK并使用Ampere® Altra®处理器设置测试环境的应用程序架构师和构建工程师编写的。
硬件的配置如下所示。
Packet Generator:
DUT:
分组发生器和DUT使用100G网线背靠背连接。
针对相应操作系统,从Mellanox的网站[1]下载Mellanox网卡的MLNX_OFED。然后,使用此命令安装MLNX_OFED。如果系统中丢失了一些包,会有提示,可能需要重新启动。
./mlnxofedinstall --add-kernel-support --upstream-libs --dpdk --skip-repo
安装构建DPDK所需的其他软件包。
sudo yum install python3 meson ninja-build python3-pyelftools numactl-devel -y
安装构建Pktgen-DPDK所需的软件包。
sudo yum install libpcap-devel -y
从DPDK网站https://fast.dpdk.org/rel/下载DPDK源代码,然后使用以下命令进行构建。
wget https://fast.dpdk.org/rel/dpdk-23.03.tar.gz tar zxf dpdk-23.03.tar.gz cd dpdk-23.03 meson build ninja -C build sudo ninja -C build install
DPDK库和二进制文件将安装在/usr/local/lib64和/usr/local/bin/。
本节只适用于包生成系统。从github下载Pktgen-DPDK源代码。由于Pktgen-DPDK使用前面章节中安装的DPDK库,请选择与DPDK版本相近的版本。然后使用以下命令进行构建:
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig git clone [https://github.com/pktgen/Pktgen-DPDK.git](https://github.com/pktgen/Pktgen-DPDK.git) cd Pktgen-DPDK make
在开始测试之前,应该在包生成器和DUT系统上应用一些设置。根据操作系统的不同,有些选项可能会有所不同。
系统健康检查
系统健康检查是任何测试之前要做的第一件事。使用常见的实用程序,如dmidcode、lscpu、lshw、lspci、fio、iperf/iperf3等来检查BIOS版本、CPU频率、内存DIMM数量、以太网链路速度等。确保系统的所有组件的功能和性能都能以良好的方式运行。
BIOS 设置
BIOS设置取决于您正在使用的平台。这里我们列出了一些Ampere Altra系列处理器平台上DPDK的推荐通用选项。
Advanced->ACPI Settings->Enable ACPI Auto Configuration [Disabled]
Advanced->ACPI Settings->Enable CPPC [Disabled]
Advanced->ACPI Settings->Enable LPI [Disabled]
Chipset->CPU Configuration->ANC mode [Monolithic]
Chipset->CPU Configuration-> SLC Replacement Policy [Enhanced Least Recently Used]
Chipset->CPU Configuration->L1/L2 Prefetch [Enabled]
Chipset->CPU Configuration->SLC as L3$ [Disabled]
BIOS的详细设置请参考各平台的用户手册。
大页面支持(Hugepage)
支持的大页面大小与基本内核页面大小配置不同。当内核页面大小配置为4K时,支持的大页面大小为64K、2M、32M和1G(建议使用1G的大页面)。当配置内核页大小为64K时,支持的大页面大小为2M、512M和16G(推荐使用512M或16G的大页面)。
我们在这个文档中使用512M的超大页面大小。使用如下命令设置大页面的个数:
echo 100 > /sys/devices/system/node/node0/hugepages/hugepages-524288kB/nr_hugepages
或者,你可以在内核引导选项中设置大页面,并且该设置可以在重启后保持不变:
default_hugepagesz=512M hugepagesz=512M hugepages=100
https://www.kernel.org/doc/html/latest/admin-guide/mm/hugetlbpage.html
https://www.kernel.org/doc/html/latest/arm64/hugetlbpage.html
性能调控
如果您在BIOS中将“Enable CPPC”设置为“Disabled”,或者需要将CPU设置为性能调控模式(performance governor)以避免调频节能,则跳过此步骤。
for i in {0..128}; do echo performance > /sys/devices/system/cpu/cpu$i/cpufreq/scaling_governor done
内核启动选项
其他一些推荐的内核启动选项:
iommu.passthrough=1: Bypass the IOMMU for DMA selinux=0: Disable SELinux at boot time isolcpus=xx-yy: Isolate a given set of CPUs from disturbance nohz_full= xx-yy: Stop the ticks for the given set of CPUs rcu_nocbs=xx-yy: Set to no-callback mode for the given set of CPUs rcu_nocb_poll
请参考内核文档了解这些选项的详细信息:
https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html
NIC
关闭用于测试的以太网接口的暂停帧:
ethtool -A <interface> rx off tx off
设置PCIe设备的MaxReadReq为4096字节。这只是Mellanox NIC的一个例子。
setpci -s <PCIe Address> 68.w=5950
启用Mellanox网卡的 relax ordering和CQE压缩:
mst start mst status mlxconfig -d <PCIe Address> query |grep -e PCI_WR_ORDERING -e CQE_COMPRESSION mlxconfig -d <PCIe Address> set PCI_WR_ORDERING=1 mlxconfig -d <PCIe Address> set CQE_COMPRESSION=1
不同的网卡可能有不同的最佳设置,详情请参考设备的用户手册。
SLC 安装
“SLC (System Level Cache) Installation”是一种让IO子系统直接在SLC中缓存IO数据的方法,可以减少数据路径上的延迟,提高DPDK应用程序的性能。它需要一些工具程序来在Ampere Altra系列处理器上启用此功能,并且对内核有一些依赖。请联系Ampere来支持此功能。
在用作包生成器的系统上启动pktgen应用程序。在本例中,我们使用一个100G端口作为pkt发射器。
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig cd Pktgen-DPDK ./Builddir/app/pktgen --file-prefix pktgen -a 0000:01:00.0 -l 40-59 -n 8 -- -N -T -m [42-43:44-59].0
根据Pktgen的提示启用范围。
Pktgen:/> set 0 dst mac <mac> Pktgen:/> range 0 dst mac <mac> 00:00:00:00:00:00 00:00:00:00:00:00 00:00:00:00:00:00 Pktgen:/> range 0 size 64 64 64 0 Pktgen:/> enable 0 range Pktgen:/> start 0
下图是148.8Mpps发送数据包的截图,这是100G网卡接口的线路速率。
表1给出了不同报文大小下不同以太网链路速率的速率。
Ethernet Link Speed | Packet Size (Byte) | Line rate packet per second (Mpps) |
---|---|---|
10GbE | 64 | 14.88 |
128 | 8.45 | |
256 | 4.53 | |
512 | 2.35 | |
25GbE | 64 | 37.2 |
128 | 21.11 | |
256 | 11.32 | |
512 | 5.87 | |
100GbE | 64 | 148.8 |
128 | 84.46 | |
256 | 45.29 | |
512 | 23.5 |
在被测系统上启动dpdk-testpmd应用程序。下面是一个示例(CMD-1),具有1个核心和3个rx队列/3个tx队列。
(CMD-1) dpdk-testpmd --file-prefix testpmd -l 40-79 -n 8 -a 0000:01:00.0,mprq_en=1,rxqs_min_mprq=1,rxq_cqe_comp_en=1,rxq_pkt_pad_en=1,txq_inline_max=1024,txq_inline_mpw=1024,txqs_min_inline=1,txq_mpw_en=1 -- -i --rss-ip --nb-cores=1 --burst=128 --txq=3 --rxq=3 --mbcache=512 --rxd=1024 --txd=1024 -a
在本例中,我们通过启用Mellanox ConnectX-5, ConnectX-6网卡的多包Rx队列(MPRQ),增强型多包写(eMPW)和CQE压缩来使用数据内联模式。这些特性可以在PCIe背压较大的情况下节省PCIe带宽,提高性能。但是,它会为数据复制消耗额外的CPU周期。当PCIe背压不高时,可能会影响性能。下面是另一个禁用数据内联模式的例子(CMD-2):
(CMD-2) dpdk-testpmd --file-prefix testpmd -l 40-79 -n 8 -a 0000:01:00.0,mprq_en=0,rxqs_min_mprq=1,rxq_cqe_comp_en=1,rxq_pkt_pad_en=1,txq_inline_max=0,txq_inline_mpw=0,txqs_min_inline=1,txq_mpw_en=1 -- -i --rss-ip --nb-cores=1 --burst=128 --txq=3 --rxq=3 --mbcache=512 --rxd=1024 --txd=1024 -a
CMD-1(内联模式)和CMD-2(非内联模式)单核的Rx/Tx比较如下:
Core | Mpps | CMD-1(inline mode) | CMD-2(non-inline mode) |
---|---|---|---|
1 | Rx | 28.5 | 68.1 |
Tx | 28.5 | 63.2 | |
6 | Rx | 148.8 | 148.8 |
Tx | 148.1 | 60.2 |
当PPS值不高时,推荐使用CMD-2; PPS值较高时,推荐使用CMD-1。
Some useful commands of testpmd:
show port stats all – Display the statistics data of each port
show fwd stats all – Display the forward statistics of each port
clear port stats all – Clear the statistics data of each port
您可以通过增加核心数和txq/rxq数来实现线路速率。下面的截图显示Rx-pps和Tx-pps都是148.8Mpps。
有关dpdk-testpmd命令行选项的更多详细信息,请参考Testpmd应用程序用户指南。
有关Mellanox CX5和CX6的轮询模式驱动程序(pmd)的详细信息,请参见“MLX5轮询模式驱动程序”。