前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >IBM Power7 服务器 Hypervisor 内存使用情况研究

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

作者头像
魏新宇
发布2018-03-22 12:01:36
4.6K0
发布2018-03-22 12:01:36
举报

Hypervisor 的概念

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

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

图 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 上查看保留内存

IBM Power7 服务器 Hypervisor 内存使用

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

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

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

图 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 占用过多的内存;
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大魏分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hypervisor 的概念
    • IBM Power 服务器中保留内存的区域
      • 用于系统管理的内存保留区域
        • 用于转换控制表(Translation control entry)的内存保留区域
          • 用于分区页面表的内存保留区域
          • 创建分区之前
            • 不激活分区的情况下
            • 激活分区
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档