dpdk - 无需 root 权限运行 DPDK C 程序

标签 dpdk

我有使用 DPDK 19.11 的 C 应用程序。目前,应用程序正在以 root 权限运行(使用 sudo 命令)。此外,我的应用程序正在运行大页面(1GB)。

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

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

我想在没有 root 权限的情况下运行我的应用程序 - 摆脱“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

我的操作系统是 Ubuntu 18.04,内核 4.15.0-128-generic 我注意到 DPDK 文档中有一条关于在没有 Root 权限的情况下运行 DPDK 应用程序的评论 - “从版本 4.0 开始,内核不允许非特权进程读取页面映射文件中的物理地址信息,使得这些进程无法被非特权用户使用。在这种情况下,建议使用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-dpdk-applications-without-root-privileges

不知道是否有人有在内核4.0及以上版本无需root运行DPDK应用程序的经验?

此外,另一种解决方案是使用 root 权限启动简单的 DPDK 应用程序来初始化 DPDK。在没有 root 权限的情况下并行运行另一个应用程序 - 该应用程序将消耗数据包并执行业务逻辑,这可能吗?

谢谢

最佳答案

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

modprobe vfio-pci 

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


用于运行 dpdk 应用程序 without root privileges您需要调整正确的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绑定(bind)的设备,因此调整其权限如下:

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 - 无需 root 权限运行 DPDK C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65274122/

相关文章:

compiler-errors - 无法在archlinux上编译dpdk

c - 如何从 dpdk 18.08 中的 rte_device 获取 rte_pci_device 详细信息

从 RX 环接收并在 TX 路径上释放的 DPDK 缓冲区

linux - 运行 DPDK 负载均衡器示例应用程序

c - 如何在基于 dpdk 的应用程序中启用 Debug模式?

linux - DPDK解绑后如何领取网卡?

c - DPDK 中 IPv4 数据包的大小错误

linux - 我们可以在 OpenWrt linux 操作系统上运行 DPDK 应用程序吗?