虚拟机内存工作原理VCP

虚拟机内存工作原理VCP
虚拟机内存工作原理VCP

虚拟机内存工作原理

Windows环境内存名词释义

Windows内存管理概述

在现代计算机系统中,内存是指CPU可以直接访问的随机存储器。在硬件上,CPU通过一组地址线连接到内存上,这组地址线称为内存总线。而在软件上,CPU的许多指令允许用内存单元地址作为指令的操作数,实现直接操纵这些内存单元。内存地址,在Intel x86

体系结构中,内存地址有三种类型:

物理地址即内存存储器的索引,CPU操纵内存芯片时,通过地址线管脚加上电信号来读或写相应的内存单元。在Intel x86体系结构上,物理地址是一个32位或36位的无符号整数。

虚拟地址:在32位系统上,虚拟地址空间可以达到4GB大小,也就是说,整个空间可以有232=4294967296个字节单元。Intel x86芯片内有专门的电路负责把一个虚拟地址转译成物理地址。

逻辑地址。逻辑地址包含两部分:段和偏移。段指定了在整个地址空间中的一个基地址、段空间的大小、属性。与寻址相关的是段的基址和大小。偏移部分指定了一个逻辑地址相对于段基址的偏移量。此偏移量不能超过段的边界。因此,逻辑地址的实际地址是段基址加上偏移量。Intel x86芯片也有专门的电路把逻辑地址转译成一个虚拟地址或物理地址。

把一个地址告诉CPU,让它访问相对应的物理内存单元,这一过程是操作系统和CPU相互协作来完成的。CPU最终需要的是一个物理地址,它必须把软件指令中的地址转译成物理地址,在转译过程中可能会涉及一些数据结构,甚至涉及I/O操作。

从操作系统的角度来看,一方面,它需要有效地管理所有的物理内存,使得当一个进程需要内存时,能够分配足够的内存单元给这一进程;另一方面,正如上一章所讲,进程代表一个相对独立的任务,它有一个逻辑上独立的地址空间。不同进程的地址空间应该是相互隔离的。实现每个进程都有自己的私有地址空间。

当系统中进程数量增加以后,所需内存数量往往超过了总的物理内存,在这种情况下,操作系统须合理地安排内存的使用,使得内存紧缺时,既不会波及系统本身的稳定性,同时也不会严重影响系统的性能。当发生这种情况时,一般的做法是把不紧急的进程中的数据或代码先存放到硬盘(pagefile)中,从而把它们占用的物理内存腾出来给紧急的进程使用,或者交给系统使用。当内存紧缺的状况缓解时,系统再把硬盘(pagefile)中的进程数据或代码装回到已经空闲下来的内存单元中,从而使这些进程有机会继续运行。这两个过程称为内存换出和换入。几乎所有的多进程操作系统都支持这种内存管理。

内存基本单元总是字节Bytes。每个内存地址指向一个字节,地址值加1以后指向下一个字节。物理内存的地址是固定的,故让进程使用物理地址来访问内存将使得进程的动态分配难以有效实施,因为内存单元与进程将通过物理地址紧密地联系在一起了,从而内存的回收和再分配将受限于特定的进程和物理地址。为打破这种关联关系,思路是让进程使用虚拟地址,而虚拟地址和物理地址之间通过一个映射表来完成转译。

1.1 pagefile:即windows安装过程中创建的分页文件,见下图。

注:Linux中Swap(交换分区),类似Windows的pagefile,当物理内存不足时,把一部分硬盘空间虚拟成内存使用,解决物理内存容量不足的情况。Android是基于Linux的操作系统,故也可使用Swap分区来提升系统运行效率。

VMware ESXi上创建的虚拟机会自动根据虚拟机的内存大小创建一个同等大小的swap 文件,这个文件通常和虚拟机镜像文件在同一个目录,文件名:*.vswp。比如创建一个内存为8GB的VM,*.vswap会自动创建,且大小为8GB,保存在同1个 datastore中。

1.2虚拟内存:Windows可使用的内存总称,包括物理内存和分页文件。

从win NT开始,普通的应用程序已无法直接访问物理内存,只能访问虚拟内存,再由CPU将虚拟内存地址转换为物理内存地址。所以运行软件和游戏,访问的都是虚拟内存。(驱动程序应能直接访问物理内存)

应用程序能使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常4KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。

案例:pagefile的应用(物理内存16G,pagefile 16G)

应用程序内存扫描启动物理内存剩余量活跃/闲置Pagefile

A 20G NO

B 8G YES 8G 7G/1G 1G

C 6G YES 2G 5G/1G 1G

D 4G YES 2G+OS回收2G

Total应用占用了32G,应用程序X无法启动。极限之后会出现:蓝屏或重启。

案例:发生在一个有智慧的水池(Host)中,水池有不少水(4GB物理内存),里面还有2个水箱(配置了2台VM),水箱有一定的容量(配置内存是4GB),原本是空的(没有开机)。

1、充裕HOST memory保障VM memory使用的情况

现在水箱1里面要养鱼了,必须放点水进去以便鱼可以存活(开机了)。最少需要1GB 内存。于是水箱1(VM1)就向水池(Host)要水(物理内存),水池里面有足够的水,就满足了水箱1的要求。现在水箱1有1GB的活水,而水池里面只剩下3GB的水了。

水箱1里面多丢了些鱼(启动新的应用),原来1GB的水不够用了,于是水箱1就继续向水池要水,水池HOST里面还有足够的水,就又满足了水箱1的要求。现在水箱1里面有3GB 的水,而水池里面只剩下1GB的水了。

解释:要注意的是,此时VM1里面的应用程序都是活动的(active),所以这些内存都属于活跃状态,叫做活动内存(Active Memory)。

2、VM闲置的memory不会主动归还HOST

经过了一段时间以后,水箱1里面的鱼被捕走了,现在水箱1不需要那么多水也足够养活剩下的鱼了。但是水池并不知道水箱1的状况。于是水箱1还是有那么多水。

解释:VM1的某些应用结束后,释放了部分内存,但是这些内存释放动作是在VM的Guest OS层面释放的,故Host并不知道有内存被释放了,这些内存没有归还Host,仍然由VM1

占有。VM1中就有一部分内存属于idle(空闲的)memory,另外一些正在使用的内存就是active memory。当然,就VM1自己的Guest OS看起来,有3GB空闲内存(idle memory),1GB的活动内存;而此时就Host看来,只看见有3GB内存是分配给了VM1的。Host通过VMware Tools中的驱动,每隔一定的时间(ESX4中默认是60秒)去扫描一下VM1的内存使用状态,以了解活动内存(active memory)的情况。

3、Balloon或Swap内存调度机制

水箱2中养鱼了(VM2开机),水箱2也开始从水池中抽水。但是水池HOST里面的水不能枯竭,因此水池有警戒水位,第一条警戒水位是6%,当下降到第一警戒水位以下并仍然在不停下降时,就要开动调水机制从其他水箱反抽水。

解释:VM2开机时也需要1GB内存,在启动时,它也不断向Host请求内存。Host则将自己的内存源源不断地分配给VM2,直到下降到第一条警戒位6%。Host内存有4种状态,

分别是High, Soft, Hard和Low,它们间的分界线分别是6%, 4%, 2%和1%。可用内存高于6%时,不会启动Balloon或Swap机制。当低于6%向4%逼近时,Balloon机制就启动了。

向哪个水箱抽水呢?谁的水最富裕就向谁抽。

解释:如何判断呢?刚才我们说过,Host每隔一定时间就会扫描Guest OS的内存使用状况,此时,Host会计算(VM tools)每个VM的份额内存比ρ,对ρ最小的那台虚机启动气球驱动,气球开始膨胀。

于是,气球开始膨胀,并将多余的水挤出水箱。

解释:Balloon驱动如同普通驱动那样,不断向Guest OS索取内存,Guest OS尽自己可能满足气球驱动,并优先将空闲部分的内存分配给它,注意,此时可能出现Guest OS自己的物理内存不足,并引起Guest OS的paging(内存分页)机制,将一部分内存page out (页出)到自己的swap中。这个例子中,VM1还有很多空闲内存,因此足够让主机回收并满足VM2的需求。

主机将比较气球膨胀获得的这部分内存的地址,如果原先是分配给VM1独享的,(也就是没有TPS共享),那么就可以收回。主机将不停的通过气球驱动收回内存,收回的目标是保持至少6%的内存。

注意:此时内存没有出现争用情况,因此shares仍然没有起作用,但是Overcommitment 是存在的,所以会有reclaim,会有ballooning。

Ballooning回收内存是比较慢的,通常需要几分钟。

如果主机可用内存池的内存减少速度大于气球驱动返还主机的内存,那么可用内存会进一步下降,当突破4%的第2警戒线时,进入到hard状态,主机就会启用第2种回收机制——swapping(交换),将VM1的一部分物理内存交换到swap文件中,以加快回收内存的速度。目的是将可用内存保持在4%的警戒线以上。

如果可用内存继续下降到2%以下,进入到low状态的时候,ESX不仅会继续加速Swapping,还会阻止其上所有VM的内存请求。

现在,情况又发生了变化,水箱2中的鱼越来越多了,它不停地向水池要水,而水池也通过气球驱动,不停地将水箱1中的空闲内存挤出来,直到水箱1和2的总需求量大于了水池能供给的水量。水池再也不能提供更多的水了,只能部分满足2个水箱的要求了。不够的部分怎么办?用一些脏水(swap)来满足。脏水虽然脏(swap内存速度很慢,注意:硬盘访问时间是以毫秒(ms,千分之一秒)计算,而内存访问时间以纳秒(ns,十亿分之一)计算,两者相差100万倍。),鱼在脏水里面生存的很困难,但毕竟还是有水的,不至于因为没有足够的水而导致鱼死掉。

此时,VM1和VM2的active memory由2部分组成,1部分是获得的主机物理内存,另一部分是swap。请注意,Guest OS是不知道自己的一部分物理内存是硬盘上的swap文件的。

当机器内存不足竞争开始的时候,shares开始起作用。但是,请注意,如果IMT是0,对空闲内存不征税,由于4GB的VM1和4GB的VM2的份额都是40960,因此它们最终会拿到相同的物理内存2GB。但是如果IMT是默认值,那么空闲内存的代价更大,那么这2台VM 会根据active内存数量的不同,获得不同数量的物理内存。

相关主题
相关文档
最新文档