netdev數據路徑允許關聯DPDK支持的物理端口,以便爲主機提供高性能的入口/出口流量。
一、快速示例
此示例演示如何綁定兩個dpdk
端口到一個已有的網橋br0
上,綁定的物理端口由硬件ID標識,分別爲:0000:01:00.0
和0000: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