前面我们成功的把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,上面起了两个虚机 VM1 和 VM2 。VM1 有两个 vCPU,VM2有4个vCPU。可以看到VM1 和 VM2分别有2个和4个线程在两个物理CPU上调度。
这里也演示了另一个知识点,即虚机的vCPU总数可以超过物理CPU数量,这个叫 CPU overcommit (超配)。KVM允许 overcomit ,这个特性使得虚机能够充分利用宿主机的CPU资源,但前提是在同一时刻不是所有的虚机都满负荷运行。当然,如果每个虚机都很忙,反而会影响整体性能,所以在使用 overcommit的时候,需要对虚机的负载情况有所了解,需要测试。
内存虚拟化
KVM 通过内存虚拟化共享物理系统内存,动态分配给虚机。见下图
为了在一台机器上运行多个虚机,KVM需要实现 VA (虚拟内存) -> PA (物理内存) -> MA (机器内存)之间的地址转换。虚机OS控制 VA - PA ,物理机OS 控制 PA - MA。
内存也是可以 overcommit 的,即所有虚机的内存之和可以超过宿主机的物理内存,但使用时也需要充分测试,否则会影响性能。