【问题标题】:How to isolate SR-IOV Virtual Fuctions which are bind to DPDK igb_uio driver in docker container from each other如何隔离绑定到 docker 容器中 DPDK igb_uio 驱动程序的 SR-IOV 虚拟功能
【发布时间】:2021-06-28 01:50:34
【问题描述】:

我最近尝试将 SR-IOV VF pci 设备绑定到 docker 容器中的 DPDK 应用程序,预期场景:每个 docker 容器运行负责一个 sriov VF 的 DPDK 应用程序。但是 DPDK 应用程序可以看到所有 sriov VF 端口,这会导致不同的 docker 容器可以处理其他可能被另一个容器充电的 VF。

步骤如下:

(1)开启SR-IOV功能,虚拟功能设置正确
#lspci 04:10.1 以太网控制器:英特尔公司 82599 以太网控制器虚拟功能(修订版 01)
04:10.3 以太网控制器:英特尔公司 82599 以太网控制器虚拟功能(修订版 01)
04:10.5 以太网控制器:英特尔公司 82599 以太网控制器虚拟功能(修订版 01)
04:10.7 以太网控制器:英特尔公司 82599 以太网控制器虚拟功能(修订版 01)

(2) 运行两个 docker 容器
#docker run --privileged --name="sriov_test" -v /mnt/huge:/mnt/huge -itd centos:latest

(3)绑定 VF 端口到 igb_uio drv
#./dpdk-devbind.py -s
使用 DPDK 兼容驱动程序的网络设备
==============================================
0000:04:10.1 '82599 以太网控制器虚拟功能 10ed' drv=igb_uio 未使用=ixgbevf,vfio-pci
0000:04:10.3 '82599 以太网控制器虚拟功能 10ed' drv=igb_uio used=ixgbevf,vfio-pci

(4)运行 dpdk 应用程序 my_basicforwd
#./my_basicfwd -l 1 --log-level 8 -- -p 1
EAL:检测到 4 个 lcore
EAL:检测到 1 个 NUMA 节点
EAL:多进程套接字 /var/run/dpdk/rte/mp_socket
EAL:hugepages-1048576kB 中没有报告免费的大页面
EAL:正在探索 VFIO 支持...
EAL:已初始化 VFIO 支持
EAL:NUMA 插槽 -1 上的 PCI 设备 0000:00:1f.6
EAL:无效的 NUMA 套接字,默认为 0
EAL:探针驱动程序:8086:15b7 net_e1000_em
EAL:NUMA 插槽 -1 上的 PCI 设备 0000:04:00.0
EAL:无效的 NUMA 套接字,默认为 0
EAL:探针驱动程序:8086:10fb net_ixgbe
EAL:NUMA 插槽 -1 上的 PCI 设备 0000:04:00.1
EAL:无效的 NUMA 套接字,默认为 0
EAL:探针驱动程序:8086:10fb net_ixgbe
EAL:NUMA 插槽 -1 上的 PCI 设备 0000:04:10.1
EAL:无效的 NUMA 套接字,默认为 0
EAL:探针驱动程序:8086:10ed net_ixgbe_vf
EAL:NUMA 插槽 -1 上的 PCI 设备 0000:04:10.3
EAL:无效的 NUMA 套接字,默认为 0
EAL:探针驱动程序:8086:10ed net_ixgbe_vf
EAL:NUMA 插槽 -1 上的 PCI 设备 0000:04:10.5
EAL:无效的 NUMA 套接字,默认为 0
EAL:探针驱动程序:8086:10ed net_ixgbe_vf
EAL:NUMA 插槽 -1 上的 PCI 设备 0000:04:10.7
EAL:无效的 NUMA 套接字,默认为 0
EAL:探针驱动程序:8086:10ed net_ixgbe_vf

定时器周期 33120229810
调试 nb_ports 2
端口 0 MAC:02 09 c0 4b b4 a7
端口 1 MAC:02 09 c0 3c ce 0f

上面显示dpdk可以看到两个VF端口,另一个容器dpdk应用结果是一样的。 我试图通过 ip link set xxx netns xxx 将 VF 端口设置为 docker 容器的 netns,不幸的是没有用。

我在网上搜索了很久,但没有用。请帮助或尝试给出一些想法如何实现这一点,非常感谢。

【问题讨论】:

  • 请更新以下信息,内核版本,DPDK 版本,操作系统发行版,网卡固件,流量重定向规则。
  • 感谢您的回复,内核版本为 Linux 版本 5.4.0-70-generic,dpdk-stable-18.11.11,docker 客户端和服务器引擎 19.03.11,Intel 82599ES NIC。我还没有发送流量。谢谢
  • 请更新问题,同时更新网卡固件版本
  • 一旦你将 NIC 绑定到像 uio_pci_generic|igb_uio|vfio-pci 这样的 dpdk 驱动程序,就不再使用 Kerenl 或命名空间进行维护。因此,要使用或不使用 DPDK 端口,您应该为 DPDK 18.11.11 使用选项-w|-b。我在 DPDK 应用程序中看不到相同的内容,请您设置相同并检查相同吗?
  • 这是网卡版本:# ethtool -i enp4s0f1 驱动程序:ixgbe 版本:5.1.0-k 固件版本:0x00012b2c, 1.1197.0 我的问题是:两个不同 docker 容器中的 dpdk 应用程序可以看到相同的虚拟功能,dpdk应用程序可能会接管其他的VF,这是出乎意料的,它不能使VF资源隔离,谢谢。

标签: docker dpdk


【解决方案1】:

注意:根据 cmets 中的说明,设置 Docker/Container 与虚拟机实例的期望值。

  • Docker 或容器在现有内核和硬件资源之上运行。隔离在内核命名空间和 CPU|内存|文件访问权限中完成
  • 在虚拟机中,CPU|内存|网卡(物理和虚拟设备)等硬件被划分为单独的实例。来宾操作系统是运行设备及其驱动程序的单独内核。主机操作系统无权访问访客设备

因此,当 DPDK 应用程序在 docker/container 中运行时,它可以像独立应用程序一样访问大页面、/dev/ 和驱动程序。必须限制对物理的访问使用allow/block in DPDK 20.11 onwardswhitelist/blacklist in 20.08 and below的设备。

因此以下是在容器/dpdk 中运行 DPDK 的可能解决方案

  1. 如果 docker/container 以完全权限运行,请使用选项 -a or -b for DPDK 20.11 onwards-w or -b for DPDK 20.08 and below
  2. 如果 docker/container 以选定的权限运行,请使用chown 将所有权更改为所需的用户帐户,以便在/dev/uio 下绑定uio_pci_generic\igb_uio/dev/vfio/ 下的vfio-pci 绑定 DPDK 设备。当 DPDK 以non sudo 模式运行时,这将限制对设备的访问

注意:请首先确保在主机上以非sudo 模式运行,然后确定要在环境变量、大页面访问、/dev/ 中进行的更改。然后在所需的名称空间下使用正确的用户启动 docker。

【讨论】:

  • 我尝试了解决方案 2,以非 sudo 模式运行 docker/container,不幸的是,从 EAL 得到错误响应:无法打开 /sys/class/uio/uio0/device/config: Permission denied跨度>
  • @happy 谁是 uio0 的所有者?和 DPDK 应用程序是同一个用户吗?
  • 需要实时调试,目前的信息还不清楚是什么问题。
  • 能否分享您的 docker run 配置,无需特权,可以运行 DPDK l2fwd,它可能有用,非常感谢。
  • @happy 我已经分享了我在 Docker 中使用 DPDK 18.11 LTS 所做的详细信息。由于调试详细信息不足,我要求进行实时调试。
猜你喜欢
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多