我有一个使用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所需的最低限度。