Linux动态内存配置
动态内存配置是一项在 Hyper-V 中可选择使用的技术之一,如果您启用此技术,Hyper-V 将会按照 Guest OS 所需要的内存大小,自动的保留或释放物理内存。 当动态内存开启时,能够聚集事实上还没被 Guest OS 用到的内存空间。 这使得内存能够更妥善的被利用,能1够提高单台 Host OS 上运行的虚拟机数量,提高整体虚拟机的密度,能够让硬件有更高的利用率以及减少每个虚拟机所需要的花费。 动态内存配置技术在 Windows 以及 Linux 客户端操作系统都能够使用,甚至可以在单一 Hyper-V 主机上使用这两种操作系统的混合配置。
动态内存配置是在多种混合环境,尽可能发挥内存使用率的技术。 Hyper-V 将会减少对于内存使用较少的客户端操作系统,并将其指定给使用较多内存的客户端操作系统使用。 而 Hyper-V 会自行做内存的配置与调整和不需要管理人员去进行调整等工作。
如果目前客户端操作系统内存需求已达稳定的程度,这时动态内存所能带来的好处就不会表现得太明显。 如果您的配置情况是可以稳定掌握的,那我们将会建议您关闭此项技术。 另外,有些客户端操作系统上的程序会尝试着把所有划分给他使用的内存都拿去自行规划管理,而绕过操作系统。 像如果有这种程序自行规划内存配置时,则动态内存建议不进行启用,因为这类的程序可能会与 Hyper-V 所提供的技术会有所冲突。 最普遍的例子就像是大型可扩展的数据库以及一些 JAVA 应用服务器等。
在 Hyper-V 中动态内存的技术支持大部分的 Linux 发行版,但目前尚未于 FreeBSD 上支持。 这一部分可以持续关注在 TechNet 上的 LIS/BIS 技术表格,查看哪些发行版已经支动态内存技术。
动态内存技术是如何工作的?
动态内存技术使用两种技术达成,而彼此两者为独立的方式:
分做 ”Hot-Add” 以及 ”Ballooning”。 为了要了解这两种技术,首先我们先来看到 Hyper-V 允许您在虚拟机中设置三个动态内存配置的参数:
- 起始内存-最一开始虚拟机启用时应该配置的内存大小。
- 最大内存限度-在这个虚拟机中能够从动态内存术配置到的最大内存大小。
- 最小内存限度-最小内存是动态内存配置时,最少需要给此虚拟机最低限度的内存大小。
通常起始内存会介于最大内存限度与最小内存限度之间。
而前面提到 ”Hot-add” 技术是当虚拟机对内存用量需求增加时,则会逐渐地将该虚拟机的可用内存逐渐提升到最大内存限度。 而这种方式只会逐渐提升虚拟机中可用的内存限度,但并没有办法做到 ”Hot-remove”,也就是说这个方式只能增加内存而无法收回不使用的内存。
而在内存自虚拟机中回收已配置的大小是使用 ”Ballooning” 技术。 这是由 LIS 内动态内存驱动程序来向客户端操作系统宣称这些内存必须要留给 LIS,因此在 Linux 客户端操作系统上并没有办法使用到这些内存。 接着LIS内存驱动程序会将这些由 LIS 占用的内存还给 Hyper-V,让 Hyper-V 能够配置给其他虚拟机使用。 这个操作并不会导致原本的 Linux 客户端操作系统的总内存容量减少,反而是其 Linux 客户端操作系统认为内存应该是被用来当作某些程序的缓冲区域。 因此 Ballooning 技术不会将其 Linux 客户端操作系统所看到实际可以用的内存空间减少至小于最小内存限度所设定的值以下。
Ballooning 技术亦可将可用内存配置回虚拟机当中,当 Hyper-V 决定要归还界用的内存时,LIS 内将会归还先前宣称需要使用的内存空间回 Linux 客户端操作系统。 当虚拟机内存需求提升且 Ballooned 的内存皆已归还,这时 Hyper-V 将会使用 Hot-add 配置更多的内存给需要的虚拟机中。
动态内存配置范例
让我们来看看动态内存的配置流程,我们用下列的示例来解释这三个步骤:
- 一台虚拟机开启,其内存大小将会依照起始内存所设定的内存大小做配置。
- 虚拟机对内存的需求增加,于是 Hyper-V 通过 Hot-add 技术增加该虚拟机的内存。
- 虚拟机对对内存的需求减少,于是 Hyper-V 通过 Ballooning 技术释放空闲内存。
而上面这三个步骤的过程我们用几种方式来观察:
- 从一个概要的内存配置图来显示目前内存配置状况。
- 通过 Hyper-V 管理员内的内存页面查看内存状况。
- 在 Linux 下使用 free –m 命令查询内存状况。
前面两个方式为从虚拟机观察内存消耗状况,而第三种方式为从客户端操作系统内部观察内存使用状况。
在第一个步骤时,虚拟机此时开机完毕后并没有特别显明的程序消耗内存。 依照该虚拟机设定的起始内存配置相对应大小的内存。 此时在 Hyper-V 与 Linux 客户端操作系统内也可以看到相同数量的内存,但要注意 Linux 内已经预留 32MB 的内存大小给 BIOS 作为其他的用途使用。
在第二个步骤时,虚拟机内开始有显著的内存需求出现,这时 Hyper-V 会开始通过 Hot-add 技术将更多的内存配置给虚拟机,可以看到在 Assigned Memory 的字段显示的大小增加,而在 Linux 客户端操作系统中也会跟着提升(依然保留 32MB 给 BIOS 使用)。
在第三个步骤时,先前耗费内存的程序完成运算,对内存使用量下降,这时 Hyper-V 会通过 LIS 使用 Ballooning 技术开始回收这些内存,而在 Hyper-V 内的 Assigned memory 此时会开始下降。 但是在 Linux 客户端操作系统内查看内存状态时,并不会作任何改变,仍然保持刚刚在高内存使用量额外加上的内存大小。 尽管 Linux 客户端操作系统可使用的内存看起来没有任何改变,但其实在亮绿色的区块中,是有 LIS 拿取并宣称是 LIS 使用的,借此让 Linux 客户端操作系统认为是拿去作为 Buffer 用途。 如果这些亮绿色的区块皆被 Linux 拿去使用且 Linux 客户端操作系统对内存需求量又开始增长,这时会回到步骤一的情况,使用 Hot-add 配置更多内存到该虚拟机中。
Linux 及时备份
接着我们来谈谈另外一项功能,及时备份。 及时备份允许您在不停止或者关闭虚拟机的情况下,能够建立一个 Linux 虚拟机的完整备份,包括其中的虚拟磁盘驱动器。 这个功能主要是确保您在生产阶段所使用的环境能够保持其最大的上线时间。
文件系统的备份必须要维持一致性,当一个备份动作被执行时,Linux 客户端操作系统上的文件系统将会把位于内存 Buffer 内的数据回写入虚拟磁盘中。 这个动作是为了确保操作系统有把所有的数据回写入磁盘,否则当您通过备份文件恢复虚拟机时可能会遇到数据不一致的问题。
让我们通过上图示例,看看及时备份是如何工作的吧!
- 通过微软或者第三方厂商所提供的备份软件,要求 Hyper-V 备份一个或多个虚拟机。
- 通过在 LIS 内的 VSS 驱动程序,Hyper-V 与 Linux 虚拟机沟通并开始备份程序。 而这个称作 VSS 的驱动程序其实是因为部分功能类似于 Windows 中 ”Volume Shadow Copy Service” 而命名。 但不尽相同,因此别把这两个名称视为同一种技术。
- 而 VSS 驱动程序与 Linux User space 内的 VSS 服务沟通,而 VSS 服务将会向 Linux 发出暂停文件系统与回写内存回虚拟磁盘请求。
- Hyper-V 将会建立一个备份的检查点(Check point ),并告诉 LIS 可以将系统状态解除暂停。 而 Linux 文件系统仅会在第三与第四步骤时暂停操作,而这足够将内存内的数据回写并且建立虚拟机检查点,通常这个动作会小于 2 秒。
- 在 Hyper-V 内的 Windows VSS 将会对该虚拟磁盘建立一个快照磁盘卷(VHD/VHDX)。
- 而备份软件再将此 VHD/VHDX 复制到其他的储存空间上。
小结
动态内存配置以及及时备份是您在 Hyper-V 上运行 Linux 时相当重要的功能。 这两项功能需要 Hyper-V 主机与客户端操作系统间密切的协同处理方能达成的功能。 而现在微软已经将这两项功能带至 Hyper-V 与 Linux 之中。