分类:
原文地址: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模式即可