網絡IO的虛擬化模型小結

網絡IO的虛擬化模型隨着技術發展,出現了多種方式,例如emulationpara-virtualizationpass-throughSR-IOV等,本文試圖對其作一個簡單的總結。 緩存

  • Emulation(仿真):

    全虛擬化是最先出現的IO虛擬化方式,效率也最低。以接收網絡報文爲例,其處理步驟能夠簡單描述以下: 網絡

    • 數據包到達主機物理網卡,向host CPU發出中斷。QEMU建立的網橋(br0)它會分析報文目的地。若是目的地是host,調用host的中斷處理函數;若是目的地是虛擬機的話將報文轉發至TAP設備。以前初始化時qemu進程已經打開了TAP的字符設備。
    • TAP設備由兩部分組成,一側是網絡驅動,另外一側是字符設備驅動,前者負責接受來自物理網卡的數據報,後者則將報文轉發至qemu進程。過程爲:TAP 將字符設備的文件描述符置位,qemu進程經過select調用接收。
    • qemu調用tap_send函數,將網絡數據報經過e1000_receive函數寫入網卡的緩存區,依次會調用pci_dma_write,最後是qemu_get_ram_ptr,作一次內存拷貝。在虛擬機中,網卡緩存能夠經過DMA方式訪問,但虛擬機的物理內存映射到qemu的虛擬內存區,所以虛擬機的OS讀取的實際是qemu進程的緩存。最後調用set_ics向虛擬機注入中斷。
    • 虛擬機讀取中斷後引起VM-Exit,中止VM進程執行,進入root操做狀態。KVM要根據KVM_EXIT_REASON判斷緣由。對於IO請求,其標誌爲KVM_EXIT_IO。由於kvm沒法處理此操做,須要從新回到qemu的用戶態,調用kvm_handle_io進行處理。

         

         

         

  • Para-virtualization(半虛擬化)

    能夠認爲是一種改進後的仿真模型,由各廠商提供虛擬網卡驅動,並加入Guest OSvhost 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的任務即爲處理virtioI/O事件。而在Guest中,會打開virtio設備,將virtiovring映射到host kernelvhostkvm的事件通訊經過eventfd機制來實現,主要包括兩個方向的event,一個是GuestVhost方向的kick event,經過ioeventfd承載;另外一個是VhostGuest方向的call event,經過irqfd承載。 函數

    guest_notifier的使用: 性能

    • vhost在處理完請求(收到數據包),將buffer放到used ring上面以後,往call fd裏面寫入;
    • 若是成功設置了irqfd,則kvm會直接中斷guest。若是沒有成功設置,則走如下的路徑:

      Qemu經過select調用監聽到該事件(由於vhostcallfd就是qemu裏面對應vqguest_notifier,它已經被加入到selectablefd列表)spa

    • 調用virtio_pci_guest_notifier_read通知guest
    • guestused ring上獲取相關的數據。

    host_notifier的使用: 線程

    • Guest中的virtio設備將數據放入avail ring上面後,寫發送命令至virtio pci配置空間;
    • Qemu截獲寄存器的訪問,調用註冊的kvm_memory_listener中的eventfd_add回調函數kvm_eventfd_add()
    • 經過kvm_vm_ioctl(kvm_state, KVM_IOEVENTFD, &kick)進入kvm中;
    • kvm喚醒掛載在ioeventfdvhost worker thread
    • vhost worker threadavail ring上獲取相關數據。

       

       

  • Pass-through

    VMM直接將一個PCI設備分配給VM,經過iommu保證VM間內存訪問不衝突。這種方式性能最快,可是一個設備只能給一個VM使用,靈活性差,並且不支持遷移。 blog

       

       

  • SR-IOV

    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的支持。 隊列

相關文章
相關標籤/搜索