虚拟内存超额分配---学习笔记

可以在一个物理主机上开多个虚机,

那么假设,这个物理主机的内存总共是4gb的内存,

假设不考虑vmm的开销,可以开第一台虚机4G,available 是4G,reservations 是1G,可以再开一台虚机,4GB的available ,1GB的reservations,再开一台,如果不考虑overhead ,还可以再开一台,现在虚机开了4台了,总共加起来,available 的已经是4*4的,已经是16GB的了,但是实际的物理主机的内存是4GB,这个叫做memory 的over,内存的超配,这种是可以的,因为大部分情况下,一个应用对内存的使用都不会用满的,一个物理机上运行一个应用程序,它用的内存,平均利用率大概是百分之十,百分之二十,

超配了之后,当你把一堆的虚机放到一个主机上之后,超配提高内存的利用率

第一,内存超配不是问题,尤其有一些应用对于性能要求不是特别高的,超配就更没有问题了,但是还是要考虑一些东西,

假如这边还是有4GB的内存,不考虑vmm,第一台虚机available4G,reservations是1G,开机,如果这个操作系统装4gb的数据到内存里面去,这个时候,vmkernal会把这4G的物理内存,全都分给这台虚机,所以这个4GB的物理内存里面全都有数据了,现在如果有第二台虚机想开机,但是物理内存4GB全都分配掉了,已经给虚机1了,那这个时候,怎么办?Vmkernal 在下面就要想办法了,它要把一部分内存从第一台虚机里面,收一些回来,再分配给第二台虚机去使用,它不能就把内存直接给它用,因为虚机1已经把数据放进去了,内存里面已经有数据了,不能直接把物理内存拿过来,给虚机2去使用,所以vmkernal要想个办法把内存回收回来,

 

那么用什么办法来回收,这个就是一个比较重要的内容了。

第一个办法透明页面共享,

 

透明页面共享:这个虚机有这么多内存页面,都最终落到我的物理内存上,有没有可能,绿色的内存页面和这个橙色的内存页面,里面的数据是一模一样的,一个驱动运行了两次,一个软件运行了两次,是不是又可能一模一样,

 

 

既然是一模一样,那有没有可能这个指针就指向相同的物理内存页面,

 

那么这个时候,这个橙色的内存页面就省下来了,这个就是透明内存页面共享。

vmkernal在一定的条件下,它会主动的把这个内存页面进行一个计算哈希,计算出到底是哪些内存页面的数据是一样

,然后把它指向同一个物理内存页面,这样能省内存页面下来,除此之外,vmkernal 给虚机分出去的内存,一开始是没有数据的,这个叫做零内存页面,零内存页面一定也是会共享出去的,

所以透明页面共享,能够共享一部分内存页面出来,能够节省一部分物理内存空间,而且这个共享对虚机的性能没有损失,因为都是在内存里面,这个透明页面共享技术,是我们首先会启用的技术。

所以第一件会去做的事情就是用透明页面共享,回收一部分内存空间出来,这样可以给其他虚机去使用,透明页面共享能省出来的空间是不确定的。

所以这个时候,可以引入后面第二个机制,回收释放,来回收虚机里面的内存,

虚机的操作系统在使用内存,操作系统会把数据放到这个内存里面,假如这个是4G的内存,操作系统使用的这4g内存,可以把它分作,三种状态;

第一种状态,虚机的这部分内存被频繁的访问着,被频繁的使用着,这部分内存叫做active 内存,叫做活跃的内存,

另外还有一部分内存,有数据在里面,但是不活跃;这个时候把它叫做idle 的内存,

还有一部分内存,虚机曾经用过,现在里面没有数据,但是操作系统不会还回去,这部分内存叫做free,里面已经没有数据了,

有没有数据,vmkernal是不知道的,数据活跃不活跃,vmkernal也是不知道的,这些东西是虚机的操作系统才会知道,所以虚机的操作系统把这个4G内存全要了,但是用的怎么样,只有它自己知道,

所以当vmkernal 想要开虚机2的时候,我们就需要找个机制,确保内存回收回来,怎么回收,如果让vmkernal自己去拿,vmkernal不知道哪些内存是active,哪些内存是idle,哪些内存是free,有可能会拿到active 内存,这样性能就很差,

所以我们需要借用一个机制,这个机制叫做在安装vmware tools的时候,会安装Ballon driver,气球驱动,气球驱动是vmware tools在安装的时候,安装到操作系统里面的一个驱动,这个驱动在操作系统里面运行,跟一个进程一样,它可以干什么事情呢?当vmkernal需要把内存进行回收的时候,它就会找这个虚机的气球驱动,表示,我要收内存了,你帮我收一点回来,

气球驱动是在虚机内部的一个进程,它像是操作系统里面的普通进程一样,会跟操作系统说,操作系统我要内存,所以操作系统会把free这部分内存分配给他,气球驱动就把这部分free的内存收下,收下之后,它就把这部分内存给到了vmkernal,vmkernal 就会把这部分内存给到虚机2,这个时候,对虚机1其实是没有什么影响的,相当于vmkernal 通过这种方式把虚机1不用的内存,安全的回收回来了,

 

假如收了一部分内存回来,给虚机2用,虚机2用了一段时间之后,虚机2空闲下来了,虚机1开始忙起来了,虚机1 会说,我要内存,一看,所有内存都被占掉了,其中,很大一部分内存是被气球驱动占用掉了,所以它会找气球驱动,你拿了那么多内存,还点给我,但是气球驱动没有内存,它都把内存给了vmkernal,所以它就去找vmkernal,vmkernal有内存就给他,

没有内存就找虚机2的气球驱动,让虚机2的ballon driver去找内存

 

所以这个气球驱动就像一个平衡器一样,我多了,你拿点过去,我少了你拿点过来。就可以去平衡内存的消耗。

Balloon driver就是esxi主机从虚机的操作系统中回收的一种方式,

Ballon driver能够回收的内存最多是available剪掉reservations,是百分之六十五的available ,默认值,这两个值,哪个值先到,哪个比较小,我就能回收多少内存,ballon driver 最大能回收多少

 

所以在这个例子里面,ballon driver 最多可以回收多少内存,2.6G,百分之65的available,

free的可以回收,如果free的收完了,我还要,那我要收idle的,idle的怎么收,idle的是当前不活跃的内存,里面是有数据的,所以操作系统要把idle的内存给到另外一个进程,他要怎么处理,不可以直接把它清掉,他要把这部分内存的数据,保存到(windows的pagefile.sys文件;linux 的swap 的partial(交换分区)文件中,)在虚机的虚拟磁盘里面,这个东西在哪,在虚机虚拟磁盘里面,操作系统能够看的到的,有这部分文件,会把这部分内存写到这个swap y的particial,然后,再把这部分的内存空出来,给ballon driver

 

这个时候,对虚机的性能是有一点影响,因为要写磁盘,但是影响不大,因为这部分内存本身是idle 的,也就是说应用本来就用的不多,所以大部分情况下,ballon driver 抽出来的内存是idle 的内存,对虚机的性能影响不是特别大,

一般来说虚机的活跃内存不会超过百分之35的available内存,所以对系统的性能影响不是特别大,但是如果说虚机很忙,活跃内存很大,如果回收到了active的内存, 那么你的虚机的性能就会收到影响,(你会发现,它一直再page in,page out,要避免这种事情发生,如果真的频繁发生,那就要避免active的内存被ballon掉,可以调高reservations,可以调高available,不能被ballon掉的是百分值35的available,两种方式都可以,调reservations是在线调的,比较简单,调reservation的话,会影响其他虚机的性能,)

 

这个方式是balloning -----内存释放

这个时候,再开两台虚机,还是4GB的available,1GB的reservation,这时候,就会把每台虚机的1gb内存全回收,但是balloon driver只能回收到百分之六十五的available,或者还有一部分回收不回来的,那么这个时候,会引入第三个机制,memory compression,内存压缩,vmkernal会给每台虚机预留百分之十的内存,干什么用呢,它回去压缩我的内存页面,这个内存页面4kb,能不能压缩到2kb或者2kb以下,如果能压,就压缩了,实际上是cpu,用压缩算法,把4kb的内存页面压缩到2kb或者更小,然后把它放到一个内存页面里面去,这个时候,一个内存页面就可以至少放两个内存页面,这样又可以多省出来一部分内存页面,随机取一些内存,看看能不能压缩,能压缩就进行压缩,这个就是用cpu来换内存,

如果还不行,这个时候,vmkernal就会进入到最后一个,叫做双极大法,vmkernal 随机的会从虚机所占用的物理内存里面挑出一批内存页面,把它放到vswp文件里面去,第一,随机的挑内存页面,这个内存页面有可能是idle 的,也有可能是active,第二,这个vswp文件谁在用,谁在写,vmkernal,所以往往我们把swap文件叫做vmkenal swap文件,虚拟机的vmkernal的swap文件,因为这个swap文件是vmkernal在用,操作系统是见不到的,一旦到了这个地步,虚机的性能就会变低,所以要尽量避免这个情况发生,尽量避免vswp文件被使用,如果一旦主机开始把虚机的内存写到vswp里面去,就意味着主机的内存不够了,那么你要用一些方式来调整,

中间还有一个这种的办法,这个是主机,

这个是虚机,

vswp文件在哪呢,这是我的vmdk文件

 

虚机的vmdk文件

vswp文件在哪,默认的是在这个地方

 

假如这个主机真的很忙,内存也不足了,一般来讲,这个存储也很忙,然后你要来写vswp,这个时候,就要去抢存储的IO了,那我能不能改善一下,不要让他来抢,就有一个办法,

主机不是有本地磁盘嘛,

本地磁盘一般没怎么用,因为如果虚机放到本地磁盘中,如果主机一旦坏掉了,那么虚机就没法访问了,不过,能不能想办法不要把vswp文件放到共享的存储,放到本地磁盘上,行不行?

 

可以的,

甚至有些时候,这边就直接用ssd,会更好一点,算是一种折中的方式

但是尽量避免这种情况的发生。

 

(把vswp文件放到主机的本地磁盘中会有一点问题)

 

vmotion迁移的是内存数据,vswp里面的数据是内存的数据,能迁,但是需要需要新建一个vswp文件,因为这个vswp文件在主机的本地磁盘上,vmotion 迁移的时间会变长,

如果虚机需要频繁的vmotion,那么vswp文件放到共享存储里面会更好,)

会按以上四个步骤回收虚机的内存,透明页面共享,balloning,内存压缩 ,vmkernal swap,第三和第四是同时进行的,什么时候会触发,当vmkernal 需要内存的时候,他会触发balloning 和vmkernal swap 和内存压缩

透明页面共享,默认会一直进行。(但是默认情况下,透明页面共享,同个虚机的内存页面上进行,同一主机上的不同虚机默认是不进行的,因为考虑到安全性,如果你需要它进行,需要去改一些设置。修改salt 值,第二,透明页面共享只针对4kb的内存页面,大内存页面时不会共享的,所以当主机内存下降到一定的阈值之后,vmkernal会主动的把一些大内存页面 分割成小的4kb的内存页面,然后主动去调用透明页面共享去算,

第三,当主机内存再往下降,到了一定的阈值之后,才会去启用balloning,再往下降,到了一定的阈值之后,才会去启用内存压缩和vmkernal swap,如果这些方式都没有办法回收主机内存,再到了一定的阈值,就会禁用所有的内存申请,会全力的去用内存压缩,vmkernal swap,等回收到一定的程度,再一层一层的解掉)

(虚机的操作系统--------linux 的particial,windows 的page file.sys,在虚机的磁盘里面

vmkernal----------vswp)

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值