每日一记10】+第8天:VMware内存分配初探
  

易逝的信仰 16311人觉得有帮助

{{ttag.title}}
「每日一记」目前已开展9期,已有近400余位工程师参与并坚持不懈的进行技能输出,征集到5000余篇技术笔记,共派发出近1000000+S豆,送出36份精美好礼!>>【每日一记】第10期正在进行中

VM的内存资源分配,有3个可以配置的项:Limit,Reservation和Shares

【Memory Limit】

Memory Limit,顾名思义,内存上限,就是Host可以分配给此VM的pRAM数的上限。
默认情况下是选中unlimited复选框的,也就是不设上限。不设上限不意味着没有上限,隐含的上限值是分配给VM的内存值。

Q: 什么情况下要设置Memory Limit呢?(或者说Memory Limt有什么好处?)
A: 一般情况下不用设置Memory Limt。

Limit通常用来管理用户预期。开始的时候,Host上的VM数量比较少,没有资源争用,因此VM的性能完全可以保证;随后,当一台又一台VM创建出来,对于资源的争用渐渐变的频繁起来。于是VM的性能下降了,用户便会产生抱怨。因此,设置limit可以从一开始就限定VM的性能,也就是让用户一开始就觉得他的VM就应该是这样的性能,当VM数量增加的时候,也不会感觉到性能的下降。当然,Memory Limit设置在什么数值比较合理应该具体情况具体分析。

那为啥不把VM的内存(Configured Size)设小呢?这也是考虑用户心理。有用户会觉得自己的应用就是需要4GB内存,虽然我们经过分析得出的结论是只需要1GB内存就够了,但是为了考虑用户的感受,就给他设置VM的内存为4GB,于是用户看见自己的OS显示有4GB内存,就很满意,但是他不知道的是我们给他的VM设置了1GB 的Memory Limt,这样,既保证了Host的资源可以更合理的利用,又让用户感到满意。

当用户的应用越来越频繁,其对内存的需求增加的时候,这时再来调整Memory limt,以满足其对性能的要求。调整Memory Limt无需停机,而如果开始时虚拟机的内存设的小了,此时调整内存数量就要停机了。设置Memory limt的好处就在于减少了不必要的downtime。

调整memory limit的动作,其实就是通知Hypervisor将某一VM可用的pRAM放大,而无需通知GOS,所以无需GOS重启。(简单的说,就是改Hypervisor,而和GOS无关)

专用名词解释 Configured Size
Configured Size可以翻译成配置内存,就是用户在创建一个VM的时候设定的内存值,也是Guest OS认为自己拥有的内存值。Configured Size在VM看来就是自己可用内存的总量,有的时候我们也称之为Guest Physical Memory。如果


【Memory Reservation】

Memory Reservation就是给一台VM保留的内存。这些pRAM将被占用,只能用于此VM,而不会被重新分配。VM默认的Memory Reservation是0,也就是不保留内存。如果给1台VM配置了1GB内存,但是Memory Reservation是默认的0MB,也就是说没有给这台VM分配任何专属的pRAM,那么这台VM的内存从哪里获得呢?答案是Swap(可以翻译为交换文件),也叫VMKernel swap,这是一个存放在硬盘资源上的交换文件(扩展名为vswp),这个swap文件大小在默认情况下等同于VM设定内存的大小。
VMware内存分配初探

所以,即使1台VM没有获得任何pRAM,它还是可以运行的,因为从VM Guest OS看来,自己还是有RAM的,这个RAM就是硬盘上的swap文件。

但是,我们知道,硬盘的访问是一种机械运动(注:非SSD硬盘情况下),速度要远远比物理内存慢。慢到什么程度呢?RAM速度大概是纳秒级的,而硬盘的速度是毫秒级的,2者相差近100万倍。所以使用swap越多,速度就越慢。对Windows Paging技术熟悉的同学们一定知道,缺少内存的电脑速度非常之慢,主要就是因为经常访问存放在硬盘上的pagefile,这种问题的解决方案就一定是添加物理内存。对于VM也是如此,如果大量使用swap,VM一定会显得非常之慢。

那么当ESX/ESXi还有可用内存的情况下,VM是不是还一定要用swap当内存呢?
答案是不用。Memory Reservation为0的VM没有专属的pRAM,但并不意味着这台VM没有物理内存可以用,只是没有独占某些物理内存而已,在共享物理内存池中的内存还是可以使用的。VMware ESX/ESXi在物理内存资源充足的情况下,总是会给VM分配足额的pRAM,因此VM无需使用Swap,这保证了VM的运行速度。比如1台可用物理内存是3GB(忽略COS和Hypervisor所占用的内存开销)的ESX/ESXi主机上,运行了2台VM,每台VM各配置了1GB的内存,此时,共享内存池中有3GB的内存,而实际需求只有2GB,因此2台VM都能获得1GB的pRAM。

当你给这2台VM各自的Memory Reservation都设置成512MB的时候,这2台VM将各自获得512MB的专属内存,也就是说,无论这2台VM是否实际用到了这512MB内存,这些内存都将保留给它们。此时,共享内存池中可用的内存就只有2GB了。当获得了512MB专属内存之后,VM就不需要1GB那么大的swap了,而只需要512MB的swap就足够保证Guest OS不会没有内存可用。所以此时的swap大小就只有512MB。如果继续增大Memory Reservation到1GB,此时swap就为0。

所以VM内存1GB可能有:

0MB的Memroy Reservation和1024MB的swap,或者
512MB的Memory Reservation和512MB的swap,或者
1024MB的Memory Reservation和0MB的swap

因此我们总结出以下公式:

VM的配置内存 (MB) = Swap文件大小 (MB) + Memory Reservation (MB)
(注:原文可参<vSphere resource mgmt guide> p31:"You must reserve swap space for any unreserved virtual machine memory (the difference between the reservation and the configured memory size) on per-virtual machine swap files.")

Q: 为什么要配置Memory Reservation?
A: 因为硬盘内存的速度太慢,而保留一些物理内存给VM可以保证该VM能至少拥有一部分高速的pRAM资源。

Q: 那么,是不是要给一台VM配置等于其内存大小的Memory Reservation呢?
A: No,这是为什么呢?

这是因为Memory Reservation设的越大,可共享的内存池中的内存也就越少,可配置的VM数量就越少。

还是拿上面的例子来说,如果每台VM的Memory Reservation都是512MB的情况下,3GB的ESX/ESXi的主机最多只能配置6台VM(这是不考虑memory overhead的假想情况下,实践情况可能不到6台),如果Memory Reservation继续增加到每台VM 1GB,那就最多只能配置3台VM了。但是每台VM实际在用内存数可能都没那么多,假设每台VM在用内存的平均数只有256MB,这台主机应该可以运行12台VM,在做了Memory Reservation之后,就只能开启3台或者6台的VM了。

Q:Memory Reservation的那部分内存是不是其他VM就无法使用?
A:不是绝对不能用。但是因为Memory Reservation部分的内存不能被reclaim,所以当1台VM开机的时候,如果当时使用的内存不到Memory reservation的大小,那多余的部分还是可以被其他VM用的;但是当此VM占用的内存达到过Memory Reservation的大小以后,这部分内存就不会交还到可以共享的内存pool中了,就不能再被其他VM用了。

【关于Swap的Q&A】

Q: Swap何时产生?何时消亡?
A: swap文件在一台VM开机的时候生成,关机的时候被删除。

Q: VM开机时,存放位置没有足够的空间来放置Swap,会发生什么?
A: VM无法开机。

Q: Swap的大小?
A: Swap = VM Configured Memory Size - Memory Reservation
swap的大小是固定的,是静态的,是预先分配好空间的,既不会变大也不会缩小。即使VM从来不去用它,也牢牢霸占着磁盘空间。大多数情况下,swap的利用率很低。(swap利用率高了就意味着VM缺少pRAM,就要想办法调整内存设置,或者增加Host的物理内存,或者调整配置以满足VM需求)

Q: Swap的默认位置?
A: 和VM的文件 e.g. VMX, VMDK等在同一目录下

Q: Swap的位置可以改变么?为什么?
A: 可以改,但不建议改。

Swap的存放位置可以改到共享存储的另外的位置,或者Host本地存储的某个位置(Host-local方式)。但是Host-local有个缺点,就是会影响到VMotion的效率,因为在Host本地存储的Swap文件必须在VMotion的时候迁移到另外的主机上;而swap如果是在共享存储上的话,就不需要移动。

Q: Host-local Swap如何设置?如果修改默认swap位置到Host-local?
A: 见vSphere Resouce Management Guide p31

关于host-local swap的更多精妙解释,强烈推荐您读以下Frank的这篇文章:http://frankdenneman.nl/2010/02/ ... swap-on-ha-and-drs/

【Memory Shares】

Memory share简单的说就是份额。当内存资源不足时,VM之间就会产生内存资源的争用。Share就是用来设定VM在争用时能够获得多少份额的内存。

还是拿前面的例子举例。3GB pRAM的ESX/ESXi主机上配置了2台VM,没有配置Reservation,当它们都只有1GB内存的时候,这1GB都可以使用pRAM,现在让我们把这2台VM的内存增加到2GB。现在内存需求的总量是4GB了,VMware将如何分配内存?

首先要明确的是,内存资源只有在争用的情况下才会用到share。上面2台VM虽然都分配了2GB vRAM,但是如果其应用还是都只用到1GB的话,此时没有争用发生,share也就没有发生作用。

当这2台VM都请求2GB内存的时候,就发生了争用。假设他们的share都是1000,那么也就是说,我们把可用内存3GB分成2000份,每台VM可以分到1000份。因此此时每台VM可以获得3GB*1000/2000=1.5GB的内存。

假设VM1用于开发,VM2用于生产,所以我们想把VM2的优先级别设高,便调整VM2的share为2000。此时VM1将获得3GB1000/(1000+2000)=1GB内存。而VM2将获得3GB2000/(1000+2000)=2GB的物理内存。

当我们调整VM1的share为500,VM2的share为2000. 此时,根据计算,VM2争用获得的内存是3GB2000/(500+2000)=2.4GB,而VM1将获得3GB500/(500+2000)=0.6GB。对吗?且慢,还记得内存limit隐含的上限是VM的配置内存吗?VM2只配置了2GB内存,因此最多只用到2GB内存。所以VM2还是只用2GB内存,而VM1可以使用剩下的1GB内存

打赏鼓励作者,期待更多好文!

打赏
2人已打赏

酒慰风尘 发表于 2020-8-13 11:46
  
nice 学习了,那么详细的知识点
头像被屏蔽
新手780102 发表于 2020-8-13 16:04
  
提示: 作者被禁止或删除 内容自动屏蔽
一一氵 发表于 2020-8-15 02:06
  
打卡学习
宇大大大大大大 发表于 2020-8-17 15:00
  
很强,干货满满
一一氵 发表于 2020-8-19 09:16
  
感谢分享
圣大天齐赵树良 发表于 2020-8-19 13:50
  
逐句地看完这个帖子以后,我的心久久不能平静,震撼啊!为什么会有如此好的帖子!我纵横社区多年,自以为再也不会有任何帖子能打动我,没想到今天看到了如此精妙绝伦的这样一篇帖子。
伊利丹·怒风 发表于 2021-7-22 16:45
  

您好,感谢楼主分享
yim 发表于 2021-8-18 18:50
  
发表新帖
热门标签
全部标签>
【 社区to talk】
每日一问
新版本体验
标准化排查
高手请过招
社区新周刊
产品连连看
GIF动图学习
功能体验
安装部署配置
纪元平台
平台使用
信服课堂视频
网络基础知识
技术笔记
2023技术争霸赛专题
运维工具
排障笔记本
安全效果
答题自测
解决方案
VPN 对接
云化安全能力
产品解析
关键解决方案
专家问答
技术圆桌
设备维护
存储
迁移
秒懂零信任
文档捉虫
华北区交付直播
每周精选
西北区每日一问
畅聊IT
在线直播
MVP
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
每日一记
用户认证
原创分享
sangfor周刊
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
终端接入
授权
资源访问
地址转换
虚拟机
产品预警公告
玩转零信任
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
卧龙计划
华北区拉练
天逸直播
以战代练
技术晨报
技术盲盒
山东区技术晨报
齐鲁TV
2024年技术争霸赛
北京区每日一练
场景专题
故障笔记
排障那些事
升级&主动服务
高频问题集锦
POC测试案例
全能先锋系列
专家说
热门活动
产品动态
行业实践

本版版主

461
248
13

发帖

粉丝

关注

本版达人

feeling

本周分享达人

新手29676...

本周提问达人