前面我们成功的把KVM跑起来了,有了些感性认识,这个对于初学者非常重要。不过还不够,我们多少要了解一些KVM的实现机制,这对后面工作会很有帮助。

 

CPU 虚拟化

 

KVM 的虚拟化 是需要CPU硬件支持的。还记得我们在前面的章节讲过用命令来查看CPU是否支持KVM虚拟化吗?

 

root@ubuntu:~# egrep -o '(vmx|svm)'  /proc/cpuinfo

vmx

vmx

vmx

vmx

 

如果输出有 vmx 或者 svm ,就说明当前的CPU 支持 KVM 。 CPU 厂商 intel 和 AMD 都支持虚拟化,除非是非常老的 CPU。

 

一个 KVM 虚拟在宿主机中其实就是一个qemu-kvm 进程,与其他 Linux进程一样被调度。比如我们在实验机上运行的虚机 kvm1 ,在宿主机的ps中就可以看到他的进程。

 

root@ubuntu:~# ps -ef | grep kvm1

libvirt+  4988     1  9 20:39 ?        00:00:05 qemu-system-x86_64 -enable-kvm -name kvm1

 

 

虚机中的每一个虚拟 vCPU 则对应 qemu-kvm 进程中的一个线程。见下图

 

cpu不支持虚拟化可以使用docker吗 cpu是否支持虚拟化_虚拟化

 

在这个例子中,宿主机有两个物理CPU,上面起了两个虚机 VM1 和 VM2 。VM1 有两个 vCPU,VM2有4个vCPU。可以看到VM1 和 VM2分别有2个和4个线程在两个物理CPU上调度。

 

这里也演示了另一个知识点,即虚机的vCPU总数可以超过物理CPU数量,这个叫 CPU overcommit (超配)。KVM允许 overcomit ,这个特性使得虚机能够充分利用宿主机的CPU资源,但前提是在同一时刻不是所有的虚机都满负荷运行。当然,如果每个虚机都很忙,反而会影响整体性能,所以在使用 overcommit的时候,需要对虚机的负载情况有所了解,需要测试。

 

内存虚拟化

 

KVM 通过内存虚拟化共享物理系统内存,动态分配给虚机。见下图

 

cpu不支持虚拟化可以使用docker吗 cpu是否支持虚拟化_虚拟化_02

 

为了在一台机器上运行多个虚机,KVM需要实现 VA (虚拟内存) -> PA (物理内存) -> MA (机器内存)之间的地址转换。虚机OS控制 VA - PA ,物理机OS 控制 PA - MA。

 

内存也是可以 overcommit 的,即所有虚机的内存之和可以超过宿主机的物理内存,但使用时也需要充分测试,否则会影响性能。