在 Linux on POWER 上利用透明大内存页(1)
- UID
- 1066743
|
在 Linux on POWER 上利用透明大内存页(1)
简介和背景透明地利用 Linux® 上的大内存页会使内存页面表项能够覆盖更大范围内(多至数兆字节)的连续物理内存,有了最近推出的 SourceForge 的 libhugetlbfs 库版本 1(参见 ),这一切就变得更加容易。libhugetlbfs 库已经针对 SUSE Linux Enterprise Server 10 (SLES 10) 作了更新并可用于 Red Hat Enterprise Server Linux 5 (RHEL 5)。客户可以利用它进行基准测试活动以改进运行 Linux 的 POWER、Intel® 和 AMD 系统上的特定应用程序的性能。本文只侧重于具有 16MB 页面大小的、基于 IBM POWER 处理器的系统,简要介绍了 libhugetlbfs,具体包括的内容如下:
- 何时应该及何时不应该使用 libhugetlbfs
- 如何安装和设置 libhugetlbfs
- 如何提供到大内存页的系统访问控制
- 一个简单的代码示例,用大内存页备份 malloc 和应用程序 bss 段。
- 使用了 libhugetlbfs 的行业标准的外部发布的示例
所支持的系统 对于 Linux on POWER 系统而言,具有 16MB 页面的 SLES 10 和 RHEL 5 系统均支持 libhugetlbfs 库,比如 POWER4、POWER5、POWER5+ 系统和 BladeCenter® JS20 和 BladeCenter JS21。
虽然本文只侧重 POWER 系统,但是支持大内存页的、基于 Intel 和 AMD 的 Linux 系统也提供对 libhugetlbfs 的支持。对于某些系统,虽然硬件页面的大小不同,但方式类似,而且显示某些良好性能改进的测试也都可以在这些 Linux 系统上看到。
对应用程序无需进行任何源代码更改在本文中,透明地利用大内存页 指的是应用程序可以利用较大的硬件页面大小的性能优势,而无需进行任何源代码更改。虽然 Linux 支持利用系统大内存页,但应用程序必须进行特定的编码才能利用该特性。这类支持存在于常见的一些系统软件产品中,比如最新的一些 Java™ 引擎和各种大型数据库提供商的产品。
如果是在具有上述平台的 32 位或 64 位应用程序上使用 libhugetlbfs,则应用程序无需进行任何代码更改就可以利用 16MB 大内存页。可选的使用方式有多种,包括:
- 用大内存页备份 .bss、.data 和 .text 段:可以指定将所有三个段(.bss 段、.data 段 和 .text 段)均加载进大内存页。.bss 段是程序中的一个未初始化的全局数据结构(比如一个大型的 Fortran 数组)。 .bss 段可以很大,可以有许多声明和使用 Fortran 数组的计算密集型工作负载,而这些数组可能会使用数兆字节的内存空间。.data 段是一个应用程序初始化了的全局变量和数据结构(通常不大),.text 段是可执行文本(二进制代码)。为了指定这些应用程序段由系统大内存页备份,所需做的就是重新链接执行体。
查看执行体要查看在 POWER 执行体中定义的段,可以使用如下命令:
readelf --sections -W yourApp
该命令将显示在执行体内定义的段。在该命令的输出结果中查找 .bss、.data 和 .text 段。要获得更多信息,请参阅本文后面的 一节。
- 只备份 .bss 段:在 Fortran 程序中普遍采用的一种 libhugetlbfs 用法是只指定 .bss 段由系统大内存页备份。.data 段和 .text 段则继续用常规的硬件基本页面大小进行备份。与第一种方法类似,使用 libhugetlbfs 只需进行执行体的简单重链接。
- 用大内存页备份 malloc:可以指定让运行时 malloc 调用来使用由 16MB 页面备份的内存。这也包括 malloc 的派生词(calloc、 valloc、realloc 等等),原因是底层的 malloc 调用是被重写的系统调用。libhugetlbfs 库自动在 16MB 页面中管理所有的 malloc 请求。可以将这种方式用于任何执行体,而不必是经特殊链接的执行体。
关键的几点考虑在开始实际使用 libhugetlbfs 时,有如下几个关键点需要考虑:
- 为了开发受客户环境支持的应用程序,您需要一个受支持的 Linux 发行版。对于 SUSE,就是 SLES 10。对于 Red Hat,就是包括 libhugetlbfs 库的 Red Hat Enterprise Linux 5 (RHEL 5)。本文无意介绍 SLES 9 和 RHEL 4,原因是它们不具有对 libhugetlbfs 适当的内核支持。虽然有经验的 Linux 用户总是可以获得能提供所需 libhugetlbfs 内核功能的最新的主流内核,但这并不是一种受客户支持的配置。
- Linux on POWER 上的大内存页是在使用(或在 boot 之上使用或由 root 用户使用)之前定义的 16MB 大内存页,这些大内存页会在被使用时由操作系统在主内存中固定。POWER 系统上的 16MB 大内存页是连续的 16MB 物理内存块。
- 对于 POWER 系统而言,Linux 社区将这些内存页称作 “huge page”,而传统的 AIX® 和 IBM POWER 硬件团队则将这些内存页称为 “large page”。由于社区和业界的术语一直模糊不清,因此我建议用所使用页的实际大小来加以区别。在本文中,我所指的是 16MB 大内存页,不区分 “large page” 和 “huge page”,认为二者表示的内容相同,即都指的是 16MB 大内存页。
- 可以在 Linux on POWER 上的虚拟的逻辑分区 (LPAR) 中使用 16MB 大内存页,也可以在将所有资源分配给该分区的全系统 LPAR 中使用 16MB 大内存页。
- 应该设置专门用于 libhugetlbfs 的特定文件系统来只允许特定一组用户访问可用的大内存页池。我会在本文的后续部分提供相关示例。这对于系统安全性以及控制对系统上十分有限的宝贵资源(物理内存)的访问都十分重要。
- Linux 提供了可由根用户动态管理、指定、请求和返回 16MB 大内存页的能力。16MB 大内存页的可用性取决于被根用户请求的连续物理内存的系统可用性。16MB 大内存页可在引导时保留。
- 当请求大量大内存页时,需要考虑内存的分段。系统运行时间越长,主内存越有可能被零碎固定和永久的内核内存分割,这就使得获得单个连续的 16MB 大内存页变得异常困难。如果需要的是大量的 16MB 大内存页,建议最好在系统引导时保留这些页。
|
|
|
|
|
|