OVS DPDK物理端口配置

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

一、快速示例

此示例演示如何绑定两个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。

要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适配器;如果不确定检查驱动程序文档。

原文链接:https://blog.csdn.net/sinat_20184565/article/details/93525962

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章