图解VMware内存机制

在写《VMware内存机制初探》以后,本来是计划写一篇《VMware内存机制再探》的,讲一讲VMware内存机制中的另外几个重要内容,好比透明内存共享(TPS, Transparent Page Sharing), Relaim Memory, Ballooning, swapping等等。但有网友反映说前面的文章仍是很差懂。因而想,若是如同官方文档那样条条框框地列出来,那还不如你们都去看原版手册呢,因此有了这么一篇东西。php


首先,你们要记住,在内存没有过量配置(Memory Overcommitment)的状况下,内存的调度机制彻底不会启动,就没有Reclaim内存。很明显嘛,主机总的物理内存(Host Physical Memory)大于全部虚机配置内存的总额的状况下,每台虚机想要多少内存,都能获得知足,固然不须要调度。

因此,如下探讨的VMware的内存机制,都是在内存过量配置的状况下发生的。

个人故事发生在一个有智慧的水池(Host)中,水池有很多水(4GB物理内存),里面还有2个水箱(配置了2台VM),水箱有必定的容量(配置内存是4GB),本来是空的(没有开机)。
snap0049

可是如今水箱1里面要养鱼了,必须放点水进去以便鱼能够存活(开机了)。最少须要1GB内存。因而水箱1(VM1)就向水池(Host)要水(物理内存),水池里面有足够的水,就知足了水箱1的要求。如今水箱1有1GB的活水,而水池里面只剩下3GB的水了。
snap0050
 
如今咱们又向水箱1里面多丢了些鱼(启动新的应用),原来1GB的水不够用了,因而水箱1就继续向水池要水,水池里面还有足够的水,就又知足了水箱1的要求。如今水箱1里面有3GB的水,而水池里面只剩下1GB的水了。  


解释:要注意的是,此时VM1里面的应用程序都是活动的(active),因此这些内存都属于活跃状态,叫作活动内存(Active Memory)。
snap0051
通过了一段时间之后,水箱1里面的鱼被捕走了,如今水箱1不须要那么多水也足够养活剩下的鱼了。可是水池并不知道水箱1的情况。因而水箱1仍是有那么多水。

解释:
VM1的某些应用结束后,释放了部份内存,可是这些内存释放动做是在VM的Guest OS层面释放的,所以Host并不知道有内存被释放了,这些内存没有归还Host,仍然由VM1霸占着。VM1中就有一部份内存属于idle,另一些正在使用的内存就是active memory。固然,就VM1本身的GOS看起来,有3GB空闲内存(idle memory),1GB的活动内存;而此时就Host看来,只看见有3GB内存是分配给了VM1的。Host经过VMware Tools中的驱动,每隔必定的时间(ESX4中默认是60秒,ESX3中默认是30秒)去扫描一下VM1的内存使用状态,以便了解它到底有多少活动内存(active memory)

snap0052
 
此时,咱们开始在水箱2中养鱼了(VM2开机),水箱2也开始从水池中抽水。可是水池里面的水不能枯竭,所以水池有警惕水位,第一条警惕水位是6%,当降低到第一警惕水位如下并仍然在不停降低时,就要开动其余机制从其余水箱反抽水。

解释:
VM2开机时也须要1GB内存,在启动时,它也不断向Host请求内存。Host则将本身的内存源源不断地分配给VM2,直到降低到第一条警惕位6%。Host内存有4种状态,分别是High, Soft, Hard和Low,它们间的分界线分别是6%, 4%, 2%和1%。可用内存高于6%时,不会启动Balloon或Swap机制。当低于6%并往4%逼近的时候(soft状态),Balloon机制就启动了。(关于内存的4种状态的更多解释,请参阅官方文档《Understanding Memory Resource Management in VMware ESX Server》。如何查看这4种状态?能够用esxtop或者resxtop)

image
那到底向哪一个水箱抽水呢?谁的水最富裕就向谁抽。

解释:
如何判断呢?刚才咱们说过,Host每隔必定时间就会扫描Guest OS的内存使用情况,此时,Host会计算每一个VM的份额内存比ρρ和VM的空闲内存还有空闲内存税(IMT, Idel Memory Tax)密切相关,对ρ最小的那台虚机启动气球驱动(balloon driver),气球开始膨胀(inflating)。关于ρ和IMT的算法,请参见本人博文《 空闲内存税的算法 》。

snap0054
因而,气球开始膨胀,并将多余的水挤出水箱。

解释:Balloon驱动如同普通驱动那样,不断向Guest OS索取内存,Guest OS尽本身可能知足气球驱动,并优先将空闲部分的内存分配给它,注意,此时可能出现Guest OS本身的物理内存不足,并引发Guest OS的paging机制,将一部份内存page out到本身的swap中。这个例子中,VM1还有不少空闲内存,所以足够让主机回收并知足VM2的需求。

主机将比较气球膨胀得到的这部份内存的地址,若是原先是分配给VM1独享的,(也就是没有TPS共享),那么就能够收回。主机将不停的经过气球驱动收回内存,收回的目标是保持至少6%的内存。这个回收内存的过程就叫Reclaim。

注意:此时内存没有出现争用状况,所以shares仍然没有起做用,可是Overcommitment是存在的,因此会有reclaim,会有ballooning。
snap0056
Ballooning回收内存是比较慢的,一般须要几分钟。

若是主机可用内存池的内存减小速度大于气球驱动返还主机的内存,那么可用内存会进一步降低,当突破4%的第2警惕线时,进入到hard状态,主机就会启用第2种reclaim机制——swapping,将VM1的一部分物理内存交换到swap文件中,以加快回收内存的速度。目的是将可用内存保持在4%的警惕线以上。

若是可用内存继续降低到2%如下,进入到low状态的时候,ESX不只会继续加速Swapping,还会阻止其上全部VM的内存请求。

如今,状况又发生了变化,水箱2中的鱼愈来愈多了,它不停地向水池要水,而水池也经过气球驱动,不停地将水箱1中的空闲内存挤出来,直到水箱1和2的总需求量大于了水池能供给的水量。水池不再能提供更多的水了,只能部分知足2个水箱的要求了。不够的部分怎么办?用一些脏水(swap)来知足。脏水虽然脏(swap内存速度很慢),鱼在脏水里面生存的很困难,但毕竟仍是有水的,不至于由于没有足够的水而致使鱼死掉。
snap0058

此时,VM1和VM2的active memory由2部分组成,1部分是得到的主机物理内存,另外一部分是swap。请注意,Guest OS是不知道本身的一部分物理内存是硬盘上的swap文件的。

当机器内存不足竞争开始的时候,shares开始起做用。可是,请注意,若是IMT是0,对空闲内存不征税,因为4GB的VM1和4GB的VM2的份额都是40960,所以它们最终会拿到相同的物理内存2GB。可是若是IMT是默认值,那么空闲内存的代价更大,那么这2台VM会根据active内存数量的不一样,得到不一样数量的物理内存。
 
【本文的知识要点回顾】

(1) 在内存没有过量配置(Memory Overcommitment)的状况下,不须要Reclaim内存  
(2) 何时开始Reclaim内存?当突破6%的警惕线,内存状态从High变成了Soft的时候 
(3) Reclaim优先用Ballooning,只有Ballooning不够用的时候,才会用Swapping 
(4) 何时开始swapping? 当主机可用内存跌破4%警惕线,内存状态变成Hard的时候 
(5) Host没法知道VM内的哪些内存块已经处于空闲(idle)状态。必须用Ballooning才能收回空闲内存。 
(6) 尽可能避免资源争用,不然形成的Chasing-the-tail效应,会致使更严重的性能负面影响。

【参考文档】

(1) Carl, A. Waldspurger, 2002,  Memory Resource Management in VMware ESX Server 
http://waldspurger.org/carl/papers/esx-mem-osdi02.pdf 
(2) VMware Inc.  Understanding Memory Resource Management in VMware ESX Server 
http://www.vmware.com/files/pdf/perf-vsphere-memory_management.pdf 
(3
) VMware Inc.  Understanding Host & Guest Memory Usage (2007) 
http://mylearn.vmware.com/courseware/12400/PS_TA21_288707_166-1_FIN_v3.pdf 
(4) Idel memory tax 
http://www.boche.net/blog/index.php/2009/01/29/idle-memory-tax/

本文出自 “三角阳台的技术笔记本” 博客,请务必保留此出处http://delxu.blog.51cto.com/975660/288682算法

相关文章
相关标签/搜索