内存复用技术(内存共享、内存置换、内存气泡)、虚拟机QoS、内存大页、内存位图、快照、虚拟机热迁移

1、内存复用

我们之前提到了内存复用技术,可以对内存进行超分,提高资源使用率。如下图所示,1台8G内存的物理机,假如装了2台4G内存的虚拟机,vm1,vm2占用的是虚拟内存,实际上并没有把物理内存真正的使用完。所以这时候通过内存复用技术,就可以继续发放虚拟机,提高硬件资源的利用率。常见的有三种内存复用技术,分别是:内存共享、内存置换、内存气泡。下面我们详细的说明一下这三种技术。

 

(1)内存共享:

所有的虚拟机共享一段内存,共享的内存段是只读的。

如下图所示,假如下边是我们的物理内存,上边是我们的虚拟机,在物理内存里边有一段内存同时给这3个虚拟机共享,假如物理内存的这段内存中的数据是123,那么这3台虚拟机共享的这段内存也都是123。物理机上的这段内存相当于母卷,别的虚拟机共享母卷中的内容。这样一来,物理资源就节省了三倍资源,不然的话每台虚拟机都需要在物理内存上占用一个123。

那么这个数据除了只读,能修改吗?它是可以修改的。但是修改的时候他会在占用另外一个内存段,类似于差分卷,修改的所有内容都会放在差分卷里。总结一下就是:读取的时候从母卷进行读,修改的时候写入到差分卷里。这就是内存共享技术。

 

 

 (2)内存置换:

我们在Linux中进行磁盘分区时,会看到有一个swap分区,即交换分区。那么交换分区是干嘛的呢?当内存比较小的时候,会在磁盘上开辟出来一段空间,给内存置换使用。 当内存不够用的时候,把一些冷数据置换在磁盘上。冷数据就是指一段时间没有被使用的数据,时间越长越冷。比如说123这个数据好久没用了,内存现在不够用了,那么内存就会把123暂时置换到磁盘上,以此腾出内存空间加载别的数据。未来如果要重新用到123,再把123给拿回来。这就是内存置换技术。

  

(3)内存气泡:

假如我们有两台虚拟机,每台虚拟机规格4G内存,但是并不是每一时刻虚拟机都可以完全使用完这4G大小,因此,hypervisor(VMM)会回收这些未使用完的内存资源,然后给到使用率较高的虚拟机。通过挤压其他虚拟机的内存,把内存释放给其他内存使用率较高的虚拟机。这就是内存气泡技术。

 

通过内存复用技术,可以将物理内存利用率提升至150%,同等内存资源条件下,虚拟机开机密度会提升150%,节省50%硬件采购成本。但是与此同时,如果采用了内存复用,相应的性能就下降了。所以一般在生产环境中,不会开启主机的内存复用。

 

 

 

2、虚拟机QoS(quality of service)

服务质量控制。QoS包含CPU和内存两个部分。

(1)CPU QoS

CPU部分主要包含三个参数。分别是:CPU资源份额、CPU资源预留、CPU资源限额。下图是官方文档给出的解释:

 

总的来说,CPU资源份额代表了虚拟机的权重,在竞争CPU物理资源时,会按照份额(权重)比例来分配CPU资源。CPU资源预留保证了虚拟机的下限,比如如果按份额计算的这台虚拟机只能分配到200MHZ的计算资源,但是我们设置的CPU预留资源是500MHZ,那么不管在什么情况下,这台虚拟机最少能获得500MHZ的计算资源,就不会在按计算的份额去分配计算资源。CPU资源限额保证了虚拟机的上限,假如没有设置的话,比如这台主机只运行了一台虚拟机,那么这台虚拟机可以使用2.8GHZ的物理资源,但是如果我们设置了CPU资源限额为800MHZ,那么不管在什么情况下,这台虚拟机最多能获得800MHZ的计算资源。这就是CPU的QOS质量服务。

 

(2)内存QoS

内存部分也主要包含三个参数。分别是:内存资源份额、内存资源预留、内存资源限额。其含义和CPU一样。下图是官方文档给出的解释:

 

 

 

 3、内存大页

我们在创建虚拟机时,在配置内存时,除了份额、预留等,还有一个内存大页配置项,什么是内存大页呢?

 

不管是windows还是Linux,内存也默认大小是4K,也就是一个文件或一个程序在操作系统里边占据的最小的内存单位就是一个内存页,即4k。同样的,内存页是4k,那么底层的数据快大小就是4k。

物理内存是连续的,但是虚拟内存不是,虚拟内存和物理内存只是映射关系。如下图所示,下边是物理内存,上边是虚拟内存 ,当我们打开了一个浏览器时,它可能用的是物理内存的5,他们之间是一个映射关系,当掉浏览器时,他们之间的映射关系也就不存在了。当在打开时,它可能和别的物理内存块产生了映射关系,比如映射到物理内存的4上。这种反反复复的映射是会消费资源的,也会影响性能。那么我们能不能将他们的映射关系保存下来呢?这样下次打开的时候就可以直接映射。CPU里边有一个小芯片mmu(memory managment unit),就是用来管理这个的,mmu使用页表直接保存虚拟内存和物理内存的映射关系。这个页表叫做TLB(translation lookside buffer),高速缓冲区。

 

假如说TLB最多只能保存10条对应关系,因为一个内存的最小单元(内存页)是4k,所以默认只能保存40k大小内存的映射关系。但是我们为了提高命中率(即根据页表能查到对应的映射关系),肯定希望TLB中能保存的条目数越多越好,但是因为mmu内置在cpu中,而cpu的资源是非常宝贵的,所以我们没办法扩大TLB的大小。那么怎么办呢?我们只能去调整内存页的大小,假设把内存页大小调整成2M,那么同样的10条映射关系,TLB就可以保存20M大小内存的映射关系。

所以上述配置中的内存大页其实就是把内存页调整为多大,从而提升命中率。既然大页可以提高命中率(TLB保存的数据空间会很大),是不是意味着所有的应用场景都可以选择开启大页?当然不是。如果我们的环境中跑的大多是数据库,因为数据库很占内存,这个时候我们可以开启大页。但是如果我们只是跑个微信,QQ等,就会造成大量的内存资源浪费。比如将大页设置成1G,那么我们的内存最小单元就是1G,微信可能才占几十M,那么剩下的资源就全部浪费了。所以我们要根据不同的业务场景能选择是否开启大页。 另外需要注意的是,开启大页的虚拟机不支持集群资源调度,是没办法迁移的,因为比如你的大页是2M,别的是4K,他们是没办法互相迁移的。所以大页虚拟机最好部署在独立的集群中。 

 

 

4、虚拟机热迁移

我们集群中的虚拟机是可以进行热迁移的,即把这个主机上的虚拟机迁移到另外一台主机上去。整个迁移过程是无感知的,不影响上层业务。我们可以看到这里有三种迁移方式,他们有什么区别呢?

 

 

 

 

 (1)更改主机

如图所示,下边是我们的共享存储,上边是我们的虚拟机,存储通过LUN映射给虚拟机,我们把虚拟机从这个主机迁移到另一个主机上,这个时候实际上我们迁移的是计算资源,即CPU和内存。存储并没有改变。这就是仅主机迁移模式。这种模式的前提是必须使用的是共享存储。

 

 

 

 

(2)更改数据存储

将虚拟机及其存储(包括虚拟磁盘、配置文件或其组合)移至同一主机上的新数据存储。即我们更改的不是主机,更改的只是同一主机上的不同磁盘或者LUN,如下图所示:

 

(3)更改主机和数据存储,即把前两种方式结合起来。

 

 

 

5、内存位图

在仅主机方式迁移时,虚拟机热迁移底层是迁移的计算资源,但是从上层来看,其实他迁移的只是内存中的数据。冷迁移的时候虚拟机是关机的,内存没有资源,这个没什么问题,但是在热迁移的过程中,内存又被写入了新的数据怎么办?这就用到了内存位图。

内存位图:通过0和1来管理内存的哪些地方被使用了,哪些地方没有被使用,通过内存位图我们可以知道内存中的哪些地址被使用了,哪些没有被使用。如下图所示:

 

 

 当我们发生热迁移的那一瞬间,他会在CNA主机的内存里面创建一个内存位图,根据初始的内存位图说显示的数据,它会把对应的内存数据迁移过去,在迁移的过程中,依然有业务往这台虚拟机的内存中写入数据,他就又会创建第二个位图,来记录刚才的迁移过程中有哪些数据发生变化,然后根据第二个位图,又会把发生改变的内存数据迁移过去,因为业务是连续的,所以在第二个位图迁移过程中,内存数据还是会发生变化,所以会形成第三个内存位图,以此类推,过程如下图所示:

 

 

 

 

那么什么时候会结束这个过程呢?当主机自己认为数据量足够小了,原虚拟机会短暂的暂停。在暂停的时候在往里写数据是写不进去的,但是因为数据量足够小,且迁移的速度足够快,所以用户是无感知的。但是会不会存在主机自己认为数据量足够小,但是最后发生内存数据丢失的功能。我们在创建虚拟机的时候会看到有一个tools,如果我们的虚拟机安装了tools,就不会发生数据丢失的情况,但是如果虚拟机没有安装tools,就有可能会发生数据丢失。

 

 

6、快照

快照能够保存虚拟机在某一时刻的数据状态,我们在创建快照时,有两种快照方式。

(1)一致性快照

我们在创建快照时,先将内存中的数据写入磁盘,使磁盘中的数据和内存保持一致,然后在对磁盘创建快照,我们称这种快照方式为一致性快照。还原快照的时候也只需还原磁盘就行。

(2)内存快照

对现阶段的内存和磁盘数据直接做快照,还原的时候也是直接还原内存数据和磁盘数据。

 需要注意的是,华为的FusionComputer中,一致性快照只支持windows系统,不支持Linux。 内存快照windows和linux都支持。

posted @ 2022-04-02 16:10  云计算成长路  阅读(6265)  评论(0编辑  收藏  举报