vhost:一種 virtio 高性能的後端驅動實現

本文首發於個人公衆號 Linux雲計算網絡(id: cloud_dev),專一於乾貨分享,號內有 10T 書籍和視頻資源,後臺回覆「1024」便可領取,歡迎你們關注,二維碼文末能夠掃。前端

什麼是 vhost

vhost 是 virtio 的一種後端實現方案,在 virtio 簡介中,咱們已經提到 virtio 是一種半虛擬化的實現方案,須要虛擬機端和主機端都提供驅動才能完成通訊,一般,virtio 主機端的驅動是實如今用戶空間的 qemu 中,而 vhost 是實如今內核中,是內核的一個模塊 vhost-net.ko。爲何要實如今內核中,有什麼好處呢,請接着往下看。編程

爲何要用 vhost

在 virtio 的機制中,guest 與 用戶空間的 Hypervisor 通訊,會形成屢次的數據拷貝和 CPU 特權級的上下文切換。例如 guest 發包給外部網絡,首先,guest 須要切換到 host kernel,而後 host kernel 會切換到 qemu 來處理 guest 的請求, Hypervisor 經過系統調用將數據包發送到外部網絡後,會切換回 host kernel , 最後再切換回 guest。這樣漫長的路徑無疑會帶來性能上的損失。後端

vhost 正是在這樣的背景下提出的一種改善方案,它是位於 host kernel 的一個模塊,用於和 guest 直接通訊,數據交換直接在 guest 和 host kernel 之間經過 virtqueue 來進行,qemu 不參與通訊,但也沒有徹底退出舞臺,它還要負責一些控制層面的事情,好比和 KVM 之間的控制指令的下發等。網絡

vhost 的數據流程

下圖左半部分是 vhost 負責將數據發往外部網絡的過程, 右半部分是 vhost 大概的數據交互流程圖。其中,qemu 仍是須要負責 virtio 設備的適配模擬,負責用戶空間某些管理控制事件的處理,而 vhost 實現較爲純淨,以一個獨立的模塊完成 guest 和 host kernel 的數據交換過程。工具

vhost 與 virtio 前端的通訊主要採用一種事件驅動 eventfd 的機制來實現,guest 通知 vhost 的事件要藉助 kvm.ko 模塊來完成,vhost 初始化期間,會啓動一個工做線程 work 來監聽 eventfd,一旦 guest 發出對 vhost 的 kick event,kvm.ko 觸發 ioeventfd 通知到 vhost,vhost 經過 virtqueue 的 avail ring 獲取數據,並設置 used ring。一樣,從 vhost 工做線程向 guest 通訊時,也採用一樣的機制,只不過這種狀況發的是一個回調的 call envent,kvm.ko 觸發 irqfd 通知 guest。性能

總結

vhost 與 kvm 的事件通訊經過 eventfd 機制來實現,主要包括兩個方向的 event,一個是 guest 到 vhost 方向的 kick event,經過 ioeventfd 實現;另外一個是 vhost 到 guest 方向的 call event,經過 irqfd 實現。雲計算

代碼分析整個通訊的流程:
http://royluo.org/2014/08/22/vhost/線程


個人公衆號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,後臺回覆 「1024」 便可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎你們關注。3d

相關文章
相關標籤/搜索