IBM Power7 服务器 Hypervisor 内存使用情况研究

Hypervisor 的概念

Hypervisor 是一种运行在基础物理服务器和操作系统之间的 中间软件 层 , 可允许多个操作系统和应用共享硬件。Hypervisor 不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护。

下图是 IBM Power7 服务器的硬件架构逻辑图。从图中可以看出,Hypervisor 位于服务器硬件之上,分区之下。IBM PowerVM 产品是基于 Hypervisor 层的。


图 1.IBM Power7 服务器硬件逻辑架构
图 1.IBM Power7 服务器硬件逻辑架构

IBM Power 服务器中保留内存的区域

IBM Power 服务器中,Hypervisor 会保留一部分内存,这部分内存分为三部分,它们分别是:

用于系统管理的区域、用于分区页面表(Partition page tables)和转换控制表 (Translation control entry)的保留区域 。这三个内存区域在逻辑分区的内存之外,不在逻辑分区的内存中分配。

用于系统管理的内存保留区域

在分区环境下,Hypervisor 被加载到物理内存中地址为 0 的第一个物理内存块上,这是专为 Hypervisor 区域保留的地址。Hypervisor 主要用于完成分区环境下的虚拟内存管理、调试寄存器和内存访问、以及提供对分区虚拟终端的支持。尽管 Hypervisor 不会占用这一整块内存空间,但是第一块物理内存块一定要保留,不能为任何分区所占用。

用于转换控制表(Translation control entry)的内存保留区域

在分区环境中,操作系统使用 Hypervisor 服务来控制转换控制表。操作系统负责将所要用的 I/O 总线地址转换成分区中逻辑设备的映射,Hypervisor 负责将其进一步转换成在转换控制表表中物理设备的映射。Hypervisor 需要为转换控制表保留一专用的内存区域,使得分区在进行直接内存存取 (Direct Memory Access) 操作时能将逻辑 I/O 地址直接转换成所对应的 PCI 卡。

用于分区页面表的内存保留区域

AIX 的虚拟内存管理使用高级系统管理服务(Hypervisor services)来管理分区页面表分区页面表。AIX 中的虚拟内存管理进行虚拟地址到分区逻辑内存地址的映射,Hypervisor 服务在分区页面表(partition page tables) 中进行到服务器物理内存地址的映射。

分区页面表不占用逻辑分区中逻辑内存空间,它是分区逻辑内存之外的一段物理内存空间,是每一个逻辑分区进行操作所必需的额外内存。

在 HMC 中,我们可以通过查看分区内存属性查看 Hypervisor 占用的内存。


图 2.HMC 上查看保留内存
图 2.HMC 上查看保留内存

回页首

IBM Power7 服务器 Hypervisor 内存使用

Hypervisor 预留内存的大小通常与分区的数量以及分区设置的最大内存有关。在下面的内容中,将通过实验手段验证相关因素的关系。

在讨论 Hypervisor 的内存使用问题上,必须要阐明一个概念:Hypervisor logical memory block size

logical memory block size 代表着 Hypervisor 内存使用的和分配给分区物理内存的最小分配单元。这个数值在通常情况下是根据服务器物理内存大小,自动设置的,不需要手动设置。我们在 HMC 的 ASM 中可以查看或修改这个数值。


图 3.AMS 上查看和修改 Logical Memory Block Size
图 3.AMS 上查看和修改 Logical Memory Block Size

对于 logical memory block size 的设置,我们需要综合性能和物理内存大小这两个因素进行考虑。

1. 如果服务器物理内存过小,例如小于 2G,将 logical memory block size 设置的过大将会导致 firmware 消耗过多的内存。通常的准则是:logical memory block size 的大小不能大于服务器总物理内存的 1/8。

2. 如果一个服务器安装的内存较多,将 logical memory block size 设置的太小将会造成大量逻辑内存块的出现。由于每个逻辑内存块在服务器或者分区启动的时候需要被管理,而大量的逻辑内存将会造成启动时的性能问题。

Power7 的服务器内存配置一般都比较充裕,logical memory block size 一般都自动设置为 256M,无需修改。

通过实验手段验证 Hypervisor 内存开销的相关因素

通过下面的一系列实验,我们可以得到下图的结论。从表中可以看出:

我们创建一个分区而不激活,会带来 Hypervisor 占用内存的增长。

我们对一个已经创建好的分区进行激活,也会带来 Hypervisor 占用内存的增长。


表 1. 创建和激活分区所带来的 Hypervisor 预留内存的增长
  创建 1 个分区而不激活 Hypervisor 内存保留区的增长
分区内存配置 期望内存 1G/ 最大内存 2G 8MB-9MB
分区内存配置 期望内存 2G/ 最大内存 4G 64MB
     
  对已创建的 1 个分区进行激活 Hypervisor 内存保留区的增长
分区内存配置 期望内存 1G/ 最大内存 2G 32MB
分区内存配置 期望内存 2G/ 最大内存 4G 85MB

在分区不激活的情况下,分区设置的最大内存越大,带来的 Hypervisor 内存开销越大;

在激活分区时,分区最大内存的数值越大,激活分区所带来的 Hypervisor 内存开销的增加越大;

分区最大内存数量与创建分区以及激活分区所带来的 Hypervisor 内存开销,有正比关系,但无必然的线性关系;

回页首

创建分区之前

以 Power770 为例,48C/386G 内存。将服务器加电以后,先不创建任何分区,如下图:


图片

此时,我们查看 Hypervisor 保留内存的大小:


图片

其中,2.75G 是 Hypervisor 预留内存的大小,“已分配给分区”表示目前没有内存被分区使用。

不激活分区的情况下

在 P770 上创建期望内存为 1G,最大内存为 2G 的分区,为了找到详细的对应关系以及转折点,分区一个一个创建。

首先使用 ssh 工具,登陆到 HMC 上。


图片

然后,输入 vtmenu, 找出这台 P770 对应的编号,为了避免泄露 IBM 公司机密,序列号部分被擦除:


图片

从上图可以看出,我们使用的服务器对应的编号是 40.

在上图的位置输入 40,提示符依旧,并未切换到类似如下界面,说明此台服务器还未创建分区:


图片

我们使用如下命令创建分区,分区的名字定为 test1,期望内存为 1G,最大内存为 2G,期望 CPU 和最大 CPU 数量均为 1:

mksyscfg -r lpar -m SVRP7770-02 -i "name=test1,profile_name=Normal, lpar_env=aixlinux,min_mem=1024,desired_mem=1024,max_mem=2048,proc_mode=ded,min_procs=1, desired_procs=1,max_procs=1,sharing_mode=share_idle_procs,auto_start=1,boot_mode=norm"

分区创建成功以后,先不激活分区,查看 Hypervisor 占用的内存没有变,依然为 2.75G


图片

下面,采取同样的办法,再次创建一个分区,并且不激活,

mksyscfg -r lpar -m SVRP7770-02 -i "name=test2,profile_name=Normal, lpar_env=aixlinux,min_mem=1024,desired_mem=1024,max_mem=2048,proc_mode=ded,min_procs=1, desired_procs=1,max_procs=1,sharing_mode=share_idle_procs,auto_start=1,boot_mode=norm”

然后查看 Hypervisor 占用的内存,依然是 2.75G


图片

此时,我们通过 HMC 命令可以看到 P770 上已经有两个分区:


图片

创建第三个分区,test3:

mksyscfg -r lpar -m SVRP7770-02 -i "name=test2,profile_name=Normal, lpar_env=aixlinux,min_mem=1024,desired_mem=1024,max_mem=2048,proc_mode=ded,min_procs=1, desired_procs=1,max_procs=1,sharing_mode=share_idle_procs,auto_start=1,boot_mode=norm”


图片

第三个分区创建完毕以后,查看 Hypervisor 占用的内存 , 发现这个数值已经从 2.75G 增长到 3.0G,增长了 0.25G:


图片

按照上面的方法,我们继续一个个分区依次创建,并且不进行激活,在创建到第 40 个分区的时候:


图片

查看 Hypervisor 所占用的内存依然是 3.0G:


图片

创建第 35 个分区:

mksyscfg -r lpar -m SVRP7770-02-SN1007C1P -i "name=test35,profile_name=Normal, lpar_env=aixlinux,min_mem=1024,desired_mem=1024,max_mem=1024,proc_mode=ded,min_procs=1, desired_procs=1,max_procs=1,sharing_mode=share_idle_procs,auto_start=1,boot_mode=norm"


图片

第 35 个分区创建成功以后,查看 Hypervisor 所占用的内存,已经增加到 3.25G:


图片

也就是说从 3G 到 3.25G 的 Hypervisor 所增加的内存占用 256M,是由于创建从 test3-test34 这 32 个分区所引起的,所以,在不激活的前提下,每新创建一个期望内存 1G,最大内存 2G 的分区,会增加 Hypervisor 内存占用 8MB 的增长。

创建一个分区所带来的 Hypervisor 内存开销:256MB/32=8MB

分区期望内存与内存开销的倍数关系:1024MB/8MB=128

分区最大内存与内存开销的倍数关系:2048MB/8MB=256

为了确认这个倍数关系,我们再创建 28 个分区(test36-test63),并且不激活,确保 Hypervisor 占用的内存依然是 3.25G:


图片

创建第 64 个分区:

mksyscfg -r lpar -m SVRP7770-02-SN1007C1P -i "name=test64,profile_name=Normal, lpar_env=aixlinux,min_mem=1024,desired_mem=1024,max_mem=2048,proc_mode=ded,min_procs=1, desired_procs=1,max_procs=1,sharing_mode=share_idle_procs,auto_start=1,boot_mode=norm"

不激活分区,查看 Hypervisor 占用的内存,已经增加到 3.5G:


图片

也就是说从 3.25G 到 3.5G 的 Hypervisor 所增加的内存占用 256M,是由于创建从 test35-test63 这 29 个分区所引起的 , 所以,在不激活的前提下,每新创建一个期望内存 1G,最大内存 2G 的分区,会增加 Hypervisor 内存占用 8.8MB 的增长。这与之前的实验验证出来的结果基本符合。

我们将 test64 删除,使 Hypervisor 所占用内存为 3.25G,然后继续下面的实验:

为了验证数据的准确性,继续创建期望内存 2G,最大内存 4G 的分区。

mksyscfg -r lpar -m SVRP7770-02-SN1007C1P -i "name=test64,profile_name=Normal, lpar_env=aixlinux,min_mem=1024,desired_mem=2048,max_mem=4096,proc_mode=ded,min_procs=1, desired_procs=1,max_procs=1,sharing_mode=share_idle_procs,auto_start=1,boot_mode=norm"

第 64 个分区创建成功以后,Hypervisor 所占用内存增加到 3.5G


图片

按照上面的方法,依次建立分区,找出使 Hypervisor 所占用内存增加到 3.75G 的转折点。

当创建完第 67 个分区的时候 Hypervisor 所占用内存依然是 3.5G:


图片

创建第 68 个分区以后,Hypervisor 所占用内存增加到 3.75G


图片

也就是说从 3.5G 到 3.75G 的 Hypervisor 所增加的内存占用 256M,是由于创建从 test64-test67 这 4 个分区所引起的,所以,在不激活的前提下,每新创建一个期望内存 2G,最大内存 4G 的分区,会增加 Hypervisor 内存占用 64MB 的增长。

创建一个分区所带来的 Hypervisor 内存开销:256MB/4=64MB

分区期望内存与内存开销的倍数关系:2048MB/64MB=32

分区最大内存与内存开销的倍数关系:4096MB/64MB=64

回页首

激活分区

继续上一章节的实验,首先将 test64-test67 四个分区删除。使 P770 上有 63 个分区,每个分区期望内存为 1GB, 最大内存为 2G。63 均未激活,目前 Hypervisor 所占用内存为 3.25G:


图片

我们激活前 1 个分区,然后观察 Hypervisor 占用内存的情况:

chsysstate -r lpar -m SVRP7770-02 -SN1007C1P -o on -f Normal -n test1


图片

观察 Hypervisor 占用内存的情况:


图片

Hypervisor 占用内存已经增加了 256M。

依次一个个继续激活分区:

chsysstate -r lpar -m SVRP7770-02 -SN1007C1P -o on -f Normal -n test2

激活到第八个分区 test8 的时候,Hypervisor 占用内存未变。


图片

继续激活第九个分区,Hypervisor 占用内存增加到 3.75G:


图片

也就是说从 3.5G-3.75G 这 256M 内存的开销,是由激活 test1-test8 这八个分区所开销的。

激活一个分区所带来的 Hypervisor 内存开销:256MB/8=32MB

分区期望内存与内存开销的倍数关系:1024MB/32MB=32

分区最大内存与内存开销的倍数关系:2048MB/32MB=64

我们将所有的分区均去激活,此时 Hypervisor 的开销为 3.5G。然后创建期望内存为 2G,最大内存为 4G 的分区。后来我们新创建 4 个分区(期望内存 2G,最大内存 4G)test64-test67,此时 Hypervisor 占用内存仍为 3.5G,如果再创建第 68 个分区,Hypervisor 的开销将增加到 3.75G(如上一章所述)。因此,我们以共计 67 个分区进行试验。

为了使数据更加准确,我们尝试激活期望内存为 2GB,最大内存为 4GB 的分区,并观察 Hypervisor 内存开销的变化。

所有分区均为激活前:


图片

此时,我们激活第 64 个分区:

chsysstate -r lpar -m SVRP7770-02-SN1007C1P -o on -f Normal -n test64


图片

“已分配给分区“为 2G 表明目前有一个期望内存为 2G 的分区 test64 已经激活。

继续激活分区,查找转折点。

当激活第 66 个分区的时候,Hypervisor 的内存开销未变,此时有三个 2G 的分区激活:


图片

当激活第 67 个分区的时候,Hypervisor 的占用内存增加到 4.0G, 此时,有 4 个 2G 的分别取处于激活状态:


图片

也就是说从 3.75G-4G 这 256M 内存的开销,是由激活 test64-test66 这 3 个分区所开销的。

激活一个分区所带来的 Hypervisor 内存开销:256MB/3=85MB

分区期望内存与内存开销的倍数关系:2048MB/85MB=24

分区最大内存与内存开销的倍数关系:4096M/85MB=48

回页首

总结

  • 在本试验中,Hypervisor reserved memory 增加的内存是以 256MB 的倍数增加的,如 256MB,512MB,1024MB 等,这是 Hypervisor Logical Memory Block 的大小设置;
  • 在分区不激活的情况下,分区设置的最大内存越大,带来的 Hypervisor 内存开销越大;
  • 在激活分区时,分区最大内存的数值越大,激活分区所带来的 Hypervisor 内存开销的增加越大;
  • 分区最大内存数量与创建分区以及激活分区所带来的 Hypervisor 内存开销,有正比关系,但无必然的线性关系;
  • 对于期望内存较大的分区,将最大内存设置的过大(如为期望内存的两倍),将会使 Hypervisor 占用过多的内存;

你可能感兴趣的:(IBM)