在 Linux on POWER 上利用透明大内存页(4)设置 libhugetlbfs
 
- UID
- 1066743
|

在 Linux on POWER 上利用透明大内存页(4)设置 libhugetlbfs
设置 libhugetlbfs本节介绍下载、安装和设置 libhugetlbfs 的步骤。
要用 libhugetlbfs 设置系统并定义系统大内存页,需要对此系统具有根访问权限。我还将介绍几种方法,一旦系统设置完毕,借助这些方法,非根用户也可以使用大内存页。
要安装 libhugetlbfs,可以通过如下方式:
- 如果您已经注册了 SUSE 支持,就可以从 Novell SUSE maintweb 支持站点访问最新的 libhugetlbfs rpms(注意:该站点只面向注册用户)。在本文编写之时,针对 SLES 10 所建议(和支持)的最新的 rpm 如下:
- libhugetlbfs-1.0.1-1.4.ppc.rpm
- libhugetlbfs-64bit-1.0.1-1.4.ppc.rpm
在 SLES 10 最初刚刚可用的时候所提供的默认 libhugetlbfs 库已经过时,我建议最好不要使用它们,包括:
- libhugetlbfs-1.0-16.2.ppc.rpm
- libhugetlbfs-64bit-1.0-16.2.ppc.rpm
安装了建议的库之后,可继续到本文的 一节。
- 在 RHEL 5,需要安装如下 5 个 rpm:
- libhugetlbfs-1.0.1-1.el5.ppc.rpm
- libhugetlbfs-devel-1.0.1-1.el5.ppc.rpm
- libhugetlbfs-devel-1.0.1-1.el5.ppc64.rpm
- libhugetlbfs-lib-1.0.1-1.el5.ppc.rpm
- libhugetlbfs-lib-1.0.1-1.el5.ppc64.rpm
- 作为一种替代方案,您也可以从 SourceForge(参见 )获得副本并构建和安装此版本。我接下来就会介绍这种方法。
从 SourceForge 安装从 SourceForge,单击 Download libhugetlbfs 按钮,如 所示,并遵循如下操作指导来下载 tar ball。对于本文而言,Version 1.0.1 级是经测试的且可由 SUSE 和 Red Hat 支持。
图 1. SourceForge libhugetlbfs 页 将 tar ball 下载到系统。libhugetlbfs make install 过程会将所需的文件复制到系统中合适的位置。我建议通过指定 make install PREFIX=/usr 在系统的 /usr 子目录安装 libhugetlbfs,如 所示。您需要根访问权限才能安装。
清单 4. 安装 libhugetlbfs 1
2
3
4
5
6
7
8
9
10
| # tar -zxf libhugetlbfs-1.0.1.tar.gz
# cd libhugetlbfs-1.0.1
# make
... <---- not showing "make" messages here ...
# make install PREFIX=/usr
VERSION
INSTALL32 /usr/lib
INSTALL64 /usr/lib64
OBJSCRIPT ld.hugetlbfs
INSTALL
|
如果察看 /usr/share/libhugetlbfs/ 目录,您会发现 ld,它是新的链接器命令。参看 。ld 命令被软链接到 ld.hugetlbfs 以方便 GNU Compiler Collection (GCC) 和 IBM 编译器调用此链接器。
清单 5. /usr/share/libhugetlbfs/ 显示 ld 命令 1
2
3
4
5
| # ls -l /usr/share/libhugetlbfs
total 8
lrwxrwxrwx 1 root root 12 2006-11-26 12:42 ld -> ld.hugetlbfs
-rwxr-xr-x 1 root root 1321 2006-11-26 12:42 ld.hugetlbfs
drwxr-xr-x 2 root root 4096 2006-11-26 12:42 ldscripts
|
中所示的 ldscripts 子目录包含所有修改后的链接器脚本,这些脚本是处理重链接 .bss、.data 和 .text 段所必需的。
清单 6. /usr/share/libhugetlbfs/ 的 ldscripts 子目录1
2
3
| /usr/share/libhugetlbfs/ldscripts # ls
elf32ppclinux.xB elf64ppc.xB elf_i386.xB elf_x86_64.xB
elf32ppclinux.xBDT elf64ppc.xBDT elf_i386.xBDT elf_x86_64.xBDT
|
libhugetlbfs 包附带了很多自动测试包,这些测试包可通过 make 调用。这些测试主要由 libhugetlbfs 包开发人员及内核维护人员使用,这是因为更改是对系统做出的。如果您运行的是受支持的操作系统级和内核,则无需运行这些测试,对于该包的一般用户来说更应如此,因为测试的输出对于这些用户来说过于晦涩难懂。
libhugetlbfs 提供的另一个重要文件是 libhugetlbfs.so 库,如 所示。该库在运行时调用,可控制大内存页的系统使用。这类库分别针对 32 位应用程序和 64 位应用程序提供。
清单 7. libhugetlbfs.so 库1
2
3
4
5
| # ls -l /usr/lib/libhugetlbfs.so
-rwxr-xr-x 1 root root 54785 2006-11-26 12:42 /usr/lib/libhugetlbfs.so
# ls -l /usr/lib64/libhugetlbfs.so
-rwxr-xr-x 1 root root 63910 2006-11-26 12:42 /usr/lib64/libhugetlbfs.so
|
分配大内存页要设置系统使之使用大内存页,需要首先分配大内存页。对于 Linux,就是复制(回显)想要分配进 /proc/sys/vm 控件的大内存页数量的值,如 所示。该操作系统试图分配所请求的大内存页。分配 意指将页隐藏起来并将它们保留在物理内存池外。这些页尚未使用。系统也未给出任何指示,说明它未能分配所有请求的大内存页。所以您请求完这些页后,总是需要检查实际保留了多少页。
清单 8. 用 /proc/sys/vm 分配大内存页1
2
3
4
5
6
7
8
9
10
11
12
13
| # cat /proc/meminfo | grep Huge
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 16384 kB
# echo 200 > /proc/sys/vm/nr_hugepages
# cat /proc/meminfo | grep Huge
HugePages_Total: 200
HugePages_Free: 200
HugePages_Rsvd: 0
Hugepagesize: 16384 kB
|
定义 hugetlbfs 文件系统libhugetlbfs 使用虚拟的文件系统接口,hugetlbfs。要设置该接口,需要创建挂载点并挂载虚拟文件系统。文件系统可以命名为任何惟一的名称,在本例中,使用挂载点 libhugetlbfs。
您所定义的 hugetlbfs 可以控制谁有对系统大内存页的访问权,所以很有必要设置一个对系统大内存页有访问权的用户组。注意,本例在系统上创建一个特殊的组(libhuge)来控制对 hugetlbfs 的访问,参见 。您应该将授权用户添加到该组,只有这些用户可以访问由 libhugetlbfs 使用的大内存页。
清单 9. 定义 hugetlbfs 文件系统1
2
3
4
5
6
7
8
9
| # mkdir /libhugetlbfs
# groupadd libhuge
# chgrp libhuge /libhugetlbfs
# chmod 770 /libhugetlbfs
# usermod wmb -G libhuge <---- assumes "wmb" is a user on the system
# mount -t hugetlbfs hugetlbfs /libhugetlbfs
|
Linux 操作系统使用这个特殊的文件系统来控制到与 16MB 大内存页相关的物理内存的访问和控制。您所创建的文件系统的名称是什么并不重要,对于一般的使用来说,您应当定义和使用单一的文件系统。请记住 hugetlbfs 的 “挂载” 只是暂时的,而且它不会在引导时被自动重新挂载,除非您更改了 /etc/fstab。要使此更改永久有效,需要编辑此文件并添加如下所示的可应用行:
然后将该行添加到此文件,如 所示。注意 gid=1000 假设 libhuge 组 ID 是 1000。
清单 10. 将 libhugetlbfs 挂载添加到 /etc/fstab1
2
3
4
5
6
7
8
| /dev/sda3 / ext3 acl,user_xattr 1 1
/dev/sda2 swap swap defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs noauto 0 0
debugfs /sys/kernel/debug debugfs noauto 0 0
devpts /dev/pts devpts mode=0620,gid=5 0 0
/dev/fd0 /media/floppy auto noauto,user,sync 0 0
hugetlbfs /libhugetlbfs hugetlbfs mode=0770,gid=1000 0 0
|
libhugetlbfs 准备就绪至此,就完成了 libhugetlbfs 库的基本设置,包括:
- 了解了对使用 libhugetlbfs 的一些考虑
- 下载并安装了 libhugetlbfs(方法可以是从 SourceForge 安装,也可以利用 SLES 10 或 RHEL 5 发行版的最新 rpm 文件)
- 通过创建、挂载和限制对虚拟 hugetlbfs 的访问设置 libhugetlbfs
- 定义了可由用户使用的一个大内存页池
现在,用户就可以使用透明大内存页了。 |
|
|
|
|
|