概述
數據平面開發套件 (DPDK) 可提供高性能的數據包處理庫和用戶空間驅動程序。 自 Open
vSwitch (OVS) 2.4 版 (http://openvswitch.org/releases/NEWS-2.4.0)起,我們將可在 OVS 中使用 DPDK 優化的 vHost 路徑。 OVS 自 2.2 版起開始提供
DPDK 支持。
將 DPDK 與 OVS 結合使用可爲我們帶來諸多性能優勢。 與其他基於 DPDK 的應用相同,我們可以在 OVS 中看到網絡包吞吐量顯著提升,延遲顯著降低。
此外,DPDK 包處理庫還對 OVS 內的多個性能熱點區域進行了優化。 例如,轉發平面進行了優化,能夠作爲單獨的 vSwitch 後臺程序線程在用戶空間內運行(虛擬交換)。 實施 DPDK 優化的 vHost 客戶機界面,虛擬機-虛擬機或物理機-虛擬機-物理機類型使用案例可獲得出色的性能。
在本文中,我們將逐步展示如何面向虛擬機間應用使用案例配置採用 DPDK 的 OVS。 具體來說,我們將創建一個帶有兩個 DPDK vhost-user 端口的 OVS vSwitch 橋。 每個端口與一個虛擬機相連。 然後,我們將運行一個簡單的 iperf3 吞吐量測試來確定性能。 我們將該性能與非 DPDK OVS 配置的性能進行比較,以便觀察採用 DPDK 的 OVS 能爲我們帶來多少性能提升。
Open vSwitch 可通過常見 Linux* 發行版本上的標準包安裝程序進行安裝。 但是系統在默認情況下未啓用 DPDK 支持,我們需要使用 DPDK 構建 Open vSwitch 纔可以繼續。
安裝和使用採用 DPDK 的 OVS 的具體步驟:https://github.com/openvswitch/ovs/blob/master/INSTALL.DPDK.md。
在本文中,我們將介紹基本步驟,尤其是 DPDK vhost-user 使用案例。
OVS 和 DPDK 要求
在編譯 DPDK 或 OVS 前,確保您滿足全部要求:
http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html#compilation-of-the-dpdk
標準 Linux 分發版中的開發工具包通常能夠滿足大部分要求。
比如,在基於 yum (或基於 dnf)的分發版上,您可以使用以下安裝命令:
yum install "@Development Tools" automake tunctl kernel-tools "@Virtualization Platform" "@Virtualization" pciutils hwloc numactl
此外,還需確保系統上的 qemu 版本是 v2.2.0 或更高版本,如https://github.com/openvswitch/ovs/blob/master/INSTALL.DPDK.md 中的“DPDK
vhost-user 前提條件”
面向 OVS 構建 DPDK 目標
如要構建採用 DPDK 的 OVS,我們需要下載 DPDK 源代碼並準備其目標環境。 關於 DPDK 使用的更多詳細信息,請參閱:http://www.dpdk.org/doc/guides/linux_gsg/index.html。
以下代碼片段展示了基本步驟:
1 |
curl - O
http: / / dpdk.org / browse / dpdk / snapshot / dpdk - 2.1 . 0.tar .gz |
2 |
tar - xvzf
dpdk - 2.1 . 0.tar .gz |
5 |
sed 's/CONFIG_RTE_BUILD_COMBINE_LIBS=n/CONFIG_RTE_BUILD_COMBINE_LIBS=y/' - i
config / common_linuxapp |
6 |
make
install T = x86_64 - ivshmem - linuxapp - gcc |
7 |
cd
x86_64 - ivshmem - linuxapp - gcc |
8 |
EXTRA_CFLAGS = "-g
-Ofast" make - j10 |
Building OVS with DPDK
藉助 DPDK 目標環境 built,我們現在可以下載最新的 OVS 源,並將其與支持的 DPDK 構建起來。 採用 DPDK build 的 OVS 的標準文檔:https://github.com/openvswitch/ovs/blob/master/INSTALL.DPDK.md。
在下文中,我們將介紹基本步驟。
1 |
git
clone https: / / github.com / openvswitch / ovs.git |
5 |
. / configure - - with - dpdk = "$DPDK_DIR/x86_64-ivshmem-linuxapp-gcc/" CFLAGS = "-g
-Ofast" |
6 |
make 'CFLAGS=-g
-Ofast -march=native' - j10 |
現在,我們已經獲得帶 DPDK 支持的完整 OVS built。 所有的標準 OVS 實用程序均位於 $OVS_DIR/utilities/ 下和 $OVS_DIR/ovsdb/ 下的 OVS DB。 我們將使用上述位置下的實用程序來完成接下來的步驟。
創建 OVS DB 並啓動 ovsdb-server
在開始主要的 OVS 後臺程序 “ovs-vswitchd” 前,我們需要初始化 OVS DB 並啓動 ovsdb-server。 以下命令展示瞭如何清除或創建一個新的 OVS DB 和 ovsdb_server 實例。
02 |
rm - rf / usr / local / var / run / openvswitch |
03 |
rm - rf / usr / local / etc / openvswitch / |
04 |
rm - f / usr / local / etc / openvswitch / conf.db |
05 |
mkdir - p / usr / local / etc / openvswitch |
06 |
mkdir - p / usr / local / var / run / openvswitch |
08 |
. / ovsdb / ovsdb - tool
create / usr / local / etc / openvswitch / conf.db
. / vswitchd / vswitch.ovsschema |
09 |
. / ovsdb / ovsdb - server - - remote = punix: / usr / local / var / run / openvswitch / db.sock - - remote = db:Open_vSwitch,Open_vSwitch,manager_options - - pidfile - - detach |
10 |
. / utilities / ovs - vsctl - - no - wait
init |
配置用於 OVS DPDK 的主機和網卡
DPDK 需要使用主機系統來支持 hugepage,並且需要啓用網卡以便配合用戶空間 DPDK 輪詢模式驅動程序 (PMD) 使用。
爲支持 hugepage 並使用 VFIO 用戶空間驅動程序,將參數附加至下列 /etc/default/grub 中的 GRUB_CMDLINE_LINUX,然後運行 grub 更新並重啓系統:
1 |
default_hugepagesz = 1G hugepagesz = 1G hugepages = 16 hugepagesz = 2M hugepages = 2048 iommu = pt
intel_iommu = on
isolcpus = 1 - 13 , 15 - 27 |
2 |
grub2 - mkconfig - o / boot / grub2 / grub.cfg |
hugepage 的數量和類型可根據系統中的可用內存進行調整。 isolcpus
參數支持我們將某些 CPU 與 Linux 調度程序隔離,以便基於 DPDK 的應用能夠鎖定到這些 CPU 上。
重啓系統後,查看內核 cmdline 並按照如下方式分配 hugepage。
接下來是安裝 hugepage 文件系統,加載 vfio-pci
用戶空間驅動程序。
3 |
mount - t
hugetlbfs hugetlbfs / mnt / huge |
4 |
mount - t
hugetlbfs none / mnt / huge_2mb - o
pagesize = 2MB |
7 |
cp
$DPDK_DIR / tools / dpdk_nic_bind.py / usr / bin / . |
8 |
dpdk_nic_bind.py - - status |
9 |
dpdk_nic_bind.py - - bind = vfio - pci 05 : 00.1 |
以下截圖展示了使用上述命令編寫的樣本輸出。
如果目標使用案例僅爲虛擬機-虛擬機,不使用任何物理 NIC,那麼我們可以跳過上述的 NIC vfio-pci 步驟。
開始 ovs-vswitchd
我們配置了 OVS DB,並面向 OVS DPDK 用途設置了主機。 接下來是啓動主要 ovs-vswitchd 流程。
2 |
$OVS_DIR / vswitchd / ovs - vswitchd - - dpdk - c 0x2 - n 4 - - socket - mem 2048 - - unix: / usr / local / var / run / openvswitch / db.sock - - pidfile - - detach |
面向虛擬機間使用案例創建一個橋和 DPDK vhost-user 端口。
對於我們的示例測試案例,我們將創建一個橋並添加兩個 DPDK vhost-user 端口。 或者,我們可以添加之前配置的 vfio-pci 物理網卡。
1 |
$OVS_DIR/utilities/ovs-vsctl
show |
2 |
$OVS_DIR/utilities/ovs-vsctl
add-br br0 -- set bridge br0 datapath_type=netdev |
3 |
$OVS_DIR/utilities/ovs-vsctl
add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk |
4 |
$OVS_DIR/utilities/ovs-vsctl
add-port br0 vhost-user1 -- set Interface vhost-user1 type=dpdkvhostuser |
5 |
$OVS_DIR/utilities/ovs-vsctl
add-port br0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser |
下面的截圖展示了最終的 OVS 配置。
使用帶虛擬機的 DPDK vhost-user 端口
創建虛擬機不在本文的討論範圍。 我們創建兩個虛擬機(如 f21vm1.qcow2 和 f21vm2.qcow2)後,以下的命令將會顯示如何使用我們之前創建的 DPDK vhost-user 端口。
01 |
qemu - system - x86_64 - m 1024 - smp 4 - cpu
host - hda
~ / f21vm1.qcow2 - boot
c - enable - kvm - no - reboot - nographic - net
none \ |
02 |
- chardev
socket, id = char1,path = / usr / local / var / run / openvswitch / vhost - user1
\ |
03 |
- netdev type = vhost - user, id = mynet1,chardev = char1,vhostforce
\ |
04 |
- device
virtio - net - pci,mac = 00 : 00 : 00 : 00 : 00 : 01 ,netdev = mynet1
\ |
05 |
- object memory - backend - file , id = mem,size = 1024M ,mem - path = / dev / hugepages,share = on
\ |
06 |
- numa
node,memdev = mem - mem - prealloc |
08 |
qemu - system - x86_64 - m 1024 - smp 4 - cpu
host - hda
~ / f21vm2.qcow2 - boot
c - enable - kvm - no - reboot - nographic - net
none \ |
09 |
- chardev
socket, id = char1,path = / usr / local / var / run / openvswitch / vhost - user2
\ |
10 |
- netdev type = vhost - user, id = mynet1,chardev = char1,vhostforce
\ |
11 |
- device
virtio - net - pci,mac = 00 : 00 : 00 : 00 : 00 : 02 ,netdev = mynet1
\ |
12 |
- object memory - backend - file , id = mem,size = 1024M ,mem - path = / dev / hugepages,share = on
\ |
13 |
- numa
node,memdev = mem - mem - prealloc |
使用 iperf3 進行簡單測試獲得的 DPDK vhost-user 虛擬機間性能
登錄虛擬機,並在同一個子網上使用靜態 IP 配置 NIC。 安裝 iperf3
,然後運行簡單的網絡測試。
在一個虛擬機上,在服務器模式 iperf3 -s
下啓動 iperf3
,然後運行客戶機 iperf3
。
下面的截圖展示了示例結果。
複製標準 OVS 的性能測試(不帶 DPDK)
在上面的部分中,我們在 $OVS_DIR 文件夾內創建並使用了 OVS-DPDK build;我們沒有將其安裝在系統上。 對於複製使用標準 OVS (非 DPDK)的測試案例,我們只需要從標準發行安裝程序進行安裝即可。 例如,在基於 yum (或基於 dnf)的系統上,我們可以按照如下方式安裝:
03 |
yum
install openvswitch |
05 |
rm
-f /etc/openvswitch/conf.db |
06 |
mkdir
-p /var/run/openvswitch |
07 |
ovsdb-tool
create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema |
08 |
ovsdb-server
--remote=punix:/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach |
09 |
ovs-vsctl
--no-wait init |
11 |
ovs-vswitchd
unix:/var/run/openvswitch/db.sock --pidfile --detach |
此時,我們已經配置了更新 OVS DB,並啓動了非 DPDK ovs-vswitchd 流程。
如要在使用非 DPDK OVS 橋 (br0) 連接的設備上配置兩個虛擬機,請參考http://openvswitch.org/support/dist-docs-2.4/INSTALL.KVM.md.txt 中的說明。
然後使用我們之前使用的映像啓動虛擬機,例如:
1 |
qemu-system-x86_64
-m 512 -smp 4 -cpu
host -hda ~/f21vm1c1.qcow2 -boot c -enable-kvm -no-reboot -nographic -net nic,macaddr= 00 : 11 : 22 :EE:EE:EE
-net tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown |
3 |
qemu-system-x86_64
-m 512 -smp 4 -cpu
host -hda ~/f21vm1c2.qcow2 -boot c -enable-kvm -no-reboot -nographic -net nic,macaddr= 00 : 11 : 23 :EE:EE:EE
-net tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown |
重複我們之前操作的簡單 iperf3
性能測試。 以下是示例輸出;您的具體結果取決於您的系統配置。
如上文所示,我們注意到,OVS DPDK 的性能得到顯著提升。 兩個性能測試均在相同的系統上執行,唯一的區別是一個使用標準 OVS,另一個使用採用 DPDK 的 OVS。
總結
Open vSwitch 2.4 版支持 DPDK,能夠帶來諸多性能優勢。 在本文中,我們展示瞭如何構建並使用採用 DPDK 的 OVS。 我們介紹瞭如何配置一個簡單的 OVS 橋,其中包括面向虛擬機間應用使用案例配置的 DPDK vhost-user 端口。 我們以 iperf3 爲測試基準,對採用和未採用 DPDK 的 OVS 進行了比較,並展示了前者的性能提升。
關於作者
Ashok Emani 是英特爾公司的高級軟件工程師,在生成嵌入式/系統編程、存儲/I/O 技術、計算機架構、虛擬化和性能分析/基準測試方面有超過 14 年的工作經驗。 他目前正在從事 SDN/NFV 支持項目。