OVS DPDK介紹(四)

DPDK簡介

DPDK是X86平臺報文快速處理的庫和驅動的集合,不是網絡協議棧,不提供二層,三層轉發功能,不具備防火牆ACL功能,但通過DPDK可以輕鬆的開發出上述功能。

DPDK的優勢在於,可以將用戶態的數據,不經過內核直接轉發到網卡,實現加速目的。主要架構如圖所示:
在這裏插入圖片描述

傳統的socket方式與DPDK對比:

在這裏插入圖片描述

DPDK關鍵技術點:

  1. 使用大頁緩存支持來提高內存訪問效率。
  2. 利用UIO支持,提供應用空間下驅動程序的支持,也就是說網卡驅動是運行在用戶空間的,減小了報文在用戶空間和應用空間的多次拷貝。
  3. 利用LINUX親和性支持,把控制面線程及各個數據面線程綁定到不同的CPU核,節省了線程在各個CPU核來回調度。
  4. LOCKLESS,提供無鎖環形緩存管理,加快內存訪問效率。
  5. 收發包批處理 ,多個收發包集中到一個cache line,在內存池中實現,無需反覆申請和釋放。
  6. PMD驅動,用戶態輪詢驅動,可以減小上下文切換開銷,方便實現虛擬機和主機零拷貝。

OVS+DPDK

OpenvSwitch 以其豐富的功能,作爲多層虛擬交換機,已經廣泛應用於雲環境中。Open vSwitch的主要功能是爲物理機上的VM提供二層網絡接入,和雲環境中的其它物理交換機並行工作在Layer 2。

傳統host ovs工作在內核態,與guest virtio的數據傳輸需要多次內核態和用戶態的數據切換, 帶來性能瓶頸。

Ovs+Dpdk和Ovs本身之間的區別可以由下圖簡單來表示:
在這裏插入圖片描述
在早期OVS的版本中,爲緩解多級流表查錶慢的問題,OVS在內核態採用Microflow Cache方法。Microflow Cache是基於Hash的精確匹配查表(O(1)),表項緩存了多級查表的結果,維護的是每條鏈接粒度的狀態。Microflow Cache減少了報文進用戶態查多級表的次數。一條流的首報文進入用戶態查表後,後續的報文都會命中內核中的Microflow Cache,加快了查錶速度。但是對於大量短流的網絡環境來說,Microflow Cache命中率很低,導致大部分報文仍然需要到用戶態進行多級流表查找,因此轉發性能提升有限。

而後,爲了解決Mircoflow Cache存在的問題,OVS採用Megaflow Cache代替了Mircoflow Cache。與Mircoflow Cache的精確Hash查表不同,Megaflow Cache支持帶通配的查表,所以可減少報文至用戶空間查表的次數。庾志輝的博客中當時分析的就是關於megaflow的數據結構和查表流程,相關內容不在此贅述,請看上文中的鏈接。但是,由於OVS採用元組空間搜索(下文介紹)實現Megaflow Cache的查找,所以平均查表次數爲元組表的數量的一半。假設元組空間搜索的元組錶鏈爲m,那麼平均查表開銷爲O(m/2)。Mircoflow Cache和Megaflow Cache查表開銷對比爲O(1)< O(m/2)。因此,Megaflow Cache相比於Mircoflow Cache,儘管減少了報文進用戶空間查表的次數,但是增加了報文在內核態查表的次數。

爲此,OVS當前版本採用Megaflow Cache+Microflow Cache的流Cache組織形式,仍保留了Microflow Cache作爲一級Cache,即報文進入後首先查這一級Cache。只不過這個Microflow Cache含義與原來的Microflow Cache不同。原來的Microflow Cache是一個實際存在的精確Hash表,但是最新版本中的Microflow Cache不是一個表,而是一個索引值,指向的是最近一次查Megaflow Cache表項。那麼報文的首次查表就不需要進行線性地鏈式搜索,可直接對應到其中一張Megaflow的元組表。這三個階段的查表開銷如表所示。
在這裏插入圖片描述
DPDK 高性能(user space) 網卡驅動、大頁內存、無鎖化結構設計,可以輕易實現萬兆網卡線速的性能。ovs-dpdk使vm到vm和nic到vm的整個數據傳輸都工作在用戶態,極大的提升了ovs的性能。

另外,ovs-dpdk 結合了DPDK和vhost-user技術的優勢。vhost-user是一個用戶態的vhost-backend程序,從虛擬機到host上實現了數據零拷貝(zero copy)。

原生ovs與ovs-dpdk比較

原生ovs數據流處理過程如下:

在這裏插入圖片描述

  1. 數據包到達網卡後,上傳給Datapath;
  2. Datapath會檢查緩存中的精確流表是否可以直接轉發這個包,如果在緩存中沒有找到記錄,內核通過netlink發送一個upcall給用戶空間的vswitchd;
  3. vswitchd檢查數據庫以查看數據包的目的端口在哪裏。這裏要操作openflow流表,需要和ovsdb以及ovs-ofctl交互;
  4. 刷新內核態流表內容;
  5. Reinject給datapath,重發數據包;
  6. 再次查詢流表,獲取數據包精確轉發規則後,按規則轉發

ovs-dpdk方式:

在這裏插入圖片描述
用戶態進程直接接管網卡收發數據,採用“IO獨佔核”技術,即每個端口分配一個核專門用於數據收發,輪詢式處理方式代替中斷式處理,顯著提高IO性能。

總結:

比較 原生ovs ovs-dpdk
host收發包 通過host的linux內核訪問網卡 通過dpdk高速數據通道收發包
內部交換 在內核態datapath進行交換 基於ovs,提供dpdk datapath的交換能力
vm後端驅動 使用vni,基於開源tap進行優化 vhost-user
vm前端驅動 標準virtio設備 標準virtio設備
交換路徑 2個線程:物理網卡(中斷機制)->轉發線程->放到tap設備隊列->vhost_net取包送給vcpu 1個線程:物理網卡(DPDK DPM)->轉發線程->送給vcpu

使用ovs-dpdk

在這裏插入圖片描述
硬件要求

網卡得支持DPDK,見:http://dpdk.org/doc/nics
CPU得支持DPDK, 測試命令:cat /proc/cpuinfo |grep pdpe1gb
不一定非要支持DPDK硬件的網卡,因爲DPDK也支持virtio dpdk driver.
在這裏插入圖片描述
打開大頁支持

hua@node1:~$ cat  /etc/default/grub |grep GRUB_CMDLINE_LINUX
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on pci=assign-busses"
GRUB_CMDLINE_LINUX="transparent_hugepage=never hugepagesz=2M hugepages=64 default_hugepagesz=2M"

hua@node1:~$ mkdir /mnt/huge
hua@node1:~$ mount -t hugetlbfs nodev /mnt/huge
hua@node1:~$ echo 8192 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
hua@node1:~$ cat /proc/meminfo |grep HugePages_
HugePages_Total:       8192
HugePages_Free:        8192
HugePages_Rsvd:        0
HugePages_Surp:        0
hua@node1:~$ grep Hugepagesize /proc/meminfo
Hugepagesize:       2048 kB

配置網卡使用uio_pci_generic驅動, 虛機可以使用PF去做DPDK port,也可以直通方式使用VF:
在這裏插入圖片描述
至於PF的驅動,可以使用ixgbe,也可以使用DPDK PF driver;對於VF的驅動,可以使用ixgbefv,也可以使用DPDK VF driver. 如果要使用DPDK PF driver需在grub中加上iommu=pt.

如下方式也可以通信:
在這裏插入圖片描述
測試場景搭建

sudo ovs-vsctl ovsbr0 br-int
sudo ovs-vsctl set bridge ovsbr0 datapath_type=netdev
sudo ovs-vsctl add-port ovsbr0 dpdk0 -- set Interface dpdk0 type=dpdk  #Port name shoud begin with dpdk

# 給虛機創建普通ovs port:
sudo ovs-vsctl add-port ovsbr0 intP1 -- set Interface intP1 type=internal
sudo ip addr add 192.168.10.129/24 dev intP1
sudo ip link set dev intP1 up
sudo tcpdump -i intP1​

# 或給虛機創建vhost-user port:
sudo ovs-vsctl add-port ovsbr0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser

# 虛機使用vhost-user port
sudo qemu-system-x86_64 -enable-kvm -m 128 -smp 2 \
    -chardev socket,id=char0,path=/var/run/openvswitch/vhost-user1 \
    -netdev type=vhost-user,id=mynet1,chardev=char0,vhostforce \
    -device virtio-net-pci,netdev=mynet1,mac=52:54:00:02:d9:01 \
    -object memory-backend-file,id=mem,size=128M,mem-path=/mnt/huge,share=on \
    -numa node,memdev=mem -mem-prealloc \
    -net user,hostfwd=tcp::10021-:22 -net nic \
    /bak/images/openstack_demo.img

# Inside VM: 
sudo ifconfig eth0 192.168.9.108/24

使用vhost-user方式示意圖如下:
在這裏插入圖片描述
dpdk-virtio-net
在這裏插入圖片描述

原文鏈接:https://blog.csdn.net/qq_15437629/article/details/77887910

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