半虛擬化

KVM的半虛擬化: KVM-paravirt2012-01-20 20:44:45

分類:

原文地址: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所示。

 

qemu-emulated-io-device

qemu-emulated-io-device

圖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所示。

 

qemu-kvm-virtio-arch

qemu-kvm-virtio-arch

圖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驅動
2012-02-15 13:50:26     我來說兩句      
收藏  我要投稿

系統環境跟前面的幾篇類似,只不過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驅動

發佈時間:2013-01-25 | 佚名:www.07net01.com

 1:默認情況下按照好windows虛擬機,採用普通的驅動,即硬盤和網卡都採用默認配置情況下,硬盤是 ide 模式,而網卡工作在 模擬的rtl 8139 網卡下,速度爲100M 全雙工。採用 virtio 驅動後,網卡工作在 1000M 的模式下,硬盤工作是SCSI模式下。顯然我想修改爲virtio驅動!

2:開始我試着修改配置文件(配置文件見附件)!然後重啓虛擬機,結果藍屏!

KVM下windows虛擬機使用virtio驅動

我試着device='disk' 部分的bus=‘ide’修改爲virtio,並刪除了<address type='drive' controller='0' bus='0' unit='0'/>,然後重啓,結果藍屏!

見附件

KVM下windows虛擬機使用virtio驅動

顯然這樣不行!

3:下載virtio.iso文件, 我使用的是 http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/virtio-win-0.1-30.iso 這個iso文件支持幾乎所有的windows系統。掛載後iso文件見附件!

KVM下windows虛擬機使用virtio驅動

4:在配置中,添加virtio硬盤、virtio網卡,加載virtio-win.iso(cdrom)。啓動vm

見附件:

KVM下windows虛擬機使用virtio驅動

尤其要注意Device type要選中Virtio Disk

KVM下windows虛擬機使用virtio驅動

添加網卡的時候,尤其要注意Device model選中爲virtio

KVM下windows虛擬機使用virtio驅動

選中/home/liuxiaojie/virtio-win-0.1-30.iso  待會重啓vm後,需要通過光盤安裝virtio的驅動!

5:啓動vm,通過設備管理器查看硬件信息,見附件,顯然有兩個硬件沒有被驅動,我們需要光盤來安裝驅動!系統會自動搜索 SCSI的驅動,安裝即可,過程見附件

KVM下windows虛擬機使用virtio驅動

像安裝普通的windows驅動一樣,見附件

KVM下windows虛擬機使用virtio驅動

安裝完成後,通過設備管理器查看如下:

KVM下windows虛擬機使用virtio驅動

6:刪除掉新添加到硬盤和原來的網卡,修改ide硬盤爲 virtio模式即可


發佈了37 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章