我有使用 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
不知道是否有人有在内核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/