一. 了解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,然后重啟