与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的方式效率较低一些。

 

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

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

 

下面通过一个实际的例子来说明如何计算应该分配的交换空间大小以满足内存的过载使用。某个服务器有32GB的物理内存,想在其上运行64个内存配置为1GB的客户机。在宿主机中,大约需要4GB大小的内存来满足系统进程、驱动、磁盘缓存及其他应用程序所需内存(不包括客户机进程所需内存)。

计算过程如下:

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

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

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

 

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

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

 

 

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

 

 

从理论上来说,供客户机过载使用的内存可以达到实际物理内存的几倍甚至几十倍,不过除非特殊情况,一般不建议过多地过载使用内存

一方面,交换空间通常是由磁盘分区来实现的,其读写速度比物理内存读写速度慢得多,性能并不好;

另一方面,过多的内存过载使用也可能导致系统稳定性降低。所以,KVM允许内存过载使用,但在生产环境中配置内存的过载使用之前,仍然应该根据实际应用进行充分的测试

posted on 2018-09-06 09:59  苦咖啡~~  阅读(817)  评论(0编辑  收藏  举报