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