在没有root权限的情况下运行DPDK C程序



我有一个使用DPDK 19.11的C应用程序。目前,该应用程序使用root权限运行(使用sudo命令(。此外,我的应用程序运行时有巨大的页面(1GB(。

使用DPDK兼容驱动程序的网络设备:

0000:02:00.0 'Ethernet Controller X710 for 10GbE backplane 1581' 
drv=igb_uio unused=

我想在没有根权限的情况下运行我的应用程序-从";sudo";命令我更改这些文件/文件夹的权限:

  • /sys/class/uio/uio*/device/resource*
  • /sys/class/uio/uio*/device/config
  • /dev/uio*
  • /dev/hugepages/*

当我运行我的应用程序时;sudo"-我在rte_eal_init函数中遇到问题。我得到了这个错误:

EAL: FATAL: Cannot use IOVA as 'PA' since physical addresses are not available
EAL: Cannot use IOVA as 'PA' since physical addresses are not available

我的操作系统是Ubuntu18.04,内核4.15.0-128-generic。我注意到在DPDK文档中有一条关于在没有根权限的情况下运行DPDK应用程序的注释;自4.0版本以来,内核不允许非特权进程从pagemaps文件中读取物理地址信息,这使得非特权用户无法使用这些进程。在这种情况下,建议使用VFIO驱动程序">

在阅读评论后,我尝试使用vfio-pci。我使用加载模块

sudo modprobe vfio-pci enable_unsafe_noiommu_mode=1

我还更改了/dev/hugepages/*/dev/vfio/*的权限使用vfio-pci和sudo成功运行。在没有sudo的情况下运行时,我得到了相同的错误:

EAL: FATAL: Cannot use IOVA as 'PA' since physical addresses are not available
EAL: Cannot use IOVA as 'PA' since physical addresses are not available

另请参阅:https://doc.dpdk.org/guides/linux_gsg/enable_func.html#running-没有root权限的dpdk应用程序

我想知道是否有人有经验运行DPDK应用程序没有根与内核4.0及以上?

另外,作为一种替代解决方案,可以启动具有root权限的简单DPDK应用程序,该应用程序将初始化DPDK。并行运行另一个没有root权限的应用程序——这个应用程序将使用数据包并执行业务逻辑,这可能吗?

感谢

首先,检查是否真的需要使用vfio-pci的不安全模式是有意义的。也许您只需要将intel_iommu=on iommu=pt添加到内核参数中,即可使设备安全工作,即:

modprobe vfio-pci 

到目前为止,我还没有使用过不安全模式,如果不安全模式被启用,出于(明显的?(安全原因,内核甚至无条件地禁止vfio设备的映射。


要在没有root权限的情况下运行dpdk应用程序,您需要调整正确vfio设备的权限。例如,当权限看起来像这个时

# ls -l /dev/vfio/
total 0
crw-------. 1 root root 235,   0 2021-08-21 15:13 17
crw-rw-rw-. 1 root root  10, 196 2021-08-21 15:13 vfio

那么/dev/vfio/17就是你为dpdk绑定的设备,因此调整它的权限如下:

chown juser /dev/vfio/17

用户进程不需要额外的权限来映射巨大的页面。如果您为dpdk程序提供--in-memory选项,您甚至不必挂载hugetblfs。

但是,一些大漏洞必须由root用户保留,例如在系统引导期间。示例:

echo 4096 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 8 >  /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages

除了权限,默认资源限制可能太低。尤其是记忆锁。如果它太低,内核在启动dpdk应用程序时会记录这样的内容:

kernel: vfio_pin_pages_remote: RLIMIT_MEMLOCK (65536) exceeded

dpdk应用程序打印:

EAL:   cannot set up DMA remapping, error 12 (Cannot allocate memory)
EAL:   0000:05:00.1 DMA remapping failed, error 12 (Cannot allocate memory)

增加限制可以解决此问题,例如:

cat /etc/security/limits.d/24-memlock.conf                                         
# memlock unit: KiB
juerr hard memlock 16777216
juser soft memlock 1048576

DPDK应该检测您是否应该使用IOVA VA或PA。使用开关enable_unsaf.noiommu_mode=1是在告诉DPDK您没有iommu,您将使用IOVA PA。

问题是,在PA模式下运行需要root权限,因为您需要访问物理地址。

你引用的dpdk.org文档应该能起到作用。我能够让DPDK在没有根权限的情况下运行20.02在一个docker容器。然而,我们在DPDK上运行的软件还有另一个问题,以及它与hugepage后台的交互。

最后,我们决定仍然以root身份运行DPDK,但是,我们将容器的功能限制在运行DPDK所需的最低限度。

最新更新