虚拟机内存工作原理
Windows环境内存名词释义
Windows内存管理概述
在现代计算机系统中,内存是指CPU可以直接访问的随机存储器。在硬件上,CPU通过一组地址线连接到内存上,这组地址线称为内存总线。而在软件上,CPU的许多指令允许用内存单元地址作为指令的操作数,实现直接操纵这些内存单元。内存地址,在Intel x86体系结构中,内存地址有三种类型:
物理地址即内存存储器的索引,CPU操纵内存芯片时,通过地址线管脚加上电信号来读或写相应的内存单元。在Intel x86体系结构上,物理地址是一个32位或36位的无符号整数。
虚拟地址:在32位系统上,虚拟地址空间可以达到4GB大小,也就是说,整个空间可以有2=4294967296个字节单元。Intel x86芯片内有专门的电路负责把一个虚拟地址转译成物理地址。
逻辑地址。逻辑地址包含两部分:段和偏移。段指定了在整个地址空间中的一个基地址、段空间的大小、属性。与寻址相关的是段的基址和大小。偏移部分指定了一个逻辑地址相对于段基址的偏移量。此偏移量不能超过段的边界。因此,逻辑地址的实际地址是段基址加上偏移量。Intel x86芯片也有专门的电路把逻辑地址转译成一个虚拟地址或物理地址。
把一个地址告诉CPU,让它访问相对应的物理内存单元,这一过程是操作系统和CPU相互协作来完成的。CPU最终需要的是一个物理地址,它必须把软件指令中的地址转译成物理地址,在转译过程中可能会涉及一些数据结构,甚至涉及I/O操作。
从操作系统的角度来看,一方面,它需要有效地管理所有的物理内存,使得当一个进程需要内存时,能够分配足够的内存单元给这一进程;另一方面,正如上一章所讲,进程代表一个相对独立的任务,它有一个逻辑上独立的地址空间。不同进程的地址空间应该是相互隔离的。实现每个进程都有自己的私有地址空间。
当系统中进程数量增加以后,所需内存数量往往超过了总的物理内存,在这种情况下,操作系统须合理地安排内存的使用,使得内存紧缺时,既不会波及系统本身的稳定性,同时也不会严重影响系统的性能。当发生这种情况时,一般的做法是把不紧急的进程中的数据或代码先存放到硬盘(pagefile)中,从而把它们占用的物理内存腾出来给紧急的进程使用,或者交给系统使用。当内存紧缺的状况缓解时,系统再把硬盘(pagefile)中的进程数据或代码装回到已经空闲下来的内存单元中,从而使这些进程有机会继续运行。这两个过程称为内存换出和换入。几乎所有的多进程操作系统都支持这种内存管理。
内存基本单元总是字节Bytes。每个内存地址指向一个字节,地址值加1以后指向下一个字节。物理内存的地址是固定的,故让进程使用物理地址来访问内存将使得进程的动态分配难以有效实施,因为内存单元与进程将通过物理地址紧密地联系在一起了,从而内存的回收和再分配将受限于特定的进程和物理地址。为打破这种关联关系,思路是让进程使用虚拟地址,而虚拟地址和物理地址之间通过一个映射表来完成转译。
1.1 pagefile:即windows安装过程中创建的分页文件,见下图。
32
注: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) 应用程序 内存扫描 启动 物理内存剩余量 活跃/闲置 A B C D 20G 8G 6G 4G NO YES YES YES 8G 2G 2G+OS回收2G 7G/1G 5G/1G Pagefile 1G 1G Total应用占用了32G,应用程序X无法启动。极限之后会出现:蓝屏或重启。 VMware虚拟机环境内存利用技术 VMM虚拟机监控程序若VM启动时只需要1GB内存,按需分配?是否能够开启VMkernelVM1配置2GB内存...共8台全负载VM9配置2GB内存16GB物理内存若VM将2GB内存全部用完,Vmkernel不会增加内存供给。办法:使用VM1的pagefile。当VM9启动,出现内存过量配置,VMkernel会启动内存的调度机制,第一步:透明页共享(TPS),回收0.8GB内存;第二步:balloon;第三步:交换文件(Swap)。*注:每个VM是一个进程,VMkernel对所有VM都是平等的,内存没有过量配置的情况下,内存的调度机制完全不会启动。 1、透明页共享TPS 透明页共享是虚拟化中的内存管理技术之一,是指将1台主机上的冗余内存页精简为1个页面,而其它页面用指针代替,从而达到释放内存空间的目的。 该技术的核心要点:相同类型操作系统中,相同服务或是进程所消耗的内存,只保留1份。TPS不能用于内存很大的页面,因为通常情况下,只有小内存页才能完全相同。VMware的ESXi是按照4KB为单位进行内存切片的。内存回收的速度取决于扫描的速度,在ESXi的高级设置中可以设置TPS扫描的速度和时间间隔。故最好将相同OS的VM配置在1台ESXi主机上,以便更好的使用TPS节省内存。 案例: 当多个VM运行相同的Windows server 2008R2在同一个ESXi主机上时,就会有存储完全相同的进程或服务的内存页面。虚拟机管理程序会在每个内存页面上分配哈希值,并一位一位的进行比较,一旦不同页面的哈希值相匹配,就说明存在相同的内存页面。如果虚拟机管理程序确认了同一主机上的多个虚拟机有完全相同的内存页面,它会保留其中一份,而其它页面用指针代替。这样就释放了很多内存空间。另外,如果虚拟机上指针所代表的信息发生变化,虚拟机管理程序就会向内存信息写入一个新的页面,同时改变指针信息。 2、气球膨胀(Ballooning) 依据VMware Tools在Guest OS中的气球驱动(balloon driver)来回收内存。当需要从该虚拟机回收内存时,气球膨胀从Guest OS中请求内存,分配给气球驱动的内存可被hypervisor安全的回收,Guest OS自行决定将哪些内存swapping交换到硬盘上以保证分配给气球驱动内存。显然需要安装VMware Tools才能实现气球回收内存,通过这种方式回收内存较慢,依赖于Guest OS内存分配的速度。 附件1: VM内存调度机制-balloon VM内存调度机制-balloon 在内存没有过量配置的情况下,内存的调度机制完全不会启动,就没有内存回收措施。因为主机总的物理内存大于所有VM配置内存的总额的情况下,每台虚机想要多少内存,都能得到满足,所以不需要调度机制。 以下研究的VMware的内存调度机制,都是在内存过量配置的情况下发生的。 案例:发生在一个有智慧的水池(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种状态,