Getting Started Guide for Linux(8)使能额外的功能

官方文档查看地址:
http://doc.dpdk.org/guides/linux_gsg/enable_func.html
PDF下载地址:
https://www.intel.com/content/www/us/en/embedded/technology/packet-processing/dpdk/dpdk-getting-started-guide.html

本篇难度系数:
翻译:★☆☆☆☆
理解:★★★☆☆

8.使能额外的功能

8.1高精度事件计时器(HPET)功能

8.1.1BIOS支持
如果要使用HPET,必须在平台BIOS中启用High Precision Timer (HPET)。否则,默认使用时间戳计数器(TSC)。BIOS通常在平台启动时按F2来访问。然后用户可以导航到HPET选项。在Crystal Forest平台BIOS上,路径是:Advanced -> PCH-IO Configuration -> High Precision Timer -> (如果需要,从禁用改为启用)。

在已经启动的系统上,可以发出以下命令检查是否启用了HPET:

grep hpet /proc/timer_list

如果没有返回任何条目,则必须在BIOS中启用HPET(按照上面的说明),然后重新启动系统。

8.1.2. Linux Kernel Support
The DPDK makes use of the platform HPET timer by mapping the timer counter into the process address space, and as such, requires that the HPET_MMAP kernel configuration option be enabled.

警告
在Fedora和其他常见发行版(如Ubuntu)上,HPET_MMAP内核选项默认不启用。要重新编译启用此选项的Linux内核,请参考发行版文档中的相关说明。

8.1.3在DPDK中启用HPET
默认情况下,在DPDK构建配置文件中禁用HPET支持。要使用HPET, CONFIG_RTE_LIBEAL_USE_HPET设置应该更改为y,这将在编译时启用HPET设置。

要使应用程序使用rte_get_hpet_cycles()rte_get_hpet_hz()API调用,并可选地使HPET成为rte_timer库的默认时间源,应该在应用程序初始化时调用新的rte_eal_hpet_init() API调用。这个API调用将确保可以访问HPET,如果HPET_MMAP在内核中没有启用,则返回一个错误给应用程序。然后,如果HPET在运行时不可用,应用程序可以决定采取什么操作(如果有的话)。

请注意
对于需要计时API(但不是HPET计时器)的应用程序,建议使用rte_get_timer_cycles()和rte_get_timer_hz() API调用,而不是特定于HPET的API。这些通用api可以使用TSC或HPET时间源,这取决于应用程序调用rte_eal_hpet_init()所请求的内容(如果有的话),以及运行时系统上可用的内容。

8.2运行没有root权限的DPDK应用程序

请注意
下面的说明将允许在旧的Linux内核版本中以非root用户身份运行DPDK。但是,从4.0版本开始,内核就不允许非特权进程从pagemaps文件中读取物理地址信息,这使得这些进程无法使用需要物理地址的HW设备

尽管使用DPDK的应用程序直接使用网络端口和其他硬件资源,但是通过少量的权限调整,可以将这些应用程序作为“root”以外的用户运行。为此,应调整以下Linux文件系统对象的所有权或权限,以确保用于运行DPDK应用程序的Linux用户帐户可以访问这些对象:

  • 所有用作hugepage挂载点的目录,例如/mnt/huge

  • 用户空间-io设备文件位于/dev中,例如/dev/uio0、/dev/uio1等等

  • userspace-io sysfs配置和资源文件,例如uio0:

    • /sys/class/uio/uio0/device/config
    • /sys/class/uio/uio0/device/resource*
  • If the HPET is to be used, /dev/hpet

请注意
在一些Linux安装中,/dev/hugepages也是默认创建的一个hugepage挂载点。

8.3电源管理和省电功能
如果要使用DPDK的电源管理特性,必须在平台BIOS中启用增强型Intel SpeedStep®技术。否则,sys文件文件夹/sys/devices/system/cpu/cpu0/cpufreq将不存在,并且不能使用基于cpu频率的电源管理。请参考相关BIOS文档以确定如何访问这些设置。

例如,在一些Intel参考平台BIOS变体中,增强Intel SpeedStep®技术的路径是:

  • Advanced
    -> Processor Configuration
    -> Enhanced Intel SpeedStep® Tech

此外,还应该启用C3和C6来进行电源管理。C3和C6在同一平台BIOS上的路径为:

  • Advanced
    -> Processor Configuration
    -> Processor C3 Advanced
    -> Processor Configuration
    -> Processor C6

8.4使用Linux内核隔离来减少上下文切换
虽然DPDK应用程序使用的线程固定在系统的逻辑核心上,但是Linux调度器也可以在这些核心上运行其他任务。为了防止在这些核心上运行额外的工作负载,可以使用isolcpus Linux内核参数将它们与普通Linux调度器隔离开来。

例如,如果DPDK应用程序要在逻辑核心2、4和6上运行,应该在内核参数列表中添加以下内容:

isolcpus=2,4,6

8.5加载DPDK KNI内核模块
要运行DPDK内核NIC接口(KNI)示例应用程序,必须将一个额外的内核模块(KNI模块)加载到正在运行的内核中。该模块位于DPDK目标目录的kmod子目录中。与加载igb_uio模块类似,应该使用insmod命令加载该模块,如下所示(假设当前目录是DPDK目标目录):

insmod kmod/rte_kni.ko

Note
See the “Kernel NIC Interface Sample Application” chapter in the DPDK Sample Applications User Guide for more details.

8.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内核参数。这将导致在主机中传递DMAR (DMA Remapping)查找。此外,如果内核中没有设置INTEL_IOMMU_DEFAULT_ON,那么也必须使用intel_iommu=on内核参数。这确保Intel IOMMU按预期初始化。

请注意,虽然igb_uio驱动程序必须使用iommu=pt,但是vfio-pci驱动程序实际上可以同时使用iommu=pt和iommu=on。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章