在虚拟化应用中,内存是最为宝贵的资源。同CPU和存储资源管理相比,虚拟化的内存资源管理更为复杂。

  • 内存回收vmware ESX hypervisor(管理程序)能够截获虚拟机第一次访问某内存,将物理内存填零后分配给虚拟机,但是hypervisor无法得知虚拟机中哪些内存是空闲的。hypervisor不断的将内存分配给虚拟机,当在内存超配(memory overcommitment)的情况下主机物理内存将可能耗尽,因此hypervisor需要从虚拟机中回收(reclaim)内存,ESX hypervisor使用以下机制回收内存:
    当主机可用内存高于等于6%时,hypervisor仅使用透明页共享回收内存(当没有设置虚拟机内存限制时)。如果虚拟机设定了内存限制,则hypervisor使用ballooning甚至swapping回收内存直到低于限定值。当主机可用内存接近4%时,hypervisor使用ballooning回收内存,一般情况下可以及时的回收内存,让可用内存保持在4%以上。如果ballooning不足以回收内存,主机可用内存接近2%时,hypervisor在ballooning回收内存的基础上增加使用swapping(并激活内存压缩)加速内存回收,让可用内存保持在4%以上。罕见的当主机可用内存只有1%时,hypervisor除了继续使用ballooning和swapping回收内存,还禁止所有虚拟机申请更多内存。

    • 透明页共享(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)的高级设置中可以设置压缩缓存的大小等。

  • 虚拟机内存分配VMware ESX(i)提供了三个参数来控制虚拟机的内存分配。

    • “限制(Limit)”限定了分配给虚拟机物理内存的上限,如果虚拟机使用的内存超过该限定值则hypervisor强制回收内存,默认是无限制,即以虚拟机内存大小为限。虚拟机硬件设置中的内存对于大多数Guest OS是不能热添加的,有的能热添加但是要使用添加的内存还要重启Guest OS,只有少数Guest OS能热添加并使用的,因为这个需要Guest OS识别,因此对Guest OS要求高。但是内存限制可以在虚拟机运行时随意的调整,Guest OS无需感知是透明的。

    • “预留(Reservation)”是保证分配给虚拟机最低物理内存的下限,即hypervisor至多从虚拟机回收内存到预留值为止,不再继续回收,保证一个基本的内存可避免性能降低到无法忍受。

    • “份额(Shares)”是当主机内存过量使用时,虚拟机可获得的物理内存是通过一个公式计算得到的,份额是其中一项。默认份额=虚拟机内存*10。公式:ρ=份额/(活动内存+k*空闲内存),ρ就是该虚拟机可获得物理内存比例的分子,分母是所有虚拟的ρ的和。k是惩罚因子,k=1/(1-IMT),IMT为空闲内存税(Idle Memory Tax),默认IMT=75%,即k=4,IMT值可以在ESX(i)的高级设置中修改。显然份额越大,活动内存比例越高则ρ越大,可获得的物理内存越多。hypervisor从ρ最小的虚拟机开始回收内存。

本文转自 qq8658868 51CTO博客,原文链接:http://blog.51cto.com/hujizhou/1688815,如需转载请自行联系原作者

如何理解VMware内存资源管理相关推荐

  1. 深入理解C++内存管理

    深入理解C++内存管理 一文了解所有C++内存的问题 AlexCool 目录 一  C++内存模型 二  C++对象内存模型 三 C++程序运行内存空间模型 四  C++栈内存空间模型 五 C++堆内 ...

  2. VMware内存回收与分配机质

    VMware内存回收与分配机质 整理了下学习过的东西,为了防止以后忘记.^_^ VMware内存回收 按照内存回收先后顺充,依次为: 1.TPS 透明页共享 2.Ballooning 气球回收 3.C ...

  3. 深入理解 Java 内存模型(转载)

    摘要: 原创出处 http://www.54tianzhisheng.cn/2018/02/28/Java-Memory-Model/ 「zhisheng」欢迎转载,保留摘要,谢谢! 0. 前提 &l ...

  4. 深入理解 Java内存模型

    深入理解 Java内存模型 原文地址:http://www.54tianzhisheng.cn/2018/02/28/Java-Memory-Model/ 本文主要内容有 Java 内存模型的基础.重 ...

  5. 深入理解并发内存模型||JMM与内存屏障||多核并发缓存架构 ||JMM内存模型||volatile 关键字的作用 ||JMM 数据原子操作||JMM缓存不一致的问题

    深入理解并发内存模型||JMM与内存屏障 多核并发缓存架构 JMM内存模型 volatile 关键字的作用 JMM 数据原子操作 JMM缓存不一致的问题

  6. 深入理解 Java 内存模型 JMM

    前提 <深入理解 Java 内存模型>程晓明著,该书在以前看过一遍,现在学的东西越多,感觉那块越重要,于是又再细看一遍,于是便有了下面的读书笔记总结.全书页数虽不多,内容讲得挺深的.细看的 ...

  7. 《深入理解 Java 内存模型》读书笔记(上)(干货,万字长文)

    目录 0. 前提 1. 基础 1.1 并发编程的模型分类 1.1.1 通信 1.1.2 同步 1.2 JAVA 内存模型的抽象 2. 重排序 2.1 处理器重排序 2.2 内存屏障指令 2.3 HAP ...

  8. 一文带你深入理解JVM内存模型

    一文带你深入理解JVM内存模型 一.JAVA的并发模型 共享内存模型 在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信 该内存指的是主内存,实际上是物 ...

  9. 聊聊高并发(三十三)Java内存模型那些事(一)从一致性(Consistency)的角度理解Java内存模型

    可以说并发系统要解决的最核心问题之一就是一致性的问题,关于一致性的研究已经有几十年了,有大量的理论,算法支持.这篇说说一致性这个主题一些经常提到的概念,理清Java内存模型在其中的位置. 一致性问题更 ...

最新文章

  1. HTTP请求时connectionRequestTimeout 、connectionTimeout、socketTimeout三个超时时间的含义...
  2. 为什么你看了那么多面经,面试还是挂了?
  3. 跟我一起写 Makefile(整理版)
  4. pythonuiautomator2教程_UIAutomator2 + Python 入门使用总结
  5. MFC界面库BCGControlBar v25.3新版亮点:Dialogs和Forms
  6. 9件事把你从消极情绪中解救出来
  7. python3软件怎么使用_python3怎么使用pip
  8. 易语言mysql乱码_分享一个解决MySQL写入中文乱码的方法
  9. CYYMysql 源码解读 2
  10. 艺术名家|翰墨异彩“三分书”——访知名书法家蔡爱军
  11. 用户故事与敏捷方法—用户故事验收测试
  12. 内存free和available区别
  13. 2018 CSDN博客之星评选,请投我一票~
  14. 超全MES系统知识普及,必读此文
  15. Ended a touch event which was not counted in trackedTouchCount (ReactNative RN开发时多点触摸滑动报错)
  16. 那个叫“中国移动”的精神病人就要被治愈了
  17. 创维电视android,当贝市场创维酷开专用版
  18. HCIE必经之路(五)——OSPF综合实验(STUB及NSSA)
  19. Nginx Error: socket() [::]:80 failed (97: Address family not supported by protocol)
  20. ffmpeg win10 ffmpeg 采集数据

热门文章

  1. dlopen函数的用法
  2. 日志分割工具cronolog
  3. 动态规划--背包问题
  4. IntelliJ IDEA16 热部署,解决每次修改java文件就得重启tomcat的问题
  5. 调用python 报R6034 错误
  6. C#-利用ZPL语言完毕条形码的生成和打印
  7. 地表地形对地下温度及地表热流的影响
  8. 很久没更新博客了,再发协同开发中SVN使用规范
  9. 关于const记录类型全局变量赋初值的问题
  10. 关于软件项目中的风险