在虛擬機間 NFV 應用上使用採用 DPDK 的 Open vSwitch*

概述

數據平面開發套件 (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
3 cd dpdk-2.1.0
4 export DPDK_DIR=`pwd`
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
2 cd ovs
3 export OVS_DIR=`pwd`
4 ./boot.sh
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 實例。

01 pkill -9 ovs
02 rm -rf /usr/local/var/run/openvswitch
03 rm -rf /usr/local/etc/openvswitch/
04 rm -/usr/local/etc/openvswitch/conf.db
05 mkdir -/usr/local/etc/openvswitch
06 mkdir -/usr/local/var/run/openvswitch
07 cd $OVS_DIR
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 -/boot/grub2/grub.cfg
3 reboot

hugepage 的數量和類型可根據系統中的可用內存進行調整。 isolcpus 參數支持我們將某些 CPU 與 Linux 調度程序隔離,以便基於 DPDK 的應用能夠鎖定到這些 CPU 上。

重啓系統後,查看內核 cmdline 並按照如下方式分配 hugepage。

接下來是安裝 hugepage 文件系統,加載 vfio-pci 用戶空間驅動程序。

1 mkdir -/mnt/huge
2 mkdir -/mnt/huge_2mb
3 mount -t hugetlbfs hugetlbfs /mnt/huge
4 mount -t hugetlbfs none /mnt/huge_2mb -o pagesize=2MB
5  
6 modprobe vfio-pci
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 流程。

1 modprobe openvswitch
2 $OVS_DIR/vswitchd/ovs-vswitchd --dpdk -0x2 -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 -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
07  
08 qemu-system-x86_64 -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)的系統上,我們可以按照如下方式安裝:

01 pkill -9 ovs
02  
03 yum install openvswitch
04  
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
10  
11 ovs-vswitchd unix:/var/run/openvswitch/db.sock --pidfile --detach
12  
13 ovs-vsctl add-br br0
14 ovs-vsctl show

此時,我們已經配置了更新 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
2  
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 支持項目。

發佈了10 篇原創文章 · 獲贊 2 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章