virtio後端--vhost-user

virtio,vhost,vhost-user 是基於場景和性能而提出的三種 guest 和 host 之間的通信方案,三種方案,各有優劣。

在 vhost 的方案中,由於 vhost 實現在內核中,guest 與 vhost 的通信,相較於原生的 virtio 方式性能上有了一定程度的提升,從 guest 到 kvm.ko 的交互只有一次用戶態的切換以及數據拷貝。這個方案對於不同 host 之間的通信,或者 guest 到 host nic 之間的通信是比較好的,但是對於某些用戶態進程間的通信,比如數據面的通信方案,openvswitch 和與之類似的 SDN 的解決方案,guest 需要和 host 用戶態的 vswitch 進行數據交換,如果採用 vhost 的方案,guest 和 host 之間又存在多次的上下文切換和數據拷貝,爲了避免這種情況,業界就想出將 vhost 從內核態移到用戶態。這就是 vhost-user 的實現。

vhost-user 和 vhost 的實現原理是一樣,都是採用 vring 完成共享內存,eventfd 機制完成事件通知。不同在於 vhost 實現在內核中,而 vhost-user 實現在用戶空間中,用於用戶空間中兩個進程之間的通信,其採用共享內存的通信方式。
這裏寫圖片描述
vhost-user是vhost-kernel又回到用戶空間的實現,其基本思想和vhost-kernel很類似,不過之前在內核的部分現在有另外一個用戶進程代替,可能是snapp或者dpdk等。雖然和vhost-kernel實現的目標一致,但是具體的實現方式卻有所不同。vhost-user下,UNIX本地socket代替了之前kernel模式下的設備文件進行進程間的通信(qemu和vhost-user app),而通過mmap的方式把ram映射到vhost-user app的進程空間實現內存的共享。其他的部分和vhost-kernel原理基本一致。這種情況下一般qemu作爲client,而vhost-user app作爲server如DPDK。而本文對於vhost-user server端的分析主要也是基於DPDK源碼。本文主要分析涉及到的三個重要機制:qemu和vhost-user app的消息傳遞,guest memory和vhost-user app的共享,guest和vhost-user app的通知機制。

消息機制

當使用vhost-user時,需要在系統中創建一個unix domain socket server,用來處理qemu發送給host的消息。
如果有新的socket連接,說明guest創建了新的virtio-net設備,vhost驅動會爲之創建一個vhost設備,之後qemu就可以通過socket和vhost進行通信了;當socket關閉,vhost就會銷燬對應的設備。

一旦連接建立了,DPDK vhost-user將會啓動接收並處理來自QEMU的vhost消息。
對於文件描述符的消息,文件描述符可以直接在vhost進程裏,當它已經通過 Unix domain socket安裝了。
支持如下的vhost消息:

VHOST_SET_MEM_TABLE
VHOST_SET_VRING_KICK
VHOST_SET_VRING_CALL
VHOST_SET_LOG_FD
VHOST_SET_VRING_ERR

對於VHOST_SET_MEM_TABLE消息,QEMU會發送每一個內存區域的信息並且它的文件描述符在這個消息的輔助數據裏。這個文件描述就是用來映射這塊內存區域的。

VHOST_SET_VRING_KICK用來作爲信號將vhost設備放入到數據平面,VHOST_GET_VRING_BASE作爲信號去數據平面刪除vhost設備。
當socket連接關閉時,vhost會刪除這個設備。

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