本文參考下面這篇論文,只挑取了其中關於 OVS 和 OVS-DPDK 對比的部分進行講解,更多內容,大家有興趣可以看論文:
https://networkbuilders.intel.com/docs/open-vswitch-enables-sdn-and-nfv-transformation-paper.pdf
OVS 目前有兩種比較突出的架構,一種是原生的 OVS 架構(使用 kernel 作爲 datapath),一種是基於 DPDK 的架構(使用用戶空間作爲 datapath)。
原生 OVS
原生 OVS 架構如下所示,主要包含兩個組件:
openvswitch.ko :在內核態負責快速路徑的數據轉發。轉發靠流表來完成,每一個流表都包含很多的匹配項(match fields)和相應的動作(actions)
match fields : 定義了能夠標識一個數據包的頭部字段
actions : 定義了能夠對這個數據包操作的動作,比如添加或去除 VLAN 標籤、修改數據包的某個頭部字段,以及控制數據包從端口的進出等等。
ovs-vswitchd :在用戶態負責慢速路徑的數據轉發。
ofproto: 實現 OpenFlow 交換機
netdev: 和網絡設備(包括物理的和虛擬的)交互的抽象接口層
dpif: 用戶空間數據轉發路徑的實現
OVS-DPDK
基於 DPDK 的 OVS 架構如下所示,其中深色部分的模塊就是引入 DPDK 相關的模塊。
dpif-netdev : 用戶空間中快速路徑的實現,它實現了
dpif
模塊 API,可以直接操作netdev
設備,能夠實現數據包在用戶空間的快速處理,減少和內核空間的切換開銷。ofproto-dpif : 實現了
ofproto
模塊 API,直接操作dpif
層。netdev-dpdk : 使用 DPDK 庫實現了
netdev
模塊 API,提供了多種類型的接口,如下:Physical ports(PMDs) : 使用
vfio
或者igb_uio
實現的端口dpdkvhostuser and dpdkvhostcuse: 使用
librte_vhost
庫實現的端口,用戶可以基於這兩種端口類型創建vhost-user
和vhost-cuse
端口來完成用戶空間的數據轉發,並且能夠實現和 VM 的快速通信,只要提供 virtio 後端驅動 vhost 即可,virtio/vhost 被證實是用於 VM 通信的一套快速、安全、標準的接口。dpdkr: 使用
librte_ring
實現,用戶可以基於這種端口類型創建dpdk-ring
端口來完成用戶空間的數據轉發,它能夠實現和 VM 之間快速的零拷貝通信(使用 IVSHMEM 或者其他進程間通信方式)
兩種架構性能對比
那麼這兩種架構哪種性能更佳呢,不用說,當然是 OVS-DPDK,我們用數據說話,看下下面這份 Intel 做的性能報告(時間是 2015 年,但也具備參考性)。
首先是實驗環境參數:
然後看實驗拓撲圖,包括 physical-to-physical
和 physical-to-virtual-to-physical
兩種拓撲:
最後再來看性能對比:
同樣包括 physical-to-physical
和 physical-to-virtual-to-physical
兩種場景:
可以看到,P2P 的場景,OVS-DPDK 比原生 OVS 性能提高差不多 12 倍。
對於 PVP 的場景,我們增加單核和多核的實驗觀察,單核的情況,OVS-DPDK 比原生 OVS 提高 7 倍,雙核的情況提高接近 13 倍。
基於 DPDK 的 VNF 使用 OVS 作爲數據面
基於 OVS-DPDK 的 VNF 架構如下圖所示:
DPDK 在其中既加速 OVS 數據平面,又加速 VNF 應用,這種方案由於採用純軟件的形式實現,可編程靈活,DPDK 的參與也使得性能大大提高,基本可以媲美純硬件的形式。
後臺回覆“加羣”,帶你進入高手如雲交流羣
推薦閱讀:
晉升、面試中繞不開的性能優化問題
史上最全Linux面試題(2020最新版)
▼
喜歡,就給我一個“在看”
10T 技術資源大放送!包括但不限於:雲計算、虛擬化、微服務、大數據、網絡、Linux、Docker、Kubernetes、Python、Go、C/C++、Shell、PPT 等。在公衆號內回覆「1024」,即可免費獲取!!