5. 启用附加功能¶
5.1. 高精度事件定时器 (HPET) 功能¶
5.1.1. BIOS 支持¶
要使用HPET功能时,必须先在平台BIOS上开启高精度定时器。否则,默认情况下使用时间戳计数器 (TSC) 。 通常情况下,起机时按 F2 可以访问BIOS。然后用户可以导航到HPET选项。 在Crystal Forest平台BIOS上,路径为:Advanced -> PCH-IO Configuration -> High Precision Timer -> (如果需要,将Disabled 改为 Enabled )。
在已经起机的系统上,可以使用以下命令来检查HPET是否启用
grep hpet /proc/timer_list
如果没有条目,则必须在BIOS中启用HPET,镔铁重新启动系统。
5.1.2. Linux 内核支持¶
DPDK通过将定时器计数器映射到进程地址空间来使用平台的HPET功能,因此,要求开启 HPET_MMAP
系统内核配置选项。
Warning
在Fedora或者其他常见的Linux发行版本(如Ubuntu)中,默认不会启用 HPET_MMAP
选项。
要重新编译启动此选项的内核,请参阅发行版本的相关说明。
5.1.3. DPDK 中使能 HPET¶
默认情况下,DPDK配置文件中是禁用HPET功能的。要使用HPET,需要将 CONFIG_RTE_LIBEAL_USE_HPET
设置为 y
来开启编译。
对于那些使用 rte_get_hpet_cycles()
及 rte_get_hpet_hz()
API接口的应用程序,
并且选择了HPET作为rte_timer库的默认时钟源,需要在初始化时调用 rte_eal_hpet_init()
API。
这个API调用将保证HPET可用,如果HPET不可用(例如,内核没有开启 HPET_MMAP
使能),则向程序返回一个错误值。
如果HPET在运行时不可用,应用程序可以方便的采取其他措施。
Note
对于那些仅需要普通定时器API,而不是HPET定时器的应用程序,建议使用 rte_get_timer_cycles()
和 rte_get_timer_hz()
API调用,而不是HPET API。
这些通用的API兼容TSC和HPET时钟源,具体时钟源则取决于应用程序是否调用 ``rte_eal_hpet_init()``初始化,以及运行时系统上可用的时钟。
5.2. 没有Root权限情况下运行DPDK应用程序¶
虽然DPDK应用程序直接使用了网络端口及其他硬件资源,但通过许多小的权限调整,可以允许除root权限之外的用户运行这些应用程序。 为了保证普通的Linux用户也可以运行这些程序,需要调整如下Linux文件系统权限:
所有用于hugepage挂载点的文件和目录,如
/mnt/huge
/dev
中的UIO设备文件,如/dev/uio0
,/dev/uio1
等UIO系统配置和源文件,如
uio0
:/sys/class/uio/uio0/device/config /sys/class/uio/uio0/device/resource*
如果要使用HPET,那么
/dev/hpet
目录也要修改
Note
在某些Linux 安装中, /dev/hugepages
也是默认创建hugepage挂载点的文件。
5.3. 电源管理和节能功能¶
如果要使用DPDK的电源管理功能,必须在平台BIOS中启用增强的Intel SpeedStep® Technology。否则,sys文件夹下 /sys/devices/system/cpu/cpu0/cpufreq
将不存在,不能使用基于CPU频率的电源管理。请参阅相关的BIOS文档以确定如何访问这些设置。
例如,在某些Intel参考平台上,开启Enhanced Intel SpeedStep® Technology 的路径为:
Advanced
-> Processor Configuration
-> Enhanced Intel SpeedStep® Tech
此外,C3 和 C6 也应该使能以支持电源管理。C3 和 C6 的配置路径为:
Advanced
-> Processor Configuration
-> Processor C3 Advanced
-> Processor Configuration
-> Processor C6
5.4. 使用 Linux Core 隔离来减少上下文切换¶
虽然DPDK应用程序使用的线程固定在系统的逻辑核上,但Linux调度程序也可以在这些核上运行其他任务。
为了防止在这些核上运行额外的工作负载,可以使用 isolcpus
Linux 内核参数来将其与通用的Linux调度程序隔离开来。
例如,如果DPDK应用程序要在逻辑核2,4,6上运行,应将以下内容添加到内核参数表中:
isolcpus=2,4,6
5.5. 加载 DPDK KNI 内核模块¶
要运行DPDK Kernel NIC Interface (KNI) 应用程序,需要将一个额外的内核模块(kni模块)加载到内核中。
该模块位于DPDK目录kmod子目录中。与 igb_uio
模块加载类似,(假设当前目录就是DPDK目录):
insmod kmod/rte_kni.ko
Note
相关的详细信息,可以参阅 “Kernel NIC Interface Sample Application” 章节和 DPDK 示例程序用户指南 。
5.6. Linux IOMMU Pass-Through使用Intel® VT-d运行DPDK¶
要在Linux内核中启用Intel® VT-d,必须配置一系列内核选项,包括:
IOMMU_SUPPORT
IOMMU_API
INTEL_IOMMU
另外,要使用Intel® VT-d运行DPDK,使用 igb_uio
驱动时必须携带 iommu=pt
参数。
这使得主机可以直接通过DMA重映射查找。
另外,如果内核中没有设置 INTEL_IOMMU_DEFAULT_ON
参数,那么也必须使用 intel_iommu=on
参数。这可以确保 Intel IOMMU 被正确初始化。
请注意,对于``igb_uio`` 驱动程序,使用 iommu = pt
是必须de ,vfio-pci
驱动程序实际上可以同时使用 iommu = pt
和 iommu = on
。
5.7. 40G NIC上的小包处理高性能¶
由于在最新版本中可能提供用于性能提升的固件修复,因此最好进行固件更新以获取更高的性能。 请和 Intel’s Network Division 工程师联系以进行固件更新。 用户可以参考DPDK版本发行说明,以使用 i40e 驱动程序识别NIC的已验证固件版本。
5.7.1. 使用16B大小的RX描述符¶
由于 i40e PMD 支持16B和32B的RX描述符,而16B大小的描述符可以帮助小型数据包提供性能,因此,配置文件中 CONFIG_RTE_LIBRTE_I40E_16BYTE_RX_DESC
更改为使用16B大小的描述符。
5.7.2. 高性能和每数据包延迟权衡¶
由于硬件设计,每个数据包描述符回写都需要NIC内部的中断信号。中断的最小间隔可以在编译时通过配置文件中的 CONFIG_RTE_LIBRTE_I40E_ITR_INTERVAL
指定。
虽然有默认配置,但是该配置可以由用户自行调整,这取决于用户所关心的内容,整体性能或者每数据包延迟。