在 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 基於 c/s 的模式,採用 unix 域套接字(unix domain socket)來完成程序間的事件通知和資料互動,相比 vhost 中採用 ioctl 的方式,vhost-user 採用 socket 的方式大大簡化了操作。
vhost-user 基於 vring 這套通用的共享記憶體通訊方案,只要 client 和 server 按照 vring 提供的介面實現所需功能即可,常見的實現方案是 client 實現在 guest os 中,一般是整合在 virtio 驅動上,server 端實現在 qemu 中,也可以實現在各種資料麵中,如 ovs,snabbswitch 等虛擬交換機。
如果使用 qemu 作為 vhost-user 的 server 端實現,在啟動 qemu 時,我們需要指定 -mem-path 和 -netdev 引數,如:
$ qemu -m 1024
-mem-path /hugetlbfs,prealloc=on,share=on \
-netdev type=vhost-user,id=net0,file=
/path/to/socket \
-device virtio-net-pci,netdev=net0
指定 -mem-path 意味著 qemu 會在 guest os 的記憶體中建立乙個檔案,share=on 選項允許其他程序訪問這個檔案,也就意味著能訪問 guest os 記憶體,達到共享記憶體的目的。
-netdev type=vhost-user 指定通訊方案,file=/path/to/socket 指定 socket 檔案。
當 qemu 啟動之後,首先會進行 vring 的初始化,並通過 socket 建立 c/s 的共享記憶體區域和事件機制,然後 client 通過 eventfd 將 virtio kick 事件通知到 server 端,server 端同樣通過 eventfd 進行響應,完成整個資料互動。
使用:
$ git clone https:
/$ make
// 執行 server 端
$ ./vhost -s .
/vhost.sock
// 執行 client 端
$ ./vhost -q .
/vhost.sock
通過以上步驟,就可以啟動 vhost-user 的 c/s 模式。
另外還有例子就是整合在虛擬交換機 snabbswitch 上的 vhost-user,通過以下方式獲得 vhost-user 分支:
測試:還有例子就是 qemu 上的實現,這也是最原早的實現,同樣通過以下方式來獲得使用:
除此之外,還有很多的實現,如 ovs 和 dpdk 上都有實現,這實際上是整合了 vhost-user 的通用 api。
virtio,vhost,vhost-user 是基於場景和效能而提出的三種 guest 和 host 之間的通訊方案,三種方案,各有優劣。
vhost-user 用在很多資料面之上的程序間通訊,效率高。
HugePage簡介和KVM中使用HugePage
在 kvm的 測試中,有一項是要測試huge page的使用,所以對huge page 巨頁 做了一些了解,結合網上的一些資料進行總結一下。現在,有許多的處理器架構都支援多種的 記憶體 頁大小,其中就包括比一般的page size大很多的huge page。就目前來說,儘管在個人電腦中基本都實現了對...
HugePage簡介和KVM中使用HugePage
現在,有許多的處理器架構都支援多種的記憶體頁大小,其中就包括比一般的page size大很多的huge page。就目前來說,儘管在個人電腦中基本都實現了對huge page的支援,然而,huge page的使用主要還是在一些大型伺服器和計算機集群中使用。1,一般的記憶體頁查詢 getconf pa...
kvm架構伺服器 AWS Nitro架構簡介
aws amazon web services nitro架構為amazon的雲服務提供了底層的支援。nitro架構的總體設計思想是 輕量化的hypervisor配合定製化的硬體,讓使用者無法區分出執行在虛擬機器內和執行在裸金屬上作業系統的效能差異。為了實現定製化的硬體 asic amazon和以色...