VMware内存机制的空闲内存税算法

我曾经在vmsky的论坛发表过一篇探讨VMware内存机制的帖子(见此http://bbs.vmsky.com/thread-23285-1-2.html),最后探讨的例子是一个考虑了空闲内存税(Idle Memory Tax,以下简称IMT)情况下的内存分配计算,但遗憾的是当时猜想的算法是错误的。今天在阅读了Carl的关于内存机制的论文后,深感有必要重新说明一下。

空闲内存税(Idle Memory Tax)是VMware为了更有效地利用主机内存而设置的,它在计算如何分配主机内存的时候,将VM中空闲内存(Idle Memory)和活动内存(Active Memory)区别对待,对空闲内存做惩罚性的计算,使得具有较多空闲内存的VM将获得较少的内存份额。

在<vSphere Resource Management Guide> p98页上如此解释:

Mem.IdleTax, Specifies the idle memory tax rate, as a percentage. This tax effectively charges virtual machines more for idle memory than for memory they are actively using. A tax rate of 0 percent defines an allocation policy that ignores working sets and allocates memory strictly based on shares. A high tax rate results in an allocation policy that allows idle memory to be reallocated away from virtual machines that are unproductively hoarding it.

default:  75

这段解释说明了IMT是一个百分比的数字,介于0-100之间,IMT为0的时候,忽略working set,完全按照shares来分配内存。

那么,这个默认的75%的惩罚税到底有什么影响呢?

Carl的论文中提到一个很重要的参数:份额内存比ρ

其中

ρ是shares-per-page ratio,就是单位内存的份额比重

f是活动内存占总内存的比重

k是惩罚因子,k=1/(1-IMT),比如IMT是75%,则k=4

P是内存总Page数,S是份额

这个公式不太好理解,让我们换一种写法,就容易理解了。

P是VM配置的总内存,f是活动内存的比重,因此P·f就是活动内存数,P·(1-f)就是空闲内存数,于是上面的公式可以表述为:

当主机内存不足的时候,ESX主机会找ρ最小的那台VM来要回内存(reclaim)。

举个例子来说明。

Host有4GB内存,VM1和VM2各自配置了4GB内存,配置份额都是40960。VM2运行1个耗内存的程序,没有空闲内存,VM2的ρ=10。VM1有50%的空闲内存,也就是2GB空闲,2GB活动,IMT是默认的75%,K=4,ρ=40960/(2048+4*2048)=4

因为VM1和VM2的配置内存相同,所以VM1和VM2能争到的内存比是4:10,也就是VM1可以获得1.14GB主机物理内存,而VM2可以获得2.86GB内存。

当然。实际应用当中的内存分配并不是如同计算这样死板的,而是一个连续的不断调整的过程。

本文出自 “delxu的Live记事本” 博客,请务必保留此出处http://delxu.blog.51cto.com/975660/288012

时间: 2024-10-27 20:15:14

VMware内存机制的空闲内存税算法的相关文章

【AIX】AIX内存机制

[AIX]AIX内存机制 1  虚拟内存 虚拟内存是物理内存和交换空间(Paging Space)组合形成的虚拟内存空间, 通过虚拟的地址空间映射到物理内存或者 Paging Space. 在 AIX 中,虚拟内存段被分成 4096 字节大小的页,物理内存则被划分为 4096 字节大小的页帧(page frame) 1.1  物理内存 实际存在的物理内存条上的可供系统使用的缓存. 物理内存大小的查看: 1)        # prtconf | grep memory 2)        # v

虚拟化实战:VM设计之二内存机制

虚拟机需要配置多大的内存合适?怎样才能最佳利用主机的物理内存?怎么把握Over-Commitment的度?本文从概念到实战来阐述如何做好虚拟机上内存资源规划. 一如何分配内存? 首先我们明确一些概念. 上图分三层,他们分别是是App层,OS层和Hypervisor层.对于物理服务器而言,所有的内存资源都分配给单独的操作系统和上面运行的应用.应用将请求先发送给操作系统,然后操作系统调度物理的内存资源. 我们以下面一个场景为例,来分析内存在各层中是如何分配的. 假设我们先启动ESXi主机,这时Hyp

GLIBC内存分配机制引发的“内存泄露”

我们正在开发的类数据库系统有一个内存模块,出现了一个疑似"内存泄露"问题,现象如下:内存模块的内存释放以后没有归还操作系统,比如内存模块占用的内存为10GB,释放内存以后,通过TOP命令或者/proc/pid/status查看占用的内存有时仍然为10G,有时为5G,有时为3G, etc,内存释放的行为不确定. 首先说一下内存模块的内存管理机制.我们的内存管理很简单,使用全局的定长内存池,每一个内存块为64KB,如果申请的内存小于等于64KB时,直接从内存池的空闲链表中获取一个内存块,内

RAMCloud:内存云存储的内存分配机制

现在全闪存阵列已经见怪不怪了,EMC的XtremIO,还有VNX- F(Rockies),IBM FlashSystem.全闪存真正为效率而生,重新定义存储速度.凭借极致性能,高可用性,为您极大提高企业级应用效率.提到闪存的优势,那么毋庸置疑的就是速度!而在速度优势背后,SSD则面临着价格.容量以及寿命等方面的限制. 当然随着技术的发展,成本的下降,SSD有可能会取代机械硬盘,成为下一代企业存储的主要介质.机械硬盘可能转变为磁带的角色. 但是,闪存速度的确就是现在存储系统的极限吗?现在有需要基于

Linux的内存机制概述

一.内存使用说明 Free 命令相对于top 提供了更简洁的查看系统内存使用情况: [root@rac1 ~]# free total       used       free     shared    buffers     cached Mem:       1035108   1008984      26124      0     124212     413000 -/+ buffers/cache:        471772      563336 Swap:       2

Android开发:内存机制分析——堆和栈

  1.dalvik的Heap和Stack 这里说的只是dalvik java部分的内存,实际上除了dalvik部分,还有native.这个以后再说. 开发:内存机制分析--堆和栈-"> 下面针对上面列出的数据类型进行说明,只有了解了我们申请的数据在哪里,才能更好掌控我们自己的程序. 2.对象实例数据 实际上是保存对象实例的属性,属性的类型和对象本身的类型标记等,但是不保存实例的方法.实例的方法是属于数据指令,是保存在Stack里面,也就是上面表格里面的类方法. 对象实例在Heap中分配好

java-Java里iterator迭代器的用法和内存机制不太明白

问题描述 Java里iterator迭代器的用法和内存机制不太明白 为什么声明一个iterator的类型的引用等于对象的iterator方法?不太明白第八行的意思求解答 解决方案 等于的不是方法,而是方法的返回值.看设计模式中的工厂模式和迭代器模式. 举一个例子, class A { public MyIterator iterator() { return new MyIterator(); } } ... A a = new A(); Iterator iter = a.iterator()

java的内存机制

问题描述 一个非常简单的问题,String a="1";String a=new String("1");问题如下:两个内存机制不一样是肯定的吧,String a=new String("1");里面a是引用,a装的是1在内存里面的地址,也就是占用了两块内存String a="1";里面a装的直接是值,只占用一块内存???? 解决方案 String a="1"; a指向String的常量池中的"1

java-Java中string类型在内存机制的存储问题

问题描述 Java中string类型在内存机制的存储问题 package chapter3; public class RefAndAdd { public static void main(String[] args) { String str = ""abc""; String str1 = ""ab""; String str2 = str1 + ""c""; String str