virtio、vhost和 vhost-user


1. virtio:針對Linux的I/O的虛擬化框架


在虛機中,可以通過qemu模擬e1000網卡,這樣的經典網卡一般各種客戶操作系統都會提供inbox驅動,所以從兼容性上來看,使用類似e1000的模擬網卡是非常一個不錯的選擇。
但是,e1000網卡上也包含了復雜的io端口,寄存器,緩存配置,虛擬機每次收發包都會引起更多的io和mmio操作,使得虛擬機頻繁的陷出,最終導致網絡性能不佳。
為了解決上述全虛擬化的性能問題,IBM在2005年提出了virtio, 虛擬機中的半虛擬化前端驅動和主機上的后端服務簡單的使用virtqueue共享隊列交換數據,大幅的減少了e1000模擬時復雜的io操作,從而可以較大程度的提升虛擬網絡性能。


virtio是qemu的半虛擬化驅動,guest使用virtio driver將請求發送給virtio-backend。

 

 

 virtio是qemu的半虛擬化驅動,guest使用virtio driver將請求發送給virtio-backend。

 

 

 

virtio的io路徑:
    guest設置好tx
    kick host
    guest陷出到kvm
    kvm從內核切換到用戶態的qemu進程
    qemu將tx數據投遞到tap設備

2. vhost

vhost技術對virtio-net進行了優化,在內核中加入了vhost-net.ko模塊,使得對網絡數據可以在內核態得到處理。

 

 

 

圖中描述了vhost的io路徑: guest發出中斷信號退出kvm,kvm直接和vhost-net.ko通信,然后由vhost-net.ko訪問tap設備。 這樣網絡數據只需要經過從用戶態到內核態的一次切換,就可以完成數據的傳輸。大大提高了虛擬網卡的性能。 由於這個技術中vhost-backend在內核中,所以也被叫做vhost-kernel。

vhost的io路徑:
    guest設置好tx
    kick host
    guest陷出到kvm
    vhost-net將tx數據投遞到tap設備

3.Vhost-user

隨着技術的發展,將網絡數據放入用戶態處理將可以得到更靈活的形式。在原有的vhost架構中,進行了改動,增加了 一種新的vhost-backend,叫做vhost-user。

 

 

 

vhost-user的io路徑:
    guest設置好tx
    kick host
    guest陷出到kvm
    kvm將通知vhost-backend
    vhost-backend將tx數據直接發送到nic設備

 

vhost-user的提交者是Luke Gorrie,他也是snabbswitch的作者。從圖上可以看到vhost-backend從原來咋kernel中的vhost-net 變成了用戶空間的snabbswitch。 snabbswitch直接接管物理網卡的驅動,從而直接控制網絡信息的輸入輸出。

snabbswitch主要使用了下面的技術來提高性能

1.     采用了大頁來作為host和vm之間通信的內存空間

2.     用戶態操作網卡,使用類似於netmap的zero copy技術來加速對物理設備的訪問

3.     使用numa技術,加快中斷響應速率

值得一提的是使用snabbswitch后,不用再使用原來的tap設備模擬的網卡。

使用vhost-user技術,從虛擬機到host上實現了數據的zero copy(通過大頁共享),host到nic的zero copy(snabbswitch實現的驅動),能進一步加快數據的傳輸。

來源:
    https://blog.csdn.net/hbuxiaofei/article/details/106744467

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM