熟悉了linux中的透明大页机制之后,这次又调研了hugetlbfs,对于hugetlbfs的具体介绍,不是本文的重点,如果读者对于hugetlbfs不太了解的话,可以参考这篇文章,它介绍了hugetlbfs的使用。接下来,我将介绍libhugetlbfs的安装与使用。

最初,我参照libhugetlbfs的文档点击这里,将源代码解压,安装。之后去谷歌搜了一下ubuntu install libhugetlbfs,发现已经有官方安装包了,顿时。。。。废话不多说,直接切入正题。

(1) libhugetlbfs的安装如下:

sudo apt-get update

sudo apt-get install libhugetlbfs-dev

ok,hugetlbfs安装完毕,下面输入hugeadm这一指令来检测安装是否成功。如果出现如下图所示的界面,恭喜你,安装成功。

(2) 建立挂载点

mkdir -p /mnt/hugetlbfs

mount -t hugetlbfs none /mnt/hugetlbfs

通过hugeadm --list-all-mounts检测是否挂在成功

(3) 由于大页是由大页池进行维护的,此刻,我们需要设置维护池中大页的个数。为了简单起见,我们设置大页个数的最小值为30,最大值为40。

hugeadm --pool-pages-min 2MB:30

hugeadm --pool-pages-max 2MB:40

之后,通过hugeadm --pool-listgrep HugePages /proc/meminfo去查看大页池中大页的数目。

(4)测试透明大页

编写一个测试程序,测试程序申请了二十几个大页。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main()
{
int i, len;
int *mem;
len = 13 * 1024 * 1024;
mem = (int*)malloc(sizeof(int) * len);
for(i = 0; i < len; i++)
mem[i] = i;
getchar();
free(mem);
return 0;
}

编译程序,最终的可执行文件名为a.out。在a.out的目录下,执行如下指令:

LD_PRELOAD=libhugetlbfs.so HUGETLB_MORECORE=yes ./a.out
此刻,查看大页池中大页的数目。


通过HugePages_TotaHugePages_Free参数的值证明大页已经成功使用。

好了,我们完成了libhugetlbfs的使用,下面对上述步骤中的细节进行简要的说明吧。

  1. libhugetlb库对malloc()/free()等常用的内存相关的库函数进行了重载,以使得应用程序的数据可以放置在采用大页面的内存区域中,以提高内存性能。
  2. 若你对LD_PRELOAD这个指令不太清楚,可参见这里
  3. 针对大页池,HugePages_Totalis the size of the pool of huge pages,HugePages_Freeis the number of huge pages in the pool that are not yet allocated,HugePages_Surpis the number of huge pages in the pool above the value in /proc/sys/vm/nr_hugepages。具体请查看官方文档。
  4. kvm亦可以使用hugepage,具体步骤请参考这里

参考资料:

  1. Linux 大页面使用与实现简介
  2. How to use hugepage to improve application performance
  3. libhugetlbfs HOWTO