在项目中遇到缺页中断引发了延迟,后来在网上查找,发现有两种手段可以来介绍缺页中断的发生:
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-list
和grep HugePages /proc/meminfo
去查看大页池中大页的数目。
(4) 测试透明大页
编写一个测试程序,测试程序申请了二十几个大页。代码如下:
1 |
|
编译程序,最终的可执行文件名为 a.out。在 a.out 的目录下,执行如下指令:
LD_PRELOAD=libhugetlbfs.so HUGETLB_MORECORE=yes ./a.out
此刻,查看大页池中大页的数目。
通过HugePages_Tota
和HugePages_Free
参数的值证明大页已经成功使用。
好了,我们完成了 libhugetlbfs 的使用,下面对上述步骤中的细节进行简要的说明吧。
- libhugetlb 库对 malloc()/free() 等常用的内存相关的库函数进行了重载,以使得应用程序的数据可以放置在采用大页面的内存区域中,以提高内存性能。
- 若你对
LD_PRELOAD
这个指令不太清楚,可参见这里。 - 针对大页池,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。具体请查看官方文档。
- kvm 亦可以使用 hugepage,具体步骤请参考这里
参考资料:
从上面介绍可以看到,一共有如下几步:
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 (真正使用)
下面是一些比较好的帖子,可以告诉你怎么使用大页内存:
标签:大页,HugePages,hugetlbfs,内存,中大页,linux,pool,libhugetlbfs From: https://www.cnblogs.com/beilou310/p/17036346.html