计算公式看起来很简单:一台KVM主机配置了16GB内存,如果每台虚拟机的内存大小为512MB,那么你最多应该能够运行32台虚拟机。然而通过应用某些技巧,可以优化内存使用并能够在物理服务器上运行更多的虚拟机。
首先,你需要记住从hypervisor的角度看,一台KVM虚拟机仅仅是一个Linux进程,这意味着其遵循有关虚拟以及常驻内存的通用法则。当KVM虚拟机启动时,KVM虚拟机设置指向虚拟内存地址的指针。然而虚拟内存并非物理内存,仅仅是允许进程设置指针指向的地址空间。一般来讲,一个进程正在使用的虚拟内存的具体大小并不重要。
虚拟机处于活动状态时,hypervisor会为其分配常驻内存,常驻内存大小等于虚拟机真正使用的内存大小。
正如你所看到的那样,测试虚拟机已使用的内存值为238MB,但主机操作系统预留的常驻内存值要更大。然而这并没有什么关系,重要的是虚拟机使用的常驻内存大小低于分配给虚拟机的内存大小。
使用交换内存
影响一台服务器能够承载的虚拟机数量的另一个关键因素就是磁盘交换空间使用情况,Linux内核追踪被分配的内存是否正在被高效地使用。你可以通过/proc/meminfo文件获得内存使用情况,部分内容如下:
Active: 2097832 kB
Inactive: 1136816 kB
Active(anon): 1537524 kB
Inactive(anon): 101456 kB
Active(file): 560308 kB
Inactive(file): 1035360 kB
活动内存应该是可供使用的内存,非活动内存指的是最近未被使用的内存,可以被交换出去。作为一名管理员,你应该观察一段时间内有关活动内存以及非活动内存的统计数字。确保服务器交换空间大小至少等于你已经观察到的非活动内存的最大值,因为内存交换区可以而且能够被所有虚拟机使用。
在使用内存交换区时,你也应该确保活动内存没有被交换,因为活动内存被交换将影响虚拟机性能,所以虚拟机的活动内存应该位于内存中而不是在磁盘交换空间中。通过使用vmstat命令可以确认活动内存是否在被交换。例如运行vmstat 2 10命令,每隔两秒钟显示内存使用情况,共循环10次。确保你查看了SI和SO(换入/换出)统计数字,如果这些统计数字非常高那么这并是一个好的征兆。
OOM和内存交换
你还应该监控服务器以确保没有出现内存不足(OOM)的情况。如果分配给所有虚拟机的内存容量多于内存及可用交换空间之和,那么就会发生内存不足的情况。最开始你可能能够成功运行更多的虚拟机,但当虚拟机变得原来越活跃时,需要的内存也就越多,这可能会导致内存不足。
内存出现不足时,进程会被随机终止,这可能意味着虚拟机可能会发生故障。避免内存不足并不困难,一定要确保分配给虚拟机的虚拟内存的总大小少于内存的总大小与交换空间之和。
使用KSM共享内存
优化KVM内存使用的另一种方法是通过运行内核相同页合并(KSM)。KSM守护进程监控内核共享的内存并试图观察虚拟机内使用的共享内存,例如当多台服务器运行同一个操作系统时就会发生内核相同页合并,KSM确保该操作系统只会被加载一次并在虚拟机之间共享。
虽然KSM能够显著减少运行虚拟机所需要的内存大小,但可能会导致CPU负载变得更高,因此要监控进程以确保不会导致出现性能问题。
因为Linux内核能够高效地区分活动内存及非活动内存,可以有效地使用交换分区优化KVM虚拟机的内存需求,但要确保分配给所有虚拟机的内存总大小与主机内存的总容量与可用的交换空间相适应。KSM可能有助于将内存需求降至最低,但你应该当心没有导致任何性能问题。通过使用这些标准的Linux内核解决方案优化KVM虚拟机使用的内存,你应该能够在物理服务器上运行更多的虚拟机。无论如何,先要确保你有足够多的交换空间。