DPDK vhost-user研究(二十五)

Virtio/Vhost是什麼

Vhost/Virtio是一種半虛擬化的設備抽象接口規範, 在Qemu和KVM中的得到了廣泛的應用,在客戶機操作系統中實現的前端驅動程序一般直接叫Virtio, 在宿主機實現的後端驅動程序稱爲Vhost。與宿主機純軟件模擬I/O相比,virtio可以獲得很好的性能,在數據中心中得到了廣泛的應用。

Vhost有兩種實現:內核態和用戶態

內核態實現

在這裏插入圖片描述
vhost_net將部分的Virtio驅動從用戶空間(其實是QEMU中)移到了kernel中,從而跳過QEMU,減少QEMU和內核之間的上下文切換開銷,從而提升網絡IO的性能。

通過在內核態增加了一個vhost驅動,與virtio相比,只需要進行一次用戶態內核態切換(因爲內核態的vhost-net.ko可以直接訪問內核態的TAP設備,少了一次切換),另外,由於引入vhost技術共享了虛擬機的網卡緩衝區也省了一次數據拷貝(vhost-net.ko充當vhost backend,kvm.ko充當vhost client)。

用戶態實現

vhost_user是將vhost_net驅動移動到用戶態來實現零切換和零拷貝,從而進一步提升性能。一些實現了vhost backend的交換機(如snabbswitch)直接在用戶態從vhost共享的虛擬機網卡緩存區virtio-ring中把網絡數據進行讀取,然後snabbswtich又實現了SR-IOV的物理網卡驅動直接將讀到的虛擬機網絡數據送到物理網卡上,從而大大提升了性能。
在這裏插入圖片描述

DPDK的實現

dpdk對虛擬化環境也是一個逐步支持的過程,不同的版本實現的功能不盡相同,具體的發展歷程可以參考下圖:

在這裏插入圖片描述從最初版本的guest virtio PMD + kernel vhost_net發展至今,主機端實現用戶態的vhost user,guest端採用virtio PMD。架構已經基本定型,後期的工作主要集中在性能優化和穩定性兩個方面。用戶態的vhost其原理和內核態的vhost-net類似,實現了用戶態API,卸載了QEMU在Virtio-net上所承載的虛擬隊列功能,同時基於QEMU共享內存空間、虛擬化隊列的訪問地址和事件文件描述符,使得vhost能夠進行報文處理以及與guest通信。

DPDK的vhost包含的基本功能有:

  • virtio-net網絡設備管理,包括設備的創建和銷燬
  • 虛擬隊列中描述符列表、可用環表和已用環表在vhost進程的虛擬地址空間的映射和解除,以及實際的數據報文緩衝區的映射和解除
  • 收到報文時,通知guest;發送報文時,接收來自guest的消息通知
  • 虛擬隊列和實際的物理網卡間的報文交換。可使用VMDQ機制對報文進行分類和排序,避免軟件方式的報文交換
  • virtio-net後端設備的實現以及部分新特性實現:如支持多隊列,TSO,支持巨型幀等等

先看下OVS+DPDK的概念,傳統的vSwitch要使用kernel來完成轉發面的實現以及和物理NIC的對接;在OVS+DPDK方案中,完全bypass 內核,通過dpdk + PMD來實現之前kernel提供的功能,從而將所有的功能都一直到用戶態來實現。

在這裏插入圖片描述基於這樣的方案來實現的VNFs示意圖就可以如下:
在這裏插入圖片描述
在這裏插入圖片描述
擴散:

當然除了上述VNFs部署方式,還可以採用下面的方式來部署:
在這裏插入圖片描述
這種部署方式需要NIC支持SR-IOV,同時在VNF中運行VF PMD。 這種方式的優點是性能高,相當於直接從物理網卡中讀取報文;缺點是對硬件有依賴,而且動態遷移比較麻煩。

來比較下在雲環境不同實現方式路徑(性能從左到右逐漸提升):
在這裏插入圖片描述

參考鏈接:https://www.redhat.com/en/blog/boosting-nfv-datapath-rhel-openstack-platform

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