KVM的半虚拟化: KVM-paravirt

KVM的半虚拟化: KVM-paravirt

KVM的半虚拟化: KVM-paravirt

赵珂, cn.zhaoke.com
http://blog.zhaoke.com/48.html

2007年1月8日


什么是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, 它将以全虚拟化方式运行.)

问题: 我只在32位的VMX上测试过kvm-paravirt. (kvm-paravirt稍微修改后将能支持64位, paravirt.c也是. 暂时我还不打算公开64位代码.)

参考
Linux: KVM Paravirtualization
http://kerneltrap.org/node/7545

相关文章
KVM虚拟化常见问题
http://blog.zhaoke.com/46.html
Linux上的虚拟化技术
http://blog.zhaoke.com/45.html
用户友好的Linux虚拟技术: KVM
http://blog.zhaoke.com/43.html
KVM: 基于内核的虚拟驱动
http://blog.zhaoke.com/42.html
Linux内核2.6.20增加虚拟化解决方案KVM
http://blog.zhaoke.com/34.html

备注
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.
究竟什么是全虚拟化?什么是半虚拟化啊?

难怪kvm能进内核,原来有rh在后面支持啊