【IT168 应用技巧】为方便识别虚拟的资源和物理(或叫真实的)资源,本人文章中以小写字母v前缀标识虚拟资源,小写字母p前缀标识物理资源。例如:

  vCPU = 虚拟CPU

  pCPU = 物理CPU

  vRAM = 虚拟机的内存,也称之为Guest OS配置内存(Configured Size),或者说GOS的物理内存

  pRAM = 物理内存,也称机器内存(Machine Memory),或主机物理内存(Host Physical Memory)

  =========================================

  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设定内存的大小。

  所以,即使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/impact-of-host-local-vm-swap-on-ha-and-drs/

  【Memory Shares】

  Memory shares简单的说就是份额。当内存资源不足时,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将获得3GB*1000/(1000+2000)=1GB内存。而VM2将获得3GB*2000/(1000+2000)=2GB的物理内存。

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

  关于VMware Memory分配机制的进一步探讨,敬请期待续篇。

转载于:https://blog.51cto.com/cxpbt/463777

从内存上限说起 VMware内存分配初探的更多相关文章

  1. 全面介绍Windows内存管理机制及C++内存分配实例

    转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...

  2. 图解VMware内存机制

    在写<VMware内存机制初探>之后,原本是计划写一篇<VMware内存机制再探>的,讲一讲VMware内存机制中的另外几个重要内容,比如透明内存共享(TPS, Transpa ...

  3. DELPHI声明一个指针变量,什么时候需要分配内存,什么时候不需要分配内存?

    DELPHI声明一个指针变量,什么时候需要分配内存,什么时候不需要分配内存?比如我定义个变量 var p:Pchar;如果这个变量声明为全局变量,需要分配内存吗?分配为局部变量,需要分为内存吗?为什么 ...

  4. Android内存管理(5)*官方教程:Logcat内存日志各字段含义,查看当前内存快照,跟踪记录内存分配,用adb查看内存情况时各行列的含义,捕获内存快照的3种方法,如何让程序暴漏内存泄漏的方法

    Investigating Your RAM Usage In this document Interpreting Log Messages                 内存分析日志中各消息的含 ...

  5. Go语言内存管理(一)内存分配

    Go语言内存管理(一)内存分配 golang作为一种"高级语言",也提供了自己的内存管理机制.这样一方面可以简化编码的流程,降低因内存使用导致出现问题的频率(C语言使用者尤其是初学 ...

  6. 目录_Java内存分配(直接内存、堆内存、Unsafel类、内存映射文件)

    1.Java直接内存与堆内存-MarchOn 2.Java内存映射文件-MarchOn 3.Java Unsafe的使用-MarchOn 简单总结: 1.内存映射文件 读文件时候一般要两次复制:从磁盘 ...

  7. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  8. Android内存优化1 了解java内存分配 1

    开篇废话 今天我们一起来学习JVM的内存分配,主要目的是为我们Android内存优化打下基础. 一直在想以什么样的方式来呈现这个知识点才能让我们易于理解,最终决定使用方法为:图解+源代码分析. 欢迎访 ...

  9. free如何知道释放内存长度:vs与glibc分配内存时编译器内部处理

    鉴于网上这个资料实在太少,将以前整理过却未完全的一篇文章贴出来,希望大牛指正vs下内存管理方式.可联系gaoshiqiang1987@163.com vs分配内存 vs没有源码,编译器在分配内存时,分 ...

随机推荐

  1. MQTT 协议学习:002- 通信报文的构成

    背景 之前工作中参与有关协议调试的时候,发现对于协议帧的解析是比较重要的. 参考:<MQTT协议 -- 消息报文格式>.<基于STM32实现MQTT>.<MQTT协议从服 ...

  2. GoJS实例1

    复制如下内容保存到空白的.html文件中,用浏览器打开即可查看效果 <!DOCTYPE html> <html> <head> <meta charset=& ...

  3. imp.load_source的用法

    imp.load_source(name,pathname[,file])的作用把源文件pathname导入到name模块中,name可以是自定义的名字或者内置的模块名称. 假设在路径E:/Code/ ...

  4. git下载安装、配置及idea初始化

    安装 wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.19.0.tar.gz git 安装依赖 yum -y insta ...

  5. 3-安装RabbitMQ

    1. 安装erlang 1.1 下载erlang http://www.erlang.org/downloads/20.1 yum -y install make ncurses-devel gcc  ...

  6. CheckBox标签和属性

    CheckBox的作用:可以提供复选 下面是我点击按钮查看所选内容的代码:定义按钮监听器,并在onClick方法中调用shoeAlt方法(此方法会在第二块代码定义) Button btn=(Butto ...

  7. cf221 D. Little Elephant and Array

    题解真的是太神奇了2333 用离线和树状数组(为什么感觉和HH的项链是的,什么鬼),比较巧妙的是他把整个数列分成几段.用一个vector来记录每个数出现的位置.一共就是data[a[i]][sz]-- ...

  8. BeanUtils使用将一个对象拷贝到另外一个对象

    这里的BeanUtils是BeanUtils是org.springframework.beans.BeanUtils,和org.apache.commons.beanutils.BeanUtils是有 ...

  9. 《动手学深度学习》系列笔记—— 1.2 Softmax回归与分类模型

    目录 softmax的基本概念 交叉熵损失函数 模型训练和预测 获取Fashion-MNIST训练集和读取数据 get dataset softmax从零开始的实现 获取训练集数据和测试集数据 模型参 ...

  10. 125-PHP类__set()魔术方法

    <?php class ren{ //定义一个人类 //定义成员属性 private $name='tom'; private $age=15; //定义__set()魔术方法 public f ...