再议Hyper-V 动态内存管理和内存过量使用

实际操作中,慢慢成长起来的经验将会成为一份可遇而不可求的金玉。几年前,坚信虚拟化将会让我们的IT运维变得随心所欲,到现在我反而发现了这项全新业务的管理让我们常常犯下新的错误。因为家庭中的一些琐事,我退出了MVP连任申请(虽然已经连续3+1年享受这一荣耀),但我发现这和老方所来信中提供得那样:“这并不意味着离开,我随时会回来”。很早以前写过一篇《用一份PPT开始你的Hyper-v虚拟化之旅》,我想还是应该延续接下来的讨论。

内存过量和动态内存都是在追求虚拟机密度最大化

我们知道,在一个虚拟化的服务器环境中,缺乏足够的物理内存,将会直接影响到虚拟机的设计密度,而设计时我们会将迁移所用的物理内存技术器精确到MB,当然这肯定还会影响到整个系统的投资回报率,内存成了虚拟化的短板。而后,我发现vSphere开始提供内存过量使用技术,这项技术可以让VMware虚拟机使用超过物理主机实际的内存容量,而虚拟机的位置又可以根据业务时段的不同,在不同的父分区下蹭吃蹭喝。但慢慢的,我开始关注这项前所未有的虚拟特性,这是因为与之相比的机械磁盘速率实在低下,当使用过多的虚拟内存之时,虚拟机的性能直线下降,而这恰恰是我们在引入虚拟化之前尽量避免的一种错误设计。

还记得首次听到“内存过量使用”这个术语时,有人大胆的提出了几份观点,但谁料想这些可能会引发今天挨板砖的局面。“内存过量使用”这个术语让人曾经让不熟悉虚拟化的人们有一种误解,“内存溢出”?因为过量使用似乎意味着过度利用资源。实际上,其想法是,即便没有物理内存来支持为系统配置的资源,也可以创建通常需要一定数量内存的多个虚拟机。基本上,借助内存过量使用技术,分配给物理主机上多个虚拟机的内存数量可以超过主机上的物理内存数量,这允许物理主机上可以有更大的虚拟机密度。

动态内存(Dynamic Memory)是微软Hyper-V R2 SP1让人鸡冻的新增功能,由于改进了虚拟内存分配的机制,这便同样可以增加虚拟机和主机之间的比率,也就是虚拟机密度。但毋容置疑,缺少软件厂商的支持策略,比如一些黑心的应用程序仍然会扩大其内存需求,捆绑硬件来销售,这些都可能限制这一优势的发挥。

一些唠叨和建议

非常赞同Brien Posey(MVP)说的:“Hyper-V 的内存管理是一种艺术!”

动态内存应该是一项创举,但必须遵守微软的Hyper-V最佳实践指南,以避免虚拟机缺少内存管理的艺术。我在查阅了kb and lib资料并进行了有针对性的测试之后,希望以下几点能对你的工作有些帮助:

当Hyper-V动态内存在一个虚拟机上被启用以后,这个虚拟机能立刻断定它需要多少内存。然后主机分配给虚拟机要求的数量,以及一些额外的容量来作为缓冲,如图片中的“内存缓冲区”。如果一个主机中有多个虚拟机在运行,主机会自动在所有虚拟机间平衡内存的分配,图片中的“内存权重”。

再议Hyper-V 动态内存管理和内存过量使用

应该说,动态内存有时并非总是最佳选择。有些虚拟机我们应该禁用动态内存,把这些资源基于哪些根据应用程序特性可真正获益的虚拟机上启用动态内存,这一点非常重要。除非你对于分析运行性能指标方面非常在行,正确分配这些值是异常困难的。可以演示软件或使用负载测试工具去决定真实的内存需求,但是仍然有一些未知事件因为不是在生产环境,所以你需要长期摸索去使用动态内存容量规划。

例如,如果配置windows server 2008 TS 网关采用的NAP 方案 ,TS Server和NPS可能在夜里需要非常多的内存,这是相反的业务峰值时间(回家加班的人还是很多,唉),内存需求快速下降。

再议Hyper-V 动态内存管理和内存过量使用

还比如,对于一个虚拟的DNS或者AD主机,当它只需要512MB内存的时候,却被分配了2GB内存,你就在浪费宝贵的主机资源了。但如果这是一台我在DELL访谈中(《如何开启你的虚拟化之路》)提到的学籍管理服务器,因为只是入选和离校时才达到高峰期,动态内存绝对是最佳的设计选择。

还比如,有些SQL数据库采用动态内存的这个行为加快了数据库处理大量查询信息时的速度,并且在静态分配的世界中是可行的。可是对于动态内存分配来说,过量使用和动态内存绝对都会遇到一个问题:前面提到的磁盘速度和内存速度的对比。这些程序在非峰值时间你可能会看到内存水平下降,但是内存减少很可能性很少。因此,一些调用大型SQL数据库的程序,你可以使用Hyper-V动态内存的最大内存设置来限制虚拟机的内存。你也可以在SQL数据库中限制内存的消耗,当然,最好的做法是改善程序调用机制,或者采用“应用程序级别”来控制它们,而非是动态内存技术。