文章

英特尔®以太网控制器 E810 数据平面开发套件(DPDK)配置指南

英特尔®以太网控制器 E810 数据平面开发套件(DPDK)配置指南

参考连接:Intel® Ethernet Controller E810 Data Plane Development Kit (DPDK) Configuration Guide

Revision History 修订记录

Revision 修订Date 日期Comments 备注
1.0March 7, 2023 2023 年 3 月 7 日Initial public release. 首次公开发布。

一. 介绍

本文档旨在提供使用数据平面开发套件 (DPDK) 配置和测试英特尔® 以太网 800 系列网络适配器的说明。

二. DPDK要求

系统要求

对于 DPDK 系统要求,请参阅以下文档的第 2 节:http://doc.dpdk.org/guides/linux_gsg/

软件/固件要求

Software/Firmware 要求

  • 操作系统:
    • RHEL 8.6、9
    • RHEL 9
    • Ubuntu 20.04.1 、22.04.4 LTS
    • SLES 15 SP4
    • Linux Kernel: 5.15.0-46-generic

下表列出了推荐用于支持的 DPDK 版本的驱动程序、固件和包版本。

DPDKSoftware Releaseice Kernel Driveriavf Kernel DriverNVM VersionFirmwareDDP OS PackageDDP Comms PackageDDP Wireless Edge Package
20.0525.21.0.44.0.12.001.4.1.131.3.13.01.3.17.0N/A 不适用
20.0825.3/25.41.1.44.0.12.10/2.141.5.1.5/1.5.1.91.3.16.01.3.20.0N/A 不适用
21.1126.81.7.164.3.193.10 / 3.121.6.1.91.3.27.01.3.31.01.3.7.0

使用 DPDK 驱动程序更新 NVM

前置条件:

  1. 将 kernel driver 绑定到设备。( Intel® Ethernet 800 )

    • 确保安装了ice kernel driver 内核驱动程序。

    • 使用 lspci 发现您要更新/清点的设备端口的 PCI 位置(以 格式(例如,04:00.0))

    • 将端口与内核驱动程序绑定:

      1
      
      # usertools/dpdk-devbind.py -b <i40e|ice> <B:D.F>
      
  2. 从英特尔支持站点下载适当版本的 NVM 更新实用程序: https://www.intel.com/content/www/us/en/search.html#q=e810 nvm update&sort=relevancy

  3. 运行 nvmupdate

    • NVM update example: NVM 更新示例:

      1
      
      # nvmupdate -u -l -c nvmupdate.cfg
      
    • NVM inventory example: NVM 查看示例:

      1
      
      # nvmupdate -i -l -c nvmupdate.cfg
      
  4. 重启系统

  5. 通过加载 DPDK 驱动程序来恢复初始驱动程序配置。

    1
    
    # usertools/dpdk-devbind.py -b vfio_pci <B:D.F>
    

三. DPDK安装 / 配置

要运行 DPDK 应用程序,可能需要在目标机器上进行一些自定义。 有关详细信息,请参阅以下文档的第 2.3 节:

http://doc.dpdk.org/guides/linux_gsg/

Item 设置项Description 描述
BIOSCPU Power and Performance Policy
CPU C-state Disabled
CPU P-state Enabled
Intel® Hyper-Threading Tech Disabled
Turbo Boost Enabled
Boot settingsdefault_hugepagesz=1G hugepagesz=1G hugepages=16 intel_iommu=on
iommu=pt isolcpus=1-21 nohz_full=1-21 rcu_nocbs=1-21 idle=poll
nmi_watchdog=0 audit=0 nosoftlockup processor.max_cstate=0
intel_idle.max_cstate=0 hpet=disable mce=off tsc=reliable numa_balancing=disable
DPDK SettingsCC=gcc meson -Dlibdir=lib -Dexamples=l3fwd -Dc_args=-
DRTE_LIBRTE_ICE_16BYTE_RX_DESC –default-library=static x86_64-native-
linuxapp-gcc
Command linedpdk-l3fwd -l 5-8 -n 8 –force-max-simd-bitwidth=512 – -p 0x1 –config
‘(0,0,5),(0,1,6),(0,2,7),(0,3,8)’ –tx-queue-size 2048 –rx-queue-size 2048

系统配置

为获得最佳性能,请参阅 DPDK.org 上托管的最新英特尔 NIC 性能报告中列出的参考系统配置详细信息:

http://core.dpdk.org/perf-reports/

BIOS 设置

Power Management (电源管理)

英特尔处理器具有电源管理功能,系统在未充分利用时进入节能模式。应关闭此功能, 以实现最佳性能。

缺点是即使主机系统空闲时,功耗也不会下降。

1
2
Power and Performance → CPU Power and Perf Policy → <Performance>   # 开启 “高性能”
Power and Performance → Workload Configuration → <I/O Sensitive>    # 开启 “I/O敏感”

为获得最佳性能,应禁用低功耗处理器状态(C6、C1 增强型):

1
CPU C-state Disabled

P-States 旨在优化代码执行期间的功耗,应该被禁用:

1
CPU P-state Disabled 

or :

1
2
Advanced → Power & Performance → CPU C State Control → Package C-State=C0/C1 State 
Advanced → Power & Performance → CPU C State Control → C1E=Disabled

Turboboost/Speedstep (睿频加速)

Speedstep 是一种 CPU 功能,可动态调整处理器频率以满足处理需求,在低 CPU 负载条件下降低频率。当对 CPU 的需求很高时,Turboboost 会对内核进行超频。Turboboost 需要启用 Speedstep。

当出现数据包突发时,这两种配置可能会导致数据平面性能发生变化。为了行为的一致性,应禁用这两个功能。

1
2
Enhanced Intel® Speedstep® Tech Disabled
Turbo Boost Disabled

Virtualization Extensions (虚拟化扩展)

Intel 虚拟化扩展、英特尔® 虚拟化技术(英特尔® VT)和英特尔® 定向 I/O 虚拟化技术(英特尔® VT-d)和 DMA 重新映射 (DMAR) 必须打开。 VT-d 启用 PCIe 直通所需的 IOMMU 虚拟化功能。

Enable these extensions through the platform’s BIOS settings.

1
2
Intel VT For directed I/O(VT-d) Enabled
Intel Virtualization Technology (VT-x) Enabled

Hyperthreading (超线程)

超线程是 Intel 的同步多线程技术 对于存在的每个物理处理器内核,操作系统会寻址两个虚拟(逻辑)内核并在可能的情况下在它们之间分担工作负载。 每个逻辑内核共享物理内核的资源(L1 和 L2 缓存、寄存器)。这是由 BIOS 中的设置控制的。

通常,启用超线程时数据平面性能会受到影响。因此,建议禁用它。

如果启用超线程,且需要获得与禁用超线程相同的性能。请隔离额外的逻辑核心(请参阅 CPU isolation 隔离)并且不要为它们分配任何线程。

1
Processor Configuration → Hyper-threading → Enabled for Throughput / Disabled for Latency

Hugepages Setup (大页内存)

通过使用大页面分配,性能得到提高,因为需要的页面数量更少,因此Translation Lookaside Buffers(TLB,页表缓存、转址旁路缓存)更少,从而减少了将虚拟页面地址转换为物理页面地址所需的时间。

如果没有 hugepages,标准 4K 页面会出现 高 TLB 未命中率,从而降低性能。

For 1 GB pages (1 GB 页面)

系统启动后无法保留大页内存。大小必须明确指定,也可以选择设置为系统的默认大页面大小。

1 GB hugepage 选项可以与内核命令行中的 IOMMU 一起添加到 Grub 中,如 High Performance of Small Packets on 100G NIC- Use 16 Bytes Rx Descriptor Size 所示。

要以四个 1 GB 页面的形式保留 4 GB 的大页面内存,应将以下选项传递给内核:

1
default_hugepagesz=1G hugepagesz=1G hugepages=4

设置 大页面内存后,要使大页内存可供 DPDK 使用,请执行以下操作:

1
2
mkdir /mnt/huge  
mount -t hugetlbfs  nodev /mnt/huge

对于 1 GB hugepage 页面,通过将以下行添加到 /etc/fstab 文件,挂载点可以在重新启动后永久化:

1
nodev  /mnt/huge  hugetlbfs  pagesize=1GB  0  0

==注意==:在 RHEL 7.x 下有多种创建大页面的方法,下面是一个示例,显示了创建 4 个 1 GB 页面的步骤:

  1. 使用 auto-mount为大页面创建挂载点

  2. 1
    
    mkdir -p /mnt/huge
    
  3. 修改 /etc/fstab

    1
    
    nodev  /mnt/huge  hugetlbfs  pagesize=1GB  0  0
    
  4. 修改和更新 /etc/default/grub 以设置大页面。

    1
    2
    
    # 修改 /etc/default/grub  
    GRUB_CMDLINE_LINUX="default_hugepagesz=1G hugepagesz=1G hugepages=4" 
    

    更新 grub

    1
    2
    
    # For RHEL: 对于 RHEL:
    grub2-mkconfig -o /boot/grub/grub.cfg
    
    1
    2
    
    # For Ubuntu: 对于Ubuntu:
    Update-grub
    
  5. 重新启动系统并检查大页面分配。

    1
    2
    3
    4
    5
    
    # cat /proc/meminfo | grep HugePages_Total 
    HugePages_Total:       4 
       
    # cat /proc/meminfo | grep Hugepagesize 
    Hugepagesize:    1048576 kB
    

For 2 MB pages (2 MB 页面)

系统启动后可以分配大页面。这是通过查看 /sys/devices/ 目录中的 nr_ hugepages 文件所需的大页面数量来完成的。

对于单节点(单CPU)系统,使用的命令如下(假设需要1024页):

1
2
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mount -t hugetlbfs nodev /mnt/huge

在 NUMA 机器上,页面应该在每个node上显式分配:

1
2
3
4
mkdir -p /mnt/huge
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
mount -t hugetlbfs nodev /mnt/huge

IOMMU

此外,要使用 Intel® VT-d 运行 DPDK,必须使用 iommu=pt 内核参数。这会导致在主机中传递 DMA 重新映射 (DMAR) 查找。此外,如果内核中未设置 INTEL_ IOMMU_ DEFAULT_ ON,则还必须使用 intel_ iommu=on 内核参数。这可确保英特尔 IOMMU 按预期进行初始化。

CPU Isolation

CPU 隔离: isolcpus 是将某些 CPU 与内核调度隔离开来的内核引导参数之一,如果您希望在多核系统中将某些 CPU 专用于特殊任务且中断次数最少或不需要中断(但不能达到 0),则该参数特别有用.

RCU Callbacks

为了消除本地定时器中断,还需要隔离 RCU callbacks( RCU 回调 ) 。这可以在内核配置中完成,也可以通过修改grub的rcu_ nocbs 选项完成。

Tickless Kernel

对于高性能应用程序,使用tickless kernel可以提高性能。主机内核必须有以 tickless 模式运行的内核,并且相同的内核应该专用于应用程序。

主机内核可能是使用 CONFIG_ NO_ HZ_ FULL_ ALL 选项构建的。如果是这样,无滴答操作会自动发生在 Linux 调度程序只有一个线程运行的任何内核上。要检查这一点,请在您的 Linux 内核配置文件中查找该字符串。

该文件可能位于 /boot/<kernel version>(使用 “uname -a” 确定您的内核版本)或 /proc/config.gz

如果内核不是使用 CONFIG_ NO_ HZ_ FULL 构建的,通过在 grub 文件中配置它仍然可以以 tickless 运行(请参阅 Grub 文件部分)。为 nohz_ full 和 isolcpus 指定同一组 CPU。

vt.handoff

vt.handoff (vt = virtualterminal) 是 Ubuntu 特有的内核启动参数,不是上游内核启动参数。它的目的是让内核在虚拟终端上维护显存的当前内容。

因此,当操作系统启动时,当它经过引导加载程序时,vt.handoff 允许显示紫红色背景,Plymouth 在其上显示徽标和进度指示条。显示管理器出现后,它会顺利地将其替换为登录提示。

NUMA Balancing and MCE

NUMA Balancing inside a kernel automatically optimizes a task scanner for scheduling on the fly, This should be disabled to get a consistent performance during benchmarking. 内核中的 NUMA 平衡会自动优化任务扫描器以进行动态调度,这应该被禁用以在基准测试期间获得一致的性能。

Also, machine check event exceptions logging is disabled. 此外,机器检查事件异常日志记录被禁用。

Active-State Power Management

活动状态电源管理 (ASPM) 通过在连接的设备未使用时为 PCIe 链接设置较低的电源状态来节省 PCIe 子系统的电源。 启用 ASPM 后,设备延迟会增加,因为在不同电源状态之间转换链接需要时间。因此,此处禁用 ASPM 支持以进行性能基准测试。

High Performance of Small Packets on 100G NIC- Use 16 Bytes Rx Descriptor Size 100G NIC

ICE PMD 支持 16 和 32 bytes 的 Rx 描述符大小。 16 字节大小可以在小数据包大小下提供高性能.

配置文件中 CONFIG_ RTE_ LIBRTE_ ICE_ 16BYTE_ RX_ DESC 的配置可以更改为使用 16 字节大小的 Rx 描述符。

有关设置 16 字节 Rx 描述符大小的更多详细信息,请参阅 Setting 16 Bytes Rx Descriptor Size.

Downloading and Installing the ice Driver

用于 PF 和 VF 的Intel® Ethernet 800 系列 Linux 驱动程序可从以下来源获得:

  • http://sourceforge.net/projects/e1000/files/
  • https://www.intel.com/content/www/us/en/download-center/home.html

有关推荐的驱动程序组合,请参阅英特尔® 以太网控制器 E810 功能支持矩阵。有关更多功能说明和配置说明,请参阅 ice 驱动程序自述文件。

  1. 下载并解压缩 ice 驱动程序。

    1
    2
    3
    
    ### download ice-<x.x.x>.tar.gz 
    tar -xzvf ice-<x.x.x.tar.gz 
    cd ice-<x.x.x>/src/
    
  2. 编译并安装 ice 驱动程序。

    1
    2
    3
    
    make -j 8
    make install
    modprobe ice
    
  3. 如果在加载驱动程序时遇到问题,请使用以下命令检查 dmesg 是否有来自 ice 模块的错误。

    1
    
    module.dmesg | grep ice
    

Linux Drivers 驱动程序

Linux 驱动程序在用户模式下处理 PCI 枚举和链接状态中断,而不是由内核处理。

为了正常工作,不同的 PMD 可能需要不同的内核驱动程序。根据所使用的 PMD,应加载相应的内核驱动程序,并将网络端口绑定到该驱动程序。

  • VFIO 驱动程序是一个强大且安全的驱动程序,它依赖于 IOMMU 保护。
  • UIO 是一个小型内核模块,用于设置设备、将设备内存映射到用户空间以及注册中断。

由于 DPDK v1.7 及更高版本提供 VFIO 支持,因此建议在所有情况下都将 vfio-pci 用作 DPDK 绑定端口的内核模块。与 UIO 相比,这是一个更健壮和安全的驱动程序,依赖于 IOMMU 保护。要使用 VFIO,必须加载 vfio-pci 模块。

如果 IOMMU 不可用,则可以在 no-iommu 模式下使用 vfio-pci。如果由于某种原因 vfio 不可用,则可以使用基于 UIO 的模块 igb_ uio 和 uio_ pci_ generic。

Loading vfio-pci 模块

使用以下命令加载 vfio-pci 模块:

1
modprobe vfio-pci

VFIO 内核通常默认存在于所有发行版中。如果不是,请查阅您的发行版文档以获取安装说明。 要使用完整的 VFIO 功能,内核和 BIOS 都必须支持并配置为使用 I/O 虚拟化(例如 Intel® VT-d)。 在大多数情况下,将 iommu=on 指定为内核参数应该足以将 Linux 内核配置为使用 IOMMU。

Note: VFIO no-IOMMU 模式: 如果系统上没有可用的 IOMMU,VFIO 仍然可以使用,但必须加载一个额外的模块参数:

1
modprobe vfio enable_unsafe_noiommu_mode=1 

或者,也可以在已加载的内核模块中启用此选项:

1
echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode

之后,VFIO 就可以像往常一样与硬件设备一起使用了。

请注意,在使用 enable_ unsafe_ noiommu_ mode=1 参数再次探测模块之前,可能需要卸载所有与 VFIO 相关的模块。

警告:由于 no-IOMMU 模式放弃了 IOMMU 保护,因此它本质上是不安全的。也就是说,在 IOMMU 不可用的情况下,它确实可以让用户保持 VFIO 拥有的设备访问和编程程度。

Binding and Unbinding Network Ports

可以通过 /usr/local/bin 或顶级 DPDK 目录中的 usertools 目录访问和运行 dpdk-devbind 实用程序:/usr/local/bin/dpdk-devbind.py

本文由作者按照 CC BY 4.0 进行授权