網絡IO的虛擬化模型隨着技術發展,出現了多種方式,例如emulation、para-virtualization、pass-through和SR-IOV等,本文試圖對其作一個簡單的總結。 緩存
全虛擬化是最先出現的IO虛擬化方式,效率也最低。以接收網絡報文爲例,其處理步驟能夠簡單描述以下: 網絡
能夠認爲是一種改進後的仿真模型,由各廠商提供虛擬網卡驅動,並加入Guest OS。vhost driver建立了一個字符設備 /dev/vhost-net,這個設備能夠被用戶空間打開,並能夠被ioctl命令操做。當給一個Qemu進程傳遞了參數-netdev tap,vhost=on 的時候,QEMU會經過調用幾個ioctl命令對這個文件描述符進行一些初始化的工做,而後進行特性的協商,從而宿主機跟客戶機的vhost-net driver創建關係。與此同時,kernel中要建立一個kernel thread 用於處理I/O事件和設備的模擬。 kernel代碼 drivers/vhost/vhost.c:在vhost_dev_set_owner中,調用了這個函數用於建立worker線程(線程名字爲vhost-qemu+進程pid)。這個內核線程被稱爲"vhost worker thread",該worker thread的任務即爲處理virtio的I/O事件。而在Guest中,會打開virtio設備,將virtio的vring映射到host kernel。vhost與kvm的事件通訊經過eventfd機制來實現,主要包括兩個方向的event,一個是Guest到Vhost方向的kick event,經過ioeventfd承載;另外一個是Vhost到Guest方向的call event,經過irqfd承載。 函數
guest_notifier的使用: 性能
Qemu經過select調用監聽到該事件(由於vhost的callfd就是qemu裏面對應vq的guest_notifier,它已經被加入到selectablefd列表); spa
host_notifier的使用: 線程
VMM直接將一個PCI設備分配給VM,經過iommu保證VM間內存訪問不衝突。這種方式性能最快,可是一個設備只能給一個VM使用,靈活性差,並且不支持遷移。 blog
SR-IOV主要用來解決pass-through只能被一臺虛擬子機訪問的問題。SR-IOV標準由PCI-SIG,這個標準實現須要CPU、芯片組和PCI設備(主要是網卡等I/O資源)協同在硬件層面實現。支持SR-IOV功能的網卡能夠在Hypervior裏面註冊成多個網卡(每一個網卡都獨立的中斷ID、收發隊列、QOS管理機制)。每一個設備能夠經過pass-through方式分配給虛擬子機。Intel公司的82599 10G網卡以PF/VF的形式提供了對SR-IOV的支持。 隊列