虚拟机需要配置多大的内存合适?怎样才能最佳利用主机的物理内存?怎么把握Over-Commitment的度?本文从概念到实战来阐述如何做好虚拟机上内存资源规划。
一如何分配内存?
首先我们明确一些概念。
上图分三层,他们分别是是App层,OS层和Hypervisor层。对于物理服务器而言,所有的内存资源都分配给单独的操作系统和上面运行的应用。应用将请求先发送给操作系统,然后操作系统调度物理的内存资源。
我们以下面一个场景为例,来分析内存在各层中是如何分配的。
假设我们先启动ESXi主机,这时Hypervisor加载物理内存,这和任何其他操作系统加载物理内存的原理一样。在这一层Hypervisor加载的内存称作“Machine memory”。然后我们在该ESXi主机上创建了虚拟机,并为其设置4G内存(Configured Memory Size),这也称为“Guest Physical Memory”,由于这是Virtual Hardware为该虚拟机所分配的内存。对于操作系统而言,这和物理内存没有区别,就认为自己是完全控制该4G内存的。然后我们启动该VM,上面的OS开始运行。之后运行一个应用,该应用通过系统调用(syscall)向OS发出请求,然后获得内存。这里称作“Virtual Memory”
上面说的是内存分配的过程,那么内存是如何释放的呢?
App通过系统调用告诉OS来释放不需要的内存。可OS认为所有设置在虚拟机上的内存都是专门分配给自己的,并不会释放Guest Physical Memory,而是创建一个Free List来记录该内存是可以被重新分配的。而Hypervisor根本无法访问这个Free list。所以根本无法释放物理内存。
查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Servers/virtualization/
二 Hypervisor如何释放物理内存?
这下问题来了,根本别指望通过Guest来能释放物理内存。那究竟Hypervisor是怎么释放内存的呢?主要有下面几个技术:
TPS (Transparent Page Sharing)TPS缺省是一直自动运行的。比如一台ESXi主机上运行多个虚拟机,他们的OS和App很类似,必然很多内存页的内容是一样的,Hypervisor就会比较这些页面,在物理内存去除冗余,仅仅保留单个页面的信息。从而减少了物理内存的消耗。
Blooning
在虚拟机上安装的VMtools就包括了ballooningdriver。它告诉Hypervisor哪些不活动的内存页面可以被收回。这对虚拟机上应用的性能是没有任何影响的。关于Blooning技术的原理,delxu的博文图解VMware内存机制解释的非常清楚,赞一个。我在此不再赘述。
Compression:缺省是启动的。在启动Swaping之前系统会尝试将虚拟内存页面压缩,如果小于2KB,可以保存在虚拟机的Comression Cache内。
Swapping:
如果在TPS,blooning和Compression都用上了的情况下,仍然有物理内存不足的情况。那么不得已最后一招就是Swapping。因为页面交换和Disk进行的,这对应用性能很可能造成大的负面影响。参见Frank Denneman博文Impactof host local VM swap on HA and DRS