基于VMware vSphere的虚拟化平台,内存分配是如何实现的?
https://mp./s?__biz=MjM5NTk0MTM1Mw==&mid=2650627417&idx=3&sn=087a18d02b79eedb60f02caf375db0db&chksm=bef923df898eaac9dcf7c4ead014a50a96bc17a5c9f12e919293636c6da9ee11b9a7449724c2&scene=21#wechat_redirect
twt企业IT社区-05-31
来自社区活动:基于VMware vSphere的虚拟化平台答疑专场
aerolite (VMware 系统工程师) 答:
内存管理:
透明页共享(Transparent Page Sharing):
当多个虚拟机在一个主机上运行时,可能有些内存页是一样的,比如一样的Guest OS。hypervisor通过周期性的扫描内存页生成hash值在内存hash总表中查找,一旦hash匹配就会进行完整比较,确认内存页完全一样后hypervisor会删除冗余内存页以指针代之,类似于存储中的重复数据删除功能。当某虚拟机对共享内存页试图写时,hypervisor会复制一个这个虚拟机的专有页来修改,保证共享页不被破坏。这种内存回收的速度取决于扫描的速度,在ESX(i)的高级设置中可以设置扫描速度和时间间隔。所以最好将相同或者相近的OS部署在一台host上面,以便更好的使用TPS节省内存。
气球膨胀(Ballooning):
由于hypervisor无法得知虚拟机中哪些内存是空闲的,因此依靠VMware Tools在Guest OS中的气球驱动(balloon driver)来回收内存。当需要从该虚拟机回收内存时,气球膨胀从Guest OS中请求内存,分配给气球驱动的内存可被hypervisor安全的回收,Guest OS自行决定将哪些内存swapping交换到硬盘上以保证分配给气球驱动内存。显然需要安装VMware Tools才能实现气球回收内存,通过这种方式回收内存较慢,依赖于Guest OS内存分配的速度。
内存交换(Hypervisor Swapping):
当虚拟机启动时就会创建一个内存swap文件,文件大小为最大内存交换量(虚拟机配置内存-内存预留)。当上面两种回收方式不能满足需求时,hypervisor会进行swapping将虚拟机的物理内存交换到硬盘上。hypervisor并不知道将哪些内存交换好,Guest OS也不知道哪些内存被交换了,这将极大的影响虚拟机的性能,当出现这种情况时说明需要加内存了。
内存压缩(Memory Compression):
这是4.1版本的新功能,对内存的交换的优化。如果swapping的内存页是可压缩的,则将其压缩后存储在压缩缓存区中,这样再次访问这个被swapping的内存时仅需要解压缩,而不是从硬盘读取,这将快的多。不能压缩或压缩缓冲区满则会与硬盘进行真正的swapping。在ESX(i)的高级设置中可以设置压缩缓存的大小等。
以上内存管理都是当内存不足的时候才会产生的行为。
当内存够的时候只会有Transparent Page Sharing默认开启,其它功能都不会参与。
另外,如果在内存不足的情况下,可以给特定的VM分配特定的内存大小,就可以在VM上分配好预留内存.reservation
一般国内用户很少会使内存占满,拿一个三台ESXI CLUSTER来说,假如三台ESXI内存总量300G,那么比较合理的VM内存使用量小于200G,因为要保证一台ESXI可以进入硬件维护。
内存比较便宜,所以服务器加内存是最容易的扩容之一。