1. 程式人生 > >Qemu模擬IO和半虛擬化Virtio的區別以及I/O半虛擬化驅動介紹

Qemu模擬IO和半虛擬化Virtio的區別以及I/O半虛擬化驅動介紹

RoCE 缺少 靈活 緩沖 不支持 src 自動 令行 nic

QEMU的基本原理和優缺點

技術分享圖片

基本原理:

使用QEMU模擬I/O的情況下,當客戶機中的設備驅動程序(device driver)發起I/O操作請求之時,KVM模塊中的I/O操作捕獲代碼會攔截這次I/O請求,然後經過處理後將本次I/O請求的信息存放到I/O共享頁,並通知用戶控件的QEMU程序。QEMU模擬程序獲得I/O操作的具體信息之後,交由硬件模擬代碼來模擬出本次的I/O操作,完成之後,將結果放回到I/O共享頁,並通知KVM模塊中的I/O操作捕獲代碼。最後,由KVM模塊中的捕獲代碼讀取I/O共享頁中的操作結果,並把結果返回到客戶機中。當然,這個操作過程中客戶機作為一個QEMU進程在等待I/O時也可能被阻塞。另外,當客戶機通過DMA(Direct Memory Access)訪問大塊I/O之時,QEMU模擬程序將不會把操作結果放到I/O共享頁中,而是通過內存映射的方式將結果直接寫到客戶機的內存中去,然後通過KVM模塊告訴客戶機DMA操作已經完成。

優缺點:

QEMU模擬I/O設備的方式,其優點是可以通過軟件模擬出各種各樣的硬件設備,包括一些不常用的或者很老很經典的設備(如4.5節中提到RTL8139的網卡),而且它不用修改客戶機操作系統,就可以實現模擬設備在客戶機中正常工作。在KVM客戶機中使用這種方式,對於解決手上沒有足夠設備的軟件開發及調試有非常大的好處。而它的缺點是,每次I/O操作的路徑比較長,有較多的VMEntry、VMExit發生,需要多次上下文切換(context switch),也需要多次數據復制,所以它的性能較差。

半虛擬化virtio的基本原理和優缺點

技術分享圖片

基本原理:

其中前端驅動(frondend,如virtio-blk、virtio-net等)是在客戶機中存在的驅動程序模塊,而後端處理程序(backend)是在QEMU中實現的。在這前後端驅動之間,還定義了兩層來支持客戶機與QEMU之間的通信。其中,“virtio”這一層是虛擬隊列接口,它在概念上將前端驅動程序附加到後端處理程序。一個前端驅動程序可以使用0個或多個隊列,具體數量取決於需求。例如,virtio-net網絡驅動程序使用兩個虛擬隊列(一個用於接收,另一個用於發送),而virtio-blk塊驅動程序僅使用一個虛擬隊列。虛擬隊列實際上被實現為跨越客戶機操作系統和hypervisor的銜接點,但它可以通過任意方式實現,前提是客戶機操作系統和virtio後端程序都遵循一定的標準,以相互匹配的方式實現它。而virtio-ring實現了環形緩沖區(ring buffer),用於保存前端驅動和後端處理程序執行的信息,並且它可以一次性保存前端驅動的多次I/O請求,並且交由後端去動去批量處理,最後實際調用宿主機中設備驅動實現物理上的I/O操作,這樣做就可以根據約定實現批量處理而不是客戶機中每次I/O請求都需要處理一次,從而提高客戶機與hypervisor信息交換的效率。

優缺點:

Virtio半虛擬化驅動的方式,可以獲得很好的I/O性能,其性能幾乎可以達到和native(即:非虛擬化環境中的原生系統)差不多的I/O性能。所以,在使用KVM之時,如果宿主機內核和客戶機都支持virtio的情況下,一般推薦使用virtio達到更好的性能。當然,virtio的也是有缺點的,它必須要客戶機安裝特定的Virtio驅動使其知道是運行在虛擬化環境中,且按照Virtio的規定格式進行數據傳輸,不過客戶機中可能有一些老的Linux系統不支持virtio和主流的Windows系統需要安裝特定的驅動才支持Virtio。不過,較新的一些Linux發行版(如RHEL 6.3、Fedora 17等)默認都將virtio相關驅動編譯為模塊,可直接作為客戶機使用virtio,而且對於主流Windows系統都有對應的virtio驅動程序可供下載使用。

I/O半虛擬化驅動

I/O半虛擬化分成兩段:
前端驅動(virtio前半段):virtio-blk,virtio-net,virtio-pci,virtio-balloon,virtio-console
支持的系統有:
Linux:CentOS 4.8+,5.4+,6.0+,7.0+
Windows:
virtio:虛擬隊列,virt-ring
transport:後端處理程序(virt backend drivers):在QEMU中實現

常見的I/O設備半虛擬化:
(1)virtio-balloon:
ballooning:讓VM中運行的GuestOS中運行調整其內存大小

     -balloon none   禁用balloon設備
     -balloon virtio[,addr=str]    啟用半虛擬化balloon設備(默認項)
     手動查看GuestOS的內存用量:
          info balloon
          balloon N

     氣球技術可以在客戶機運行狀態動態調整它所占的宿主內存資源,而不需要關閉客戶機;
     故名思議,把內存當成氣球一樣來使用,氣球中的內存可以被宿主機使用,但是不能被客戶機直接使用和訪問,所以當宿主機缺少內存是,balloon釋放掉一部分內存,給宿主機使用;相反當客戶機內存不夠時,客戶機吹從宿主機獲取內存;

    優點:1)因為balloon可以被監控,和控制;2)而且balloon對內存的調度很靈活。
    缺點:1)客戶機需要加載該驅動,而且不是每個系統都有該驅動,(virtio_balloon) ;2)如果有大量的內存從客戶系統回收,會降低系統的運行; 3)目前沒有比價方便,自動化管理balloon的機制,一般都采用qemu來管理。

(2)virtio-net:半虛擬化網卡
其依賴於GuestOS中的驅動,及Qemu中的後端驅動
GuestOS:virtio_net.ko
通過如下命令可以查看kvm宿主機支持的virtio模式:
Qemu:qemu-kvm -net nic,model=?

     [root@kvm-node1 ~]# qemu-kvm -net nic,model=?
     qemu: Supported NIC models: ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio
     其返回值即為支持的virtio網卡模式,常見的有e1000, rtl8139, virtio等

     啟動一個使用virtio_blk作為磁盤驅動的客戶機,其qemu-kvm命令行如下。
     [root@jay-linux kvm_demo]# qemu-system-x86_64 -smp 2 -m 1024 -net nic -net tap –drive file=rhel6u3.img,if=virtio
     在客戶機中,查看virtio_blk生效的情況如下所示。
     [root@kvm-guest ~]# grep VIRTIO_BLK \ /boot/config-2.6.32-279.el6.x86_64
     CONFIG_VIRTIO_BLK=m
     [root@kvm-guest ~]# lsmod | grep virtio
     virtio_blk              7292  3
     virtio_pci              7113  0
     virtio_ring             7729  2 virtio_blk,virtio_pci
     virtio                  4890  2 virtio_blk,virtio_pci
     性能優化:
     1)Host中的GSO,TSO:(詳見:https://blog.csdn.net/quqi99/article/details/51066800)
         關掉可能會提升性能
              ethtool -K $IF gso off
              ethtool -K $IF tso off
              ethtool -K $IF

     2)vhost-net:用於取代工作於用戶空間的qemu中為virtio-net實現的後端驅動以實現性能提升的驅動  (詳見:https://blog.csdn.net/ponymwt/article/details/8895243)
        -net tap[,vnet_hdr=on|off][,vhost=on|off]
        qemu-kvm -net tap,vnet_hdr=on,vhost=on

(3)virtio-blk:半虛擬化磁盤
其依賴於GuestOS中的驅動,及Qemu中的後端驅動
-drive file=/path/to/some_image_file,if=virtio

    kvm_clock:半虛擬化的時鐘
    #grep -i "paravirt" /boot/config-2.6.32-504.el6.x86_64
    CONFIG_PARAVIRT_GUEST=y
    CONFIG_PARAVIRT=y
    CONFIG_PARAVIRT_CLOCK=y

KVM虛擬機的實時遷移

支持的GuestOS: Linux, Windows, OpenBSD, FreeBSD, OpenSolaris;
在待遷入主機使用:
qemu-kvm -vnc :N -incoming tcp:0:7777
vncviewer :590N
在源主機使用:
monitor接口:
migrate tcp:DEST_IP:DEST:PORT
遷移需要考慮的影響:
整體遷移時間
服務器停機時間
對服務的性能的影響

Qemu模擬IO和半虛擬化Virtio的區別以及I/O半虛擬化驅動介紹