dpdk vhost研究(一)
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部署方式,還可以採用下面的方式來部署:
來比較下在雲環境不同實現方式路徑(效能從左到右逐漸提升):
下一講會重點分析dpdk的實現程式碼相關,請關注。
參考連結:1. https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Virtualization_Tuning_and_Optimization_Guide/sect-Virtualization_Tuning_Optimization_Guide-Networking-Virtio_and_vhostnet.html
2.http://syswift.com/202.html
3.http://chuansong.me/n/2186528
4.http://redhatstackblog.redhat.com/2016/02/10/boosting-the-nfv-datapath-with-rhel-openstack-platform/