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

在 Power7 服务器中,为了使资源的最大化利用,划分分区是很常见的事情。Hypervisor 为了进行分区的内存寻址、系统管理以及转换控制表,需要预留一部分内存,我们称之为“reserve memory”。本文主要通过实验手段,验证使预留内存增加相关的因素,并找出其线性关系。需要注意的是,本文测试所得到的数据是试验中的测试数据,非 IBM 公司官方数据。

魏 新宇, 高级 IT 专家, IBM

魏新宇,任职于 IBM Adavanced Technical Skill 团队,负责 Power 服产器产品的售前技术支持。



2012 年 7 月 11 日

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 占用过多的内存;

参考资料

学习

  • 通过参考《Hardware Management Console V7 Handbook》,了解 AIX 的更多信息。
  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • AIX and UNIX 下载中心:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。
  • IBM Systems Magazine for AIX 中文版:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。

讨论

  • 加入 developerWorks 中文社区。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=824814
ArticleTitle=IBM Power7 服务器 Hypervisor 内存使用情况研究
publish-date=07112012