qemu-kvm中的virtio淺析


一.  了解Virtio

virtio是通用虛擬化框架,在Qemu-kvm中的I/O是用qemu 來模擬的,性能比較差,用virtio來模擬I/O可以進一步提升I/O虛擬化的性能

傳統的qemu-kvm 工作模式:

 

1.Guest產生I/O請求,被KVM 截獲

2.Kvm 經過處理后將I/O請求存放在I/O共享頁

3.通知Qemu,I/O已經存入I/O共享頁

4.Qemu從I/O共享頁拿到I/O請求

5.Qemu模擬代碼來模擬本次的I/O,並發送給相應的設備驅動

6、7、8.   硬件去完成I/O操作並返回結果Qemu

9.    Qemu將結果放回I/O共享頁

10.   Qemu通知Kvm去I/O共享頁拿結果

11.   Kvm去I/O共享頁拿到結果

12 .  Kvm將結果返回給Guest

**注意:

a)      在這個操作中,客戶機作為一個qemu進程在等待I/O時有可能被阻塞

b)     當客戶機通過DMA訪問大塊內存時候,Qemu不會把結果放回I/O共享頁,而是直接通過內存映射的方式將結果直接寫到客戶機的內存中去,然后通過KVM模塊告訴客戶機DMA操作已經完成

 

Virtio 基本架構:

 

前端:是存在於客戶機中的驅動模塊。

后端:是存在於Qemu中的處理程序。

中間層:在前端和后端之間,還定義了一層來支持客戶機與Qemu之間的通信。Virtio和virtio-ring可以看成是一層,Virtio是虛擬隊列接口,就是將前端驅動程序附加到后端處理程序,算是前后端通信的橋梁,主要實現控制面,virtio-ring實現了兩個環形緩沖,分別保存前后端的信息,實現具體的通訊機制和通訊流是偏向數據面,是橋梁的具體實現。

**注意:virtio設備都是pci設備

 

二.安裝和使用virtio

現在linux里面一般會自帶virtio的相關模塊,當我們去使用的時候會自動加載相對應的模塊。

 

例如在一個正在使用virtio-net的guest中,可以看到自動加載的模塊:

 

 

 

 

對於客戶機時windows的,因為windows默認沒有提供virtio相關的驅動,所以可以去網上下載Windows virtio驅動到guest里去安裝,也可以通過host來安裝,方法:

1.host中安裝virtio-win

 

2.啟動win7客戶機,將virttio-win.iso作為客戶機的光驅

 

這里用了三個virtio驅動,-net,nic,model=virtio;-balloon virtio;-device virtio-serial-pci,啟動后在win7的光驅里面可以看到

 

 

 

然后去設備管理器里安裝對應設備的驅動即可。

*注意:安裝virtio-scsi安裝略有不同,因為當采用virtio-scsi設備的時候,然后去起guest的時候,這個時候guest是沒有安裝virtio_scsi驅動的,因此guest系統不能啟動。解決辦法:

              a). 創建一個10M的img文件,當做guest的非啟動盤

              b). 先將guest的啟動盤不要指定為virtio-scsi設備,將10M的img指定為virtio-scsi設備

              c).quest起來后,由於存在一個virtio-scsi設備,所以在設備管理器里可以看到該設備驅動,並且沒安裝,然后安裝一下即可

              d).將guest重新啟動,並指定啟動盤為virtio-scsi,這時候由於guest已經安裝了virtio-scsi驅動,可以正常啟動了。那個10M的硬盤可以不需要了。

 

Virtio設備的使用

1.使用virtio_balloon

方式一:-balloon virtio[,addr=addr] #使用virtio balloon設備,addr可配置客戶機中該設備的PCI地址

方式二:用較新的‘-device’的統一參數分配balloon設備,”-device virtio-ballon-pci,id=balloon0,bus=pci.o,addr=0x4”

 

在qemu monitor中查看和設置客戶機內存的大小

 

 

 

 

2.使用virtio_net

1)檢查Qemu是否支持virtio類型的網卡

 

 

 

2)啟動客戶機時候的命令

-net nic,model=virtio,macaddr=xx:xx:xx:xx:xx:xx         –net tap

                              前端                                                   后端

 

*注意:若果在使用virtio_net的時候依然得到較低的性能,可以檢查並關閉Host的GSO,TSO可以提升性能

 

檢查GSO,TSO:

 

關閉GSO,TSO:

 

 

vhost_net與virtio_net:

virtio_net驅動的后端處理是在用戶空間的qemu中完成的

vhost_net驅動的后端處理是在內核中完成的

因此使用vhost_net的性能比virtio_net的性能更好

 

vhost_net command:

-net nic,model=virtio,macaddr=xx:xx:xx:xx:xx:xx       –net tap,vnet_hdr=on,vhost=on

                          前端                                                                     后端

前端guest中采用virtio-net后端處理采用vhost-net(當然需要host支持vhost-net,即支持vhost-net模塊)

 vnet_hdr=on/off :是否打開tap設備的IFF_VNET_HDR標識,這是tun/tap的一個標識,打開這個標識則允許發送或接收大數據包時僅做部分校驗和檢查,還可以提高vritio_net驅動的吞吐量

vhost=on/off:是否開啟vhost-net這個內核空間的后端處理驅動

vhostfs=h,設置去連接一個已經打開的vhost網絡設備

*注意:一般使用vhost-net可以提高網絡性能,但是當host的處理速度比guest慢的時候,特別是udp類型的流量,就會導致數據包的丟失,這種情況下,不要用vhost-net。

 

3.使用virtio_blk

virtio_blk可以提升qemu-kvm中對塊設備的訪問性能。

virtio_blk command:

-drive file=rhel6u3.img,if=virtio

*注意:使用了virtio_blk后,客戶機中看到的磁盤設備的名稱就變成了/dev/vda,因此需要修改下/etc/fstab,然后重啟


免責聲明!

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



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