在项目中遇到缺页中断引发了延迟,后来在网上查找,发现有两种手段可以来介绍缺页中断的发生:

1:减少mmap的使用,改用brk 这个只是在一定程度上减少用户态和内核态的切换,减少对内存的访问,利用brk内存重复使用来减少缺页中断发生。后面会详细讲解brk和mmap的使用和区别。

2:使用大页内存----在最开始就采用大页内存分配了足够多的空间,后面不在出现缺页中断----虚拟内存到物理内存的映射等。

而使用大页内存有两种方法:(1)linux 系统自带的大页内存:libhugetlbfs;     (2)DPDK支持的大页内存。关于DPDK后面开一个专题去详细学习。

本文主要介绍linux自带的libhugetlbfs的使用。

下面文章转载于:https://www.dazhuanlan.com/gary886/topics/1084969

熟悉了 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

int ()
{
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

 

从上面介绍可以看到,一共有如下几步:

1:要在系统上安装libhugetlbfs。

2:安装后要挂载(这部分介绍的不是很详细)

3:需要配置大页内存的size以及每种size的个数

4:使用的时候一定要在.o前面加上LD_PRELOAD=libhugetlbfs.so HUGETLB_MORECORE=yes ./a.out

自己做的一些特殊例子如下:

 

 对于1G的大页内存配置了20个。 对于2M的没有配置。

mount -t hugetlbfs pagesize=1GB /mnt/huge_1G    (挂载)
mount -t hugetlbfs pagesize=2M /mnt/huge_2M
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages  (配置大小)
echo 8 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages
LD_PRELOAD=libhugetlbfs.so HUGETLB_MORECORE=yes ./app   (真正使用)

 下面是一些比较好的帖子,可以告诉你怎么使用大页内存:

 

posted on 2023-01-09 10:48  shiyuan310  阅读(1241)  评论(0编辑  收藏  举报