分類:
原文地址:KVM的半虛擬化: KVM-paravirt 作者:liurhyme
什麼是KVM?
kvm是一個完整的全虛擬化解決方案. 當前主機操作系統支持linux系統和x86架構. 它包括了一個可加載的內核模塊(kvm.ko)和一個用戶空間組件. 通過使用kvm虛擬化技術, 你可以運行多個未修改的linux或windows虛擬機. 每一個虛擬機有自己的虛擬硬件: 一個網卡, 磁盤, 圖形適配器, 等.
KVM支持全虛擬化和半虛擬化.
你可以通過給當前內核打kvm-paravirt-patches補丁來支持半虛擬化.
下面是Ingo Molnar的一些說明(測試和介紹):
kvm-paravirt-patches支持Intel-VMX CPU的cr3-cache硬件功能. (能夠加速進程上下文切換和TLB刷新)
你可以從下面網址獲得最新的內核補丁程序:
http://redhat.com/~mingo/kvm-paravirt-patches/
雖然代碼的一些功能還在測試開發當中, 但是代碼已經過測試證明是穩定的, 歡迎您的任何建議.
下面是一些測試數據:
2個進程上下文切換性能(單位微秒, 越小性能越好):
native: 1.11
———————————-
Qemu: 61.18
KVM upstream: 53.01
KVM trunk: 6.36
KVM trunk+paravirt/cr3: 1.60
比如. 2個進程的上下文切換性能, 第四項(結果1.60)的性能是最好的, 幾乎接近於原始性能!
“hackbench 1″ (使用40個進程, 單位爲秒, 越小性能越好):
native: 0.25
———————————-
Qemu: 7.8
KVM upstream: 2.8
KVM trunk: 0.55
KVM paravirt/cr3: 0.36
速度幾乎快了2倍.
“hackbench 5″ (使用200個進程, 單位爲秒, 越小性能越好):
native: 0.9
———————————-
Qemu: 35.2
KVM upstream: 9.4
KVM trunk: 2.8
KVM paravirt/cr3: 2.2
仍有30%的提高 - 考慮到200個進程的上下文切換, 結果還不是太糟糕. 當前CPU的cr3緩存數爲4.
kvm-paravirt-patches的功能介紹:
1. 在linux客戶和linux主機間提供一個專門的半虛擬化hypercall API.(接下來將被一個更好的hypercall系統調用替代).
2. 通過使用hypercall API利用Intel VMX CPU的”cr3目標緩存”功能和擴展KVM使用這些緩存”. 這項功可避免VM存在於hypervisor的上下文中. (客戶機需要’知道’這些並且客戶和hypervisor共享緩存, 所以完全模擬操作系統與此項功能無關).
3. Linux客戶機的半虛擬化完成了少數幾個更加簡化的更改: IO端口的延遲不再影響VM, i8259A IRQ controller(中斷控制器)的代碼變的更簡單(將由一個更正確的, 基於hypercall和主機維護的IRQ controller來替代), 還有取消了cr3緩存讀入(如果沒有取消將引起VM退出), 因此TLB刷新比以往更有效率. 這些修改已有了直接的影響: 當一個客戶機空閒, 它們能減少qemu的CPU的使用率, 使用率在25%左右. (如果一個帶有-rt選項的客戶機的HZ=1000, CPU的使用率在~20%到14%之間).
半虛擬化通過kvm_paravirt=1啓動選項來打開(現在, 這個方法比較麻煩) - 啓動選項後, KVM客戶機將在hypervisor端檢測是否存在半虛擬化代碼 - 如果發現, 然後將使用它. (如果客戶機在hypervisor端發現不支持KMV-paravirt, 它將以全虛擬化方式運行.)
5.1 半虛擬化驅動
5.1.1 virtio概述
KVM是必須使用硬件虛擬化輔助技術(如Intel VT-x、AMD-V)的hypervisor,在CPU運行效率方面有硬件支持,其效率是比較高的;在有Intel EPT特性支持的平臺上,內存虛擬化的效率也較高。QEMU/KVM提供了全虛擬化環境,可以讓客戶機不經過任何修改就能運行在KVM環境中。不過,KVM在I/O虛擬化方面,傳統的方式是使用QEMU純軟件的方式來模擬I/O設備(如第4章中提到模擬的網卡、磁盤、顯卡等等),其效率並不非常高。在KVM中,可以在客戶機中使用半虛擬化驅動(Paravirtualized Drivers,PV Drivers)來提高客戶機的性能(特別是I/O性能)。目前,KVM中實現半虛擬化驅動的方式是採用了virtio這個Linux上的設備驅動標準框架。
1. QEMU模擬I/O設備的基本原理和優缺點
QEMU純軟件方式模擬現實世界中的I/O設備的基本過程模型如圖5-1所示。
圖5-1 QEMU 模擬I/O設備
使用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),也需要多次數據複製,所以它的性能較差。
2. Virtio的基本原理和優缺點
Virtio最初由澳大利亞的一個天才級程序員Rusty Russell編寫,是一個在hypervisor之上的抽象API接口,讓客戶機知道自己運行在虛擬化環境中,從而與hypervisor根據 virtio 標準協作,從而在客戶機中達到更好的性能(特別是I/O性能)。目前,有不少虛擬機都採用了virtio半虛擬化驅動來提高性能,如KVM和Lguest[1]。
QEMU/KVM中,Virtio的基本結構框架如圖5-2所示。
圖5-2 KVM中virtio基本架構
其中前端驅動(frondend,如virtio-blk、virtio-net等)是在客戶機中存在的驅動程序模塊,而後端處理程序(backend)是在QEMU中實現的[2]。在這前後端驅動之間,還定義了兩層來支持客戶機與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驅動程序可供下載使用。
VMware 中禁用虛擬內存加速虛擬機速度
當啓動 VMWare 虛擬機後,在虛擬機文件夾下會生成一個 .vmem 的文件,該文件大小與給虛擬機分配的內存大小相同,並且在關閉虛擬機後該文件會消失。這就是VMWare 的虛擬內存文件。它就是在當你的真實內存比較小的時候,節省內存用的。但這也帶來一個問題就是:當給虛擬機分配的內存比較大,且在虛擬機中使用的內存也比較多時,就會導致系統(虛擬機和物理機器)非常的慢。
如果你的物理機器的內存比較大,就可以完全禁止該功能。
關閉的辦法:
1. 選擇編輯虛擬機----選項---高級--設置 選中“Disable memory page trimming”;
2. 在虛擬機所在的文件夾,找到“虛擬機名稱.vmx”文件,用文本編輯器打開,新建一行,添加該配置項:mainMem.useNamedFile="FALSE",保存退出。
標 題: 直接用KVM virtio安裝Windows
發信站: 水木社區 (Sat Apr 30 17:53:17 2011), 站內
大家一般是先裝好一套windows, 然後再安裝virtio驅動,這樣子一來裝得慢,二來系統盤的速度也比較扯淡。其實可以在安裝階段就用上virtio的。
以RHEL/Centos安裝win7爲例介紹
先安裝virtio-win包,我用的是virtio-win-1.1.16,從RedHat官網下載,
先確保這個文件存在:/usr/share/virtio-win/virtio-win.vfd
這是virtio-win驅動的軟盤版
然後用virt-install的時候把這張軟盤也加上,並打開virtio模式
例如:
virt-install --name win7test --ram 1024 --disk path=/dev/vgvirt/lvwin7test,bus=virtio --disk virtio-win.vfd,device=floppy --os-variant win7 --cdrom /opt/win7.iso --cdrom virtio-win.iso
啓動進入安裝程序以後會發現找不到硬盤
此時選擇Load Driver或者加載驅動,選擇從軟盤加載。
注意選擇的驅動和Windows版本要匹配。
裝好驅動以後,硬盤就出來了。
- 詳解RHEV中安裝win2003和VirtIO驅動
-
系統環境跟前面的幾篇類似,只不過RHEV-M跟RHEV-H做了調換,iSCSI服務器服務的硬盤就換成了RAID0。
創建虛擬機的時候,跟前面的一樣,因爲是服務器系統,提高IO性能,裏面需要用到KVM的半虛擬化的驅動VirtIO,所以創建虛擬磁盤的時候,選的是VirtIO
這裏簡單介紹一下VirtIO,VirtIO是I/O虛擬化的框架,比如說磁盤,如果不使用VirtIO,KVM需要模擬出一塊兒IDE硬盤給虛擬機使用,每次使用的時候,都需要做一次翻譯中轉,效率下降很多,如果裝了VirtIO驅動,就直接調用API接口來處理磁盤的各項請求,跟直接操作磁盤的效果差不多,性能提升很多,網卡也是這樣。
linux內核版本在2.6.25以上的,都應該集成了VirtIO的驅動,但windows需要另外安裝。
下面就安裝VirtIO下的WINDOWS 2003
創建虛擬機的時候,跟其他都一樣,創建好了之後,
點下拉按鈕,然後點擊Run Once
勾選"Attach Floppy",下拉選擇virtio-win-1.4.0.vfd
CD選擇好windows 2003的鏡像,Boot Sequence裏面,把CD-ROM提到最前面。
其他根據自己的需要做選擇,最後點擊OK
過一會,就能看到系統識別出虛擬的VirtIO磁盤,如下圖
如果沒有加載虛擬的軟盤,就會出現如下的圖:
安裝完成之後,就到達了登陸界面
需要按下Ctrl + Alt +Delete,這個時候,需要在SPICE窗口中點右鍵,然後選擇Send CTRL+ALT+DELETE
這個時候,就可以登陸進去了,登陸之後,就需要安裝各個驅動了,在管理界面中,選定這臺虛擬機,右鍵,然後選擇Change CD ,然後再選擇RHEV-ToolsSetup_3.0_34.iso 如下圖:
這樣,就可以把虛擬機光驅中的光盤換掉了,在虛擬機系統中的光驅中,雙擊RHEV-toolsSetup.exe進行驅動安裝
裝好驅動之後,再打開虛擬機中的設備管理器,發現各個設備都能正常識別了。
我們現在給虛擬機中的網卡配個IP,然後用遠程連接協議登陸上去。
管理界面中,可以選擇RDP直接打開遠程連接,省去手動輸入IP的麻煩,不過前提是你需要在DNS裏面做解析,或者編輯hosts文件,所以,你創建虛擬機的時候,最好是用可以解析的主機名作爲命名。
點擊RDP之後,會直接調用本地的遠程連接,很方便。。。。。
本文出自 “飛翔的單車” 博客
KVM下windows虛擬機使用virtio驅動
1:默認情況下按照好windows虛擬機,採用普通的驅動,即硬盤和網卡都採用默認配置情況下,硬盤是 ide 模式,而網卡工作在 模擬的rtl 8139 網卡下,速度爲100M 全雙工。採用 virtio 驅動後,網卡工作在 1000M 的模式下,硬盤工作是SCSI模式下。顯然我想修改爲virtio驅動!
2:開始我試着修改配置文件(配置文件見附件)!然後重啓虛擬機,結果藍屏!
我試着device='disk' 部分的bus=‘ide’修改爲virtio,並刪除了<address type='drive' controller='0' bus='0' unit='0'/>,然後重啓,結果藍屏!
見附件
顯然這樣不行!
3:下載virtio.iso文件, 我使用的是 http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/virtio-win-0.1-30.iso 這個iso文件支持幾乎所有的windows系統。掛載後iso文件見附件!
4:在配置中,添加virtio硬盤、virtio網卡,加載virtio-win.iso(cdrom)。啓動vm
見附件:
尤其要注意Device type要選中Virtio Disk
添加網卡的時候,尤其要注意Device model選中爲virtio
選中/home/liuxiaojie/virtio-win-0.1-30.iso 待會重啓vm後,需要通過光盤安裝virtio的驅動!
5:啓動vm,通過設備管理器查看硬件信息,見附件,顯然有兩個硬件沒有被驅動,我們需要光盤來安裝驅動!系統會自動搜索 SCSI的驅動,安裝即可,過程見附件
像安裝普通的windows驅動一樣,見附件
安裝完成後,通過設備管理器查看如下:
6:刪除掉新添加到硬盤和原來的網卡,修改ide硬盤爲 virtio模式即可