在 Linux on POWER 上利用透明大内存页(6)用大内存页备份段
- UID
- 1066743
|
在 Linux on POWER 上利用透明大内存页(6)用大内存页备份段
当重链接执行体来利用 .bss、.data 或 .text 段备份时,很容易使用 GCC 或 IBM 编译器。这两个编译器都提供了可用来重写 ld 命令调用的易用参数。它们的使用方法如下所示:
- GCC 编译器:将如下参数添加到 C 编译链接命令行:
1
| -B /usr/share/libhugetlbfs/ -Wl,--hugetlbfs-link=B
|
第二个参数是 'dash W ell comma' —— 这在很多浏览器上都不易读懂。 - IBM 编译器:使用方法相同,但提供了额外的对被重写内容的解释说明,比如:
1
| -B /usr/share/libhugetlbfs/ -tl -Wl,--hugetlbfs-link=BDT
|
这会添加 'dash tee ell',它会将此指令定向到链接器。可将此方法用于 C、C++ 和 Fortran 编译器。 因此,使用 copy_arrays.c 程序()和 GCC 编译器,就可以告诉链接器将 .bss 段放入大内存页。注意,在本例中,需要创建新的目标执行体,名为 copy_arrays-lp,如 所示,原因是该执行体是针对大内存页链接的。您应该会看到与备份 malloc 页类似的性能改进。
清单 15. copy_arrays-lp 执行体1
2
3
4
5
6
7
8
| wmb@p5sys:~> cc -O3 -m64 -B /usr/share/libhugetlbfs/ -Wl,--hugetlbfs-link=B \
copy_arrays.c -o copy_arrays-lp
wmb@p5sys:~> time ./copy_arrays-lp
real 0m6.495s
user 0m2.558s
sys 0m1.648s
|
若 16MB 页不够又该如何呢?您应该将二者结合,即用大内存页备份 .bss 段 和 malloc。您将需要比预先定义更多的大内存页。
注意,当没有定义足够的大内存页时,应用程序会被终止(“杀死”)。如 所示,如果没有足够的 16MB 大内存页可用,使用了 malloc 的 copy_arrays_lp 调用将会失败。通过分配更多的 16MB 大内存页然后重运行可以解决这个问题。
当使用针对 .bss 段链接的执行体时,无需指定 LD_PRELOAD=libhugetlbfs.so 重写。您只需通过定义 HUGETLB_MORECORE=yes 来指定使用 malloc 即可。
清单 16. 通过 HUGETLB_MORECORE 指定使用 malloc 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| wmb@p5sys:~> time HUGETLB_MORECORE=yes ./copy_arrays-lp
Killed <---- Note the "Killed" message
real 0m4.084s
user 0m1.669s
sys 0m0.365s
wmb@p5sys:~> su
#> echo 300 > /proc/sys/vm/nr_hugepages
#> exit
wmb@p5sys:~> time HUGETLB_MORECORE=yes ./copy_arrays-lp
real 0m6.943s
user 0m3.600s
sys 0m0.473s
|
在本例中,使用 malloc 和 .bss 段并不会获得明显的性能改进。对应用程序尝试各种不同的组合有助于您理解哪种方式最为实际和有效。并不是所有应用程序都能从透明大内存页的使用中受益。
未授权的用户若未授权的用户尝试使用系统大内存页时,虽然程序仍会正常运行,但 libhugetlbfs 库却会返回错误 —— 大内存页将不能使用。例如,若用户 joe 试图运行上述相同的两个程序,就会得到如 所示的结果。
清单 17. 未授权的用户试图使用大内存页的结果1
2
3
4
5
6
7
8
9
10
11
12
13
14
| joe@p5sys:~> time HUGETLB_MORECORE=yes ./copy_arrays-lp
libhugetlbfs: ERROR: mkstemp() failed: Permission denied
real 0m6.795s
user 0m2.267s
sys 0m2.656s
joe@p5sys:~> time HUGETLB_MORECORE=yes LD_PRELOAD=libhugetlbfs.so ./copy_arrays
libhugetlbfs: ERROR: mkstemp() failed: Permission denied
libhugetlbfs: ERROR: Couldn't open hugetlbfs file for morecore
real 0m6.807s
user 0m2.133s
sys 0m2.660s
|
|
|
|
|
|
|