(KVM连载)4.2.4 内存过载使用(overcommit)

同4.1.3节中介绍的CPU过载使用类似,KVM中内存也是允许过载使用(over-commit)的,KVM能够让分配给客户机的内存总数大于实际可用的物理内存总数。由于客户机操作系统及其上的应用程序并非一直100%地利用其分配到的内存,而且宿主机上的多个客户机一般也不会同时达到100%的内存使用率,所以内存过载分配是可行的。一般来说,有如下三种方式来实现内存的过载使用。

(1)内存交换(swapping):用交换空间(swap space)来弥补内存的不足。

(2)气球(ballooning):通过virio_balloon驱动来实现宿主机Hypervisor和客户机之间的协作来完成。

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

其中,第一种内存交换的方式是最成熟的(Linux中很早就开始应用),也是目前被广泛使用的,不过,它相比于KSM和ballooning的方式效率较为低一些。ballooning和KSM将在第5章中详细介绍,本章主要介绍swapping这种方式实现内存过载使用。

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

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

下面通过一个实际的例子来说明如何计算应该分配的交换空间大小以满足内存的过载使用。

某个服务器有32GB的物理内存,想在其上运行64个内存配置为1GB的客户机。在宿主机中,大约需要4GB大小的内存用于满足系统进程、驱动、磁盘缓存及其他应用程序所需(不包括客户机进程所需内存)。计算过程如下:

客户机所需交换分区为:64 x 1GB + 4GB - 32GB = 36GB。

而根据Redhat的建议[7],对于32GB物理内存的RHEL系统推荐使用8GB的交换分区。

所以,在宿主机中总共就需要建立44GB(36GB+8GB)的交换分区来满足安全地实现客户机内存的过载使用。

下面是在一台Ivy Bridge桌面级的硬件平台上进行的简单实验,可以看出客户机并非开始就在宿主机中占用其启动时配置的内存。

宿主机中,启动客户机之前和之后,查看系统内存情况如下。

[root@jay-linux ~]# free -m

total       used       free     shared    buffers     cached

Mem:          3851       1006       2845          0        172        444

-/+ buffers/cache:        388       3462

Swap:         4095          0       4095

[root@jay-linux ~]# qemu-system-x86_64 –m 2048 –smp 4 -hda /root/kvm_demo/rhel6u3.img –daemonize

[root@jay-linux ~]# free -m

total       used       free     shared    buffers     cached

Mem:          3851       1454       2397          0        172        531

-/+ buffers/cache:        749       3101

Swap:         4095          0       4095

在客户机中,查看内存使用情况如下。

[root@kvm-guest ~]# free -m

total       used       free     shared    buffers     cached

Mem:          1877        246       1630          0         25        130

-/+ buffers/cache:         90       1786

Swap:          510          0        510

从理论上来说,给客户机的内存过载使用可以达到实际物理内存的几倍甚至几十倍,不过除非特殊情况下,一般不建议过多地过载使用内存。一方面,交换空间通常是磁盘分区来做的,其读写速度比物理内存读写速度慢得多,性能并不好;另一方面,过多的内存过载使用也可能导致系统稳定性降低。所以,KVM允许内存过载使用,但在生产环境中配置内存的过载使用之前,仍然应该根据实际应用的进行充分的测试。

master

Stay hungry, stay foolish.

2 Comments

    • 如这篇文章中说的 书中第5章 对这两个做了详细介绍的;可以找书来参考。

发表评论

邮箱地址不会被公开。 必填项已用*标注

*