KVM虚拟化:(八)内存设置简介

admin 2022年11月02日 692次浏览

1、 内存设置基本参数

  • 在通过 qemu命令行启动客户机时设置内存大小

    -m N
    

    其中 N 为分配的内存大小,默认的单位为 MB,也支持加上 M 或 G 作为后缀来显式指定使用 MB 或 GB 作为内存分配的单位。我们启动客户机时,这个参数都是必不可少的

  • 配置示例

    qemu-system-x86_64 centos7.img -m 1G -enable-kvm
    

2、EPT和VPID简介

EPT(扩展页表),属于 Intel 的第二代硬件虚拟化技术,是针对内存管理单元(MMU)的虚拟化扩展。EPT 降低了内存虚拟化的难度,也提升了内存虚拟化的性能

在虚拟化环境下,内存使用需要两层地址转换,即客户机应用程序可见的客户机虚拟地址(GVA)到客户机物理地址(GPA)的转换,再从客户机物理地址(GPA)到宿主机物理地址(HPA)的转换。其中,前一个转换由客户机操作系统来完成,而后一个转换由 Hypervisor 来负责

VPID(虚拟处理器标识)是在硬件上对 TLB 资源管理的优化,通过在硬件上为每个 TLB 项增加一个标识,用于不同的虚拟处理器的地址空间,从而能够区分 Hypervisor 和不同处理器的 TLB。硬件区分了不同的 TLB 项分别属于不同虚拟处理器,因此可以避免每次进行 VM-Entry 和VM-Exit 时都让 TLB 全部失效,提高了 VM 切换的效率。由于有了这些在 VM 切换后仍然继续存在的 TLB 项,硬件减少了一些不必要的页表访问,减少了内存访问次数,从而提高了 Hypervisor 和客户机的运行速度。VPID 也会对客户机的实时迁移有很好的效率提升,会节省实时迁移的开销,提升实时迁移的速度,降低迁移的延迟,通过 grep -E "ept|pvid" /proc/cpuinfo 可以查看当前系统是否支持 EPT 和 VPID 功能

在宿主机中,可以根据 sysfs 文件系统中 kvm_intel 模块的当前参数值来确定 KVM 是否打开 EPT 和 VPID 特性。在默认情况下,如果硬件支持了 EPT、VPID,则 kvm_intel 模块加载时默认开启 EPT 和 VPID 特性,这样 KVM会默认使用它们

[root@kvm ~]# cat /sys/module/kvm_intel/parameters/ept
Y
[root@kvm ~]# cat /sys/module/kvm_intel/parameters/vpid
Y

3、内存过载使用

在 KVM 中内存也是允许过载使用的,KVM 能够让分配给客户机的内存总数大于实际可用的物理内存总数。由于客户机操作系统及其上的应用程序并非一直100%地利用其分配到的内存,并且宿主机上的多个客户机一般也不会同时达到100%的内存使用率,所以内存过载分配是可行的

实现内存的过载使用的3种方式:

  • swapping:用 swap 来弥补内存的不足

  • ballooning:通过 virio_balloon 驱动来实现宿主机 Hypervisor 和客户机之间的协作

  • page sharing:通过 KSM(Kernel Samepage Merging)合并多个客户机进程使用的相同内存页

其中,swapping(内存交换)的方式是最成熟的,也是目前广泛使用的

KVM 中客户机是一个 QEMU 进程,宿主机系统没有特殊对待它而分配特定的内存给 QEMU,只是把它当作一个普通 Linux 进程。Linux 内核在进程请求更多内存时才分配给它们更多的内存,所以也是在客户机操作系统请求更多内存时,KVM 才向其分配更多的内存

用 swapping 方式来让内存过载使用,要求有足够的交换空间来满足所有的客户机进程和宿主机中其他进程所需内存。可用的物理内存空间和交换空间的大小之和应该等于或大于配置给所有客户机的内存总和,否则,在各个客户机内存使用同时达到较高比率时,可能会有客户机因内存不足被强制闭

虽然 KVM 允许过载使用内存,但是不建议过多地过载使用内存。一方面,交换空间通常是由磁盘分区来实现的,其读写速度比物理内存读写速度慢得多,性能并不好;另一方面,过多的内存过载使用也可能导致系统稳定性降低