OVS中的DPDK 物理端口

netdev数据路径允许关联DPDK支持的物理端口,以便为主机提供高性能的入口/出口流量。

重要:

要使用任何支持DPDK的接口,必须确保网桥已正确地配置。有关网桥的详细信息,请参阅:DPDP 网桥

Open vSwitch 2.7.0之前,端口名称需要一个dpdk前缀,从2.7.0版本开始,不在要求。

快速示例

此示例演示如何绑定两个dpdk端口到一个已有的网桥br0上,绑定的物理端口由硬件ID标识,分别为:0000:01:00.00000:01:00.1

$ ovs-vsctl add-port br0 dpdk-p0 \
   -- set Interface dpdk-p0 type=dpdk options:dpdk-devargs=0000:01:00.0
$ ovs-vsctl add-port br0 dpdk-p1 \
   -- set Interface dpdk-p1 type=dpdk options:dpdk-devargs=0000:01:00.1

为了使上述示例工作,必须将两个物理接口绑定到用户空间中的DPDK轮询模式驱动程序,而不是传统的内核驱动。有关详细信息,请参阅下一节绑定NIC驱动内容。

绑定NIC驱动

DPDK完全在用户空间中运行,因此需要使用自己位于用户空间中的轮询模式驱动程序,和用于内核空间中的直通设备驱动程序。

绑定驱动程序有两种不同的工具:命令driverctl是一个通用工具,用于固定配置设备的替代驱动程序,以及命令dpdk-devbind这是一个特定于DPDK的工具,其绑定修改在设备重新启动后丢失。此外,对于内核空间驱动程序,有两个选项可供使用 - VFIO(VIrtual Function I/O)和 UIO(Userspace I/O)以及每个选项关联的多个驱动程序。我们将演示以上工具的使用示例,以及更安全、可靠的vfio-pci驱动程序。有关详细信息,请参见DPDK项目官方文档。

使用drivectl工具列出可用设备,请运行:

$ driverctl -v list-devices | grep -i net
0000:07:00.0 igb (I350 Gigabit Network Connection (Ethernet Server Adapter I350-T2))
0000:07:00.1 igb (I350 Gigabit Network Connection (Ethernet Server Adapter I350-T2))

你可使用此工具为一个或者多个设备绑定驱动程序:

$ driverctl set-override 0000:07:00.0 vfio-pci

另外, 使用dpdk-devbind工具列出可用设备, 运行以下命令:

$ dpdk-devbind --status
Network devices using DPDK-compatible driver
============================================
<none>

Network devices using kernel driver
===================================
0000:07:00.0 'I350 Gigabit Network Connection 1521' if=enp7s0f0 drv=igb unused=igb_uio
0000:07:00.1 'I350 Gigabit Network Connection 1521' if=enp7s0f1 drv=igb unused=igb_uio

Other Network devices
=====================
...

同样,使用dpdk-devbind工具为一个或多个设备绑定驱动程序:

$ dpdk-devbind --bind=vfio-pci 0000:07:00.0

注意
Open vSwitch 2.6.0增加了对DPDK 16.07的支持,此版本将之前的dpdk_nic_bind工具重命名为dpdk-devbind

更多信息,请参考DPDK官方文档DPDK drivers.

多队列

轮询模式驱动程序(Poll Mode Driver, PMD)线程负责执行DPDK数据路径的大部分处理工作。PMD线程和其使用的RX接收队列的正确配置是必要的,以得到DPDK加速带来的高性能。可以为dpdk端口配置多个RX队列,确保这不是性能的瓶颈。更多关于PMD线程配置信息,请参阅:doc:pmd

流控

只能在DPDK物理端口上启用流控。在添加端口时于Tx发送端启用流控,运行如下命令:

$ ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk \
    options:dpdk-devargs=0000:01:00.0 options:tx-flow-ctrl=true

类似的,启动Rx接收端流控, 运行如下命令:

$ ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk \
    options:dpdk-devargs=0000:01:00.0 options:rx-flow-ctrl=true

使能流控自协商功能,运行如下命令:

$ ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk \
    options:dpdk-devargs=0000:01:00.0 options:flow-ctrl-autoneg=true

在运行状态下,为已有端口启用TX方向流控, 运行以下命令:

$ ovs-vsctl set Interface dpdk-p0 options:tx-flow-ctrl=true

流控参数的关闭可通过将false设置为相应参数的值实现。要禁用Tx侧的流量控制,请运行:

$ ovs-vsctl set Interface dpdk-p0 options:tx-flow-ctrl=false

接收校验卸载

默认情况下,DPDK物理端口开启了接收校验卸载功能。

RX校验卸载只能为OVS-DPDK中的隧道流量提供性能改进,因为隧道数据包的校验和验证卸载到了NIC网卡上。同时启用RX校验卸载可能会稍微降低非隧道流量的性能,特别是对于较小的数据包。

热插拔

OVS支持端口热插拔,允许使用在ovs-vswitchd进程启动时未绑定到DPDK驱动的物理端口。

警告:

此功能并不能与所有NIC兼容。参考厂商文件获取更多信息。

重要:

端口必须绑定到DPDK。有关详细信息,请参阅:dpdk binding nics

hotplug 端口, 仅需向其它端口一样添加它:

$ ovs-vsctl add-port br0 dpdkx -- set Interface dpdkx type=dpdk \
    options:dpdk-devargs=0000:01:00.0

可使用del-port命令分离端口:

$ ovs-vsctl del-port dpdkx

这将同时删除端口并分离设备。如果成功,你应该看到如下的INFO日志。例如:

INFO|Device '0000:04:00.1' has been detached

如果以上的日志未显示,使用如下命令分离端口:

$ ovs-appctl netdev-dpdk/detach 0000:01:00.0

警告:

如果设备是不可分离的,则不应进行分离,这可能会导致设备在使用add-port命令添加回来时表现异常。一个例子就是使用cxgbe驱动程序的Chelsio Terminator适配器;如果不确定检查驱动程序文档.

更多信息,请参考文档DPDK Port Hotplug Framework.

表示器

DPDK表示器允许将物理端口配置到客户(VM)机。

OVS驻留在具有一个或多个物理接口(或称为物理功能 - PFs)的hypervisor中。称为物理功能(pfs)。如果PF支持SR-IOV,则可以通过虚拟功能(VFS)与虚拟机进行通信。VFs是从物理以太网控制器创建的虚拟PCIe设备。

DPDK将一个物理接口表示为一个RTE设备,其上创建一个ETH设备。DPDK(18.xx版本)引入了表示器ETH设备。表示器设备表示hypervisor上的VF ETH设备(VM侧),并且运行在PF之上。表示器可以是在一个PF上创建的多个设备。

更多信息,请参考 DPDK documentation.

在端口表示器之前,PF与ETH设备之间存在一对一的关系。通过端口表示器,关系变成一个PF对应多个ETH设备。

对于两个表示器端口的情况,当其中一个端口关闭时 - PCI总线不能分离,直到第二个表示器端口关闭。

表示器配置:

当配置一个基于PF的端口时, 传统的做法是OVS在devargs参数中指定设备PCI地址。对于已有网桥br0和PCI地址0000:08:00.0add-port命令如下:

$ ovs-vsctl add-port br0 dpdk-pf -- set Interface dpdk-pf type=dpdk \
   options:dpdk-devargs=0000:08:00.0

当配置一个基于 VF的端口时, DPDK使用扩展如下格式的devargs参数语法:

BDBF,representor=[<representor id>]

此语法显示表示器是一个枚举ETH设备(带有表示器ID),其使用PF的PCI地址。
This syntax shows that a representor is an enumerated eth device (with
a representor ID) which uses the PF PCI address.

以下的命令使用PCI设备地址0000:08:00.0增加表示器3和5:

$ ovs-vsctl add-port br0 dpdk-rep3 -- set Interface dpdk-rep3 type=dpdk \
   options:dpdk-devargs=0000:08:00.0,representor=[3]

$ ovs-vsctl add-port br0 dpdk-rep5 -- set Interface dpdk-rep5 type=dpdk \
   options:dpdk-devargs=0000:08:00.0,representor=[5]

重要:

表示器端口在OVS调用之前配置,并且独立与OVS或者通过其它方式。请参考NIC厂商关于如何创建表示器的指南。

多设备配置

Intel NICs ixgbe 与 i40e

以下的示例在PF地址0000:05:00.0上创建一个表示器. 当NIC绑定到DPDK兼容的PMD驱动时,表示器被创建:

# echo 1 > /sys/bus/pci/devices/0000\:05\:00.0/max_vfs

Mellanox NICs ConnectX-4, ConnectX-5 与 ConnectX-6

以下示例在PF地址0000:05:00.0和网络设备enp3s0f0上创建2个表示器.

  • 确保系统中的SR-IOV已开启.

在Linux内核参数中增加intel_iommu=on使能IOMMU功能,例如,更改GRUB文件(/etc/grub/grub.conf)。

  • 在创建表示器之前验证PF的PCI地址:
    # lspci | grep Mellanox
    05:00.0 Ethernet controller: Mellanox Technologies MT27700 Family [ConnectX-4]
    05:00.1 Ethernet controller: Mellanox Technologies MT27700 Family [ConnectX-4]
  • 在计算节点创建2个VFs:
    # echo 2 > /sys/class/net/enp3s0f0/device/sriov_numvfs

验证创建的VFs:

# lspci | grep Mellanox
05:00.0 Ethernet controller: Mellanox Technologies MT27700 Family [ConnectX-4]
05:00.1 Ethernet controller: Mellanox Technologies MT27700 Family [ConnectX-4]
05:00.2 Ethernet controller: Mellanox Technologies MT27700 Family [ConnectX-4 Virtual Function]
05:00.3 Ethernet controller: Mellanox Technologies MT27700 Family [ConnectX-4 Virtual Function]
  • 解绑关联的VFs 0000:05:00.2…0000:05:00.3::
    # echo 0000:05:00.2 > /sys/bus/pci/drivers/mlx5_core/unbind
    # echo 0000:05:00.3 > /sys/bus/pci/drivers/mlx5_core/unbind
  • 修改 e-switch 模式.

Mellanox NIC 具有e-switch. 使用如下的命令通过PCI地址将e-switch模式由传统改为switchdev模式:

# sudo devlink dev eswitch set pci/0000:05:00.0 mode switchdev

这将在HOST操作系统中创建VF表示器网络设备.

  • 在设置PF到switchdev模式之后,绑定回相应的VFs:
    # echo 0000:05:00.2 > /sys/bus/pci/drivers/mlx5_core/bind
    # echo 0000:05:00.3 > /sys/bus/pci/drivers/mlx5_core/bind
  • 重启 Open vSwitch

验证表示器配置是否正确,执行以下命令:

$ ovs-vsctl show

确保没有错误输出.

厂商配置

端口表示器是多设备的一个例子。有的NIC通过除表示器以外的其他方法支持多个设备,对于这些表示器,在配置时使用通用devargs语法。通用语法基于设备MAC地址:

class=eth,mac=<MAC address>

例如,以下命令添加端口到网桥br0中,使用ETH设备的MAC地址00:11:22:33:44:55:

$ ovs-vsctl add-port br0 dpdk-mac -- set Interface dpdk-mac type=dpdk \
   options:dpdk-devargs="class=eth,mac=00:11:22:33:44:55"

巨型帧

DPDK物理端口可配置为支持巨型帧(Jumbo Frames). 更多信息,参考文档DPDK 巨型帧.

链路状态改变检测配置

当网络端口的链路状态改变(Link State Change,LSC)发送时,有两种方法可获取到此信息:轮询或中断。

配置LSC检测模式对OVS本身没有直接影响,相反,OVS配置NIC如何处理链路状态更改。处理由OVS触发的链接状态更新请求,使用中断模式花费的时间更少,因为NIC在后台更新链路状态,在轮询模式下,每次执行此请求时必须从固件中获取链路状态。

注意,并不是所有的PMD驱动都支持LSC中断.

默认的配置时轮询模式. 要开启中断模式, 选项dpdk-lsc-interrupt要配置为true.

配置指定端口的中断模式的命令:

$ ovs-vsctl set interface <iface_name> options:dpdk-lsc-interrupt=true

配置指定端口的轮询模式的命令:

$ ovs-vsctl set interface <iface_name> options:dpdk-lsc-interrupt=false
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页