虚拟机内存工作原理VCP60.docx

上传人:b****3 文档编号:5125164 上传时间:2022-12-13 格式:DOCX 页数:9 大小:336.79KB
下载 相关 举报
虚拟机内存工作原理VCP60.docx_第1页
第1页 / 共9页
虚拟机内存工作原理VCP60.docx_第2页
第2页 / 共9页
虚拟机内存工作原理VCP60.docx_第3页
第3页 / 共9页
虚拟机内存工作原理VCP60.docx_第4页
第4页 / 共9页
虚拟机内存工作原理VCP60.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

虚拟机内存工作原理VCP60.docx

《虚拟机内存工作原理VCP60.docx》由会员分享,可在线阅读,更多相关《虚拟机内存工作原理VCP60.docx(9页珍藏版)》请在冰豆网上搜索。

虚拟机内存工作原理VCP60.docx

虚拟机内存工作原理VCP60

虚拟机内存工作原理

Windows环境内存名词释义

Windows内存管理概述 

在现代计算机系统中,内存是指CPU可以直接访问的随机存储器。

在硬件上,CPU通过一组地址线连接到内存上,这组地址线称为内存总线。

而在软件上,CPU的许多指令允许用内存单元地址作为指令的操作数,实现直接操纵这些内存单元。

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

 

物理地址即内存存储器的索引,CPU操纵内存芯片时,通过地址线管脚加上电信号来读或写相应的内存单元。

在Intelx86体系结构上,物理地址是一个32位或36位的无符号整数。

虚拟地址:

在32位系统上,虚拟地址空间可以达到4GB大小,也就是说,整个空间可以有232=4294967296个字节单元。

Intelx86芯片内有专门的电路负责把一个虚拟地址转译成物理地址。

逻辑地址。

逻辑地址包含两部分:

段和偏移。

段指定了在整个地址空间中的一个基地址、段空间的大小、属性。

与寻址相关的是段的基址和大小。

偏移部分指定了一个逻辑地址相对于段基址的偏移量。

此偏移量不能超过段的边界。

因此,逻辑地址的实际地址是段基址加上偏移量。

Intelx86芯片也有专门的电路把逻辑地址转译成一个虚拟地址或物理地址。

 

把一个地址告诉CPU,让它访问相对应的物理内存单元,这一过程是操作系统和CPU相互协作来完成的。

CPU最终需要的是一个物理地址,它必须把软件指令中的地址转译成物理地址,在转译过程中可能会涉及一些数据结构,甚至涉及I/O操作。

 

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

不同进程的地址空间应该是相互隔离的。

实现每个进程都有自己的私有地址空间。

当系统中进程数量增加以后,所需内存数量往往超过了总的物理内存,在这种情况下,操作系统须合理地安排内存的使用,使得内存紧缺时,既不会波及系统本身的稳定性,同时也不会严重影响系统的性能。

当发生这种情况时,一般的做法是把不紧急的进程中的数据或代码先存放到硬盘(pagefile)中,从而把它们占用的物理内存腾出来给紧急的进程使用,或者交给系统使用。

当内存紧缺的状况缓解时,系统再把硬盘(pagefile)中的进程数据或代码装回到已经空闲下来的内存单元中,从而使这些进程有机会继续运行。

这两个过程称为内存换出和换入。

几乎所有的多进程操作系统都支持这种内存管理。

内存基本单元总是字节Bytes。

每个内存地址指向一个字节,地址值加1以后指向下一个字节。

物理内存的地址是固定的,故让进程使用物理地址来访问内存将使得进程的动态分配难以有效实施,因为内存单元与进程将通过物理地址紧密地联系在一起了,从而内存的回收和再分配将受限于特定的进程和物理地址。

为打破这种关联关系,思路是让进程使用虚拟地址,而虚拟地址和物理地址之间通过一个映射表来完成转译。

1.1pagefile:

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

注:

Linux中Swap(交换分区),类似Windows的pagefile,当物理内存不足时,把一部分硬盘空间虚拟成内存使用,解决物理内存容量不足的情况。

Android是基于Linux的操作系统,故也可使用Swap分区来提升系统运行效率。

VMwareESXi上创建的虚拟机会自动根据虚拟机的内存大小创建一个同等大小的swap文件,这个文件通常和虚拟机镜像文件在同一个目录,文件名:

*.vswp。

比如创建一个内存为8GB的VM,*.vswap会自动创建,且大小为8GB,保存在同1个datastore中。

1.2虚拟内存:

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

从winNT开始,普通的应用程序已无法直接访问物理内存,只能访问虚拟内存,再由CPU将虚拟内存地址转换为物理内存地址。

所以运行软件和游戏,访问的都是虚拟内存。

(驱动程序应能直接访问物理内存)

应用程序能使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。

当物理内存的供应量变小时,内存管理器会将物理内存页(通常4KB)保存到磁盘文件。

数据或代码页会根据需要在物理内存与磁盘之间移动。

案例:

pagefile的应用(物理内存16G,pagefile16G)

应用程序

内存扫描

启动

物理内存剩余量

活跃/闲置

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无法启动。

极限之后会出现:

蓝屏或重启。

VMware虚拟机环境内存利用技术

1、透明页共享TPS

透明页共享是虚拟化中的内存管理技术之一,是指将1台主机上的冗余内存页精简为1个页面,而其它页面用指针代替,从而达到释放内存空间的目的。

该技术的核心要点:

相同类型操作系统中,相同服务或是进程所消耗的内存,只保留1份。

TPS不能用于内存很大的页面,因为通常情况下,只有小内存页才能完全相同。

VMware的ESXi是按照4KB为单位进行内存切片的。

内存回收的速度取决于扫描的速度,在ESXi的高级设置中可以设置TPS扫描的速度和时间间隔。

故最好将相同OS的VM配置在1台ESXi主机上,以便更好的使用TPS节省内存。

案例:

当多个VM运行相同的Windowsserver2008R2在同一个ESXi主机上时,就会有存储完全相同的进程或服务的内存页面。

虚拟机管理程序会在每个内存页面上分配哈希值,并一位一位的进行比较,一旦不同页面的哈希值相匹配,就说明存在相同的内存页面。

如果虚拟机管理程序确认了同一主机上的多个虚拟机有完全相同的内存页面,它会保留其中一份,而其它页面用指针代替。

这样就释放了很多内存空间。

另外,如果虚拟机上指针所代表的信息发生变化,虚拟机管理程序就会向内存信息写入一个新的页面,同时改变指针信息。

2、气球膨胀(Ballooning)

依据VMwareTools在GuestOS中的气球驱动(balloondriver)来回收内存。

当需要从该虚拟机回收内存时,气球膨胀从GuestOS中请求内存,分配给气球驱动的内存可被hypervisor安全的回收,GuestOS自行决定将哪些内存swapping交换到硬盘上以保证分配给气球驱动内存。

显然需要安装VMwareTools才能实现气球回收内存,通过这种方式回收内存较慢,依赖于GuestOS内存分配的速度。

附件1:

VM内存调度机制-balloon

VM内存调度机制-balloon

在内存没有过量配置的情况下,内存的调度机制完全不会启动,就没有内存回收措施。

因为主机总的物理内存大于所有VM配置内存的总额的情况下,每台虚机想要多少内存,都能得到满足,所以不需要调度机制。

以下研究的VMware的内存调度机制,都是在内存过量配置的情况下发生的。

案例:

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

1、充裕HOSTmemory保障VMmemory使用的情况

现在水箱1里面要养鱼了,必须放点水进去以便鱼可以存活(开机了)。

最少需要1GB内存。

于是水箱1(VM1)就向水池(Host)要水(物理内存),水池里面有足够的水,就满足了水箱1的要求。

现在水箱1有1GB的活水,而水池里面只剩下3GB的水了。

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

现在水箱1里面有3GB的水,而水池里面只剩下1GB的水了。

解释:

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

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

经过了一段时间以后,水箱1里面的鱼被捕走了,现在水箱1不需要那么多水也足够养活剩下的鱼了。

但是水池并不知道水箱1的状况。

于是水箱1还是有那么多水。

解释:

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

VM1中就有一部分内存属于idle(空闲的)memory,另外一些正在使用的内存就是activememory。

当然,就VM1自己的GuestOS看起来,有3GB空闲内存(idlememory),1GB的活动内存;而此时就Host看来,只看见有3GB内存是分配给了VM1的。

Host通过VMwareTools中的驱动,每隔一定的时间(ESX4中默认是60秒)去扫描一下VM1的内存使用状态,以了解活动内存(activememory)的情况。

 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每隔一定时间就会扫描GuestOS的内存使用状况,此时,Host会计算(VMtools)每个VM的份额内存比ρ,对ρ最小的那台虚机启动气球驱动,气球开始膨胀。

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

解释:

Balloon驱动如同普通驱动那样,不断向GuestOS索取内存,GuestOS尽自己可能满足气球驱动,并优先将空闲部分的内存分配给它,注意,此时可能出现GuestOS自己的物理内存不足,并引起GuestOS的paging(内存分页)机制,将一部分内存pageout(页出)到自己的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的activememory由2部分组成,1部分是获得的主机物理内存,另一部分是swap。

请注意,GuestOS是不知道自己的一部分物理内存是硬盘上的swap文件的。

当机器内存不足竞争开始的时候,shares开始起作用。

但是,请注意,如果IMT是0,对空闲内存不征税,由于4GB的VM1和4GB的VM2的份额都是40960,因此它们最终会拿到相同的物理内存2GB。

但是如果IMT是默认值,那么空闲内存的代价更大,那么这2台VM会根据active内存数量的不同,获得不同数量的物理内存。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1