分类:
2012-01-20 13:06:33
原文地址: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刷新)
你可以从下面网址获得最新的内核补丁程序:
虽然代码的一些功能还在测试开发当中, 但是代码已经过测试证明是稳定的, 欢迎您的任何建议.
下面是一些测试数据:
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, 它将以全虚拟化方式运行.)