大页内存的使用和配置

近期公司老大让我研究大页内存,说是大页内存可以优化程序,让我根据dpdk来进行研究提升程序性能。前段时间研究dpdk中的各种机制,导致在这条路上走了许多的歪路,最后在开会的时候那么一说,卧槽,完全不对啊。需要达到的目标和思想完全跟dpdk不是一个路子。下来重新研究吧。

大页内存优化程序主要是针对其中的malloc机制的,意思就是分配大页,增加tlb的命中率。这个地方附上tlb的详细解释地址

https://blog.csdn.net/qq_36357820/article/details/78922819记录了tlb的命中。

使用方式:

一种是以程序来使用,一种是以配置来使用,两种都需要配置大页内存和使用libhugetlbfs.so库。

程序主要是在分配空间的时候直接使用libhugetlbfs.so库中的分配机制,这里我们暂时不做研究。

配置则是以libhugetlbfs.so库中的空间分配方式替换掉gnu的分配空间方式,这里我们使用这种方式。

配置使用:

主要针对centos6和centos7进行配置。

centos6配置

1. 安装libhugetlbfs库
       libhugetlbfs库实现了大页内存的访问。安装可以通过apt-get或者yum命令完成,如果系统没有该命令,还可以从官网下载。

2. 配置grub启动文件
      这一步很关键,决定着你分配的每个大页的大小和多少大页。具体操作是编辑/etc/grub.conf文件,如图五所示。


图1 grub.conf启动脚本

具体就是在kernel选项的最后添加几个启动参数:transparent_hugepage=never default_hugepagesz=1G hugepagesz=1Ghugepages=123。这四个参数中,最重要的是后两个,hugepagesz用来设置每页的大小,我们将其设置为1G,其他可选的配置有4K,2M(其中2M是默认)。如果操作系统版本太低的情况下,可能会导致1G的页设置失败,所以设置失败请查看自己操作系统的版本。hugepages用来设置多少页大页内存,我们的系统内存是128G,现在分配123G用来专门服务大页。这里需要注意,分配完的大页对常规程序来说是不可见的,例如我们的系统还剩余5G的普通内存,这时我如果按照常规方法启动一个耗费10G的程序就会失败。修改完grub.conf后,重启系统。然后运行命令cat /proc/meminfo|grep Huge命令查看大页设置是否生效,如果生效,将会显示如下内容:


图2当前的大页耗费情况

我们需要关注其中的四个值,HugePages_Total表示目前总共有多少个大页,HugePages_Free表示程序运行起来之后还剩余多少个大页,HugePages_Rsvd表示系统当前总共保留的HugePages数目,更具体点就是指程序已经向系统申请,但是由于程序还没有实质的HugePages读写操作,因此系统尚未实际分配给程序的HugePages数目。Hugepagesize表示每个大页的大小,在此为1GB。

配置完成之后使用mount命令进行挂载,一定要挂载:

mount -t hugetlbfs hugetlbfs /mnt/huge

然后程序就可以使用库替换了:

HUGETLB_MORECORE=yes LD_PRELOAD=/生成路径/libhugetlbfs.so ./your_program

这种方法会加载libhugetlbfs库,用来替换标准库。具体的操作就是替换标准的malloc为大页的malloc。此时,程序申请内存就是大页内存了。

部分转载:https://blog.csdn.net/yutianzuijin/article/details/41912871

centos7配置:

1、创建大页内存挂接点 
mkdir /mnt/huge_1GB 
mount -t hugetlbfs nodev /mnt/huge_1GB

2、在/etc/fstab文件中加入如下命令,使其重启后有效 
nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0

3、在CentOS 7.0,修改/etc/grub2.cfg文件中启动菜单的内核参数: 
查找关键字”menuentry”启动项,定位到”linux16 /vmlinuz-3.10.0-327.el7.x86_64” 
在其末尾添加 
“default_hugepagesz=1G hugepagesz=1G hugepages=4” (测试发现在hugepages=4一般不会生效!可设置成系统允许的合适的值) 
重启机器 
为了安全的,建议把第一个”menuentry”启动项复制一份做步骤3修改

4、启动机器后 
cat /proc/meminfo|grep Huge 可以看到Hugepagesize已经设置成1GB 
如果 HugePages_Total为0,以设置16GB为例 
使用sysctl -w vm.nr_hugepages=16 
这样就设置了16GB的大页面,此时HugePages_Total=16 

https://blog.csdn.net/haolipengzhanshen/article/details/77922656

配置好之后使用还是跟centos6适应方式一样的,这里就不多说了。

源码安装libhugetlbfs:

下载地址https://sourceforge.net/projects/libhugetlbfs/

直接使用makefile进行编译:make BUILDTYPE=NATIVEONLY

一定要加最后的参数 BUILDTYPE=NATIVEONLY否则你会遇见各种错误,说一句,最后就算找不到pthread库不要紧,看看obj64目录下有没有库文件生成吧,没有则说明那里出问题了,有就不管它了,然后你就可以直接使用这个库了。

详细查找地址:https://blog.csdn.net/tiantao2012/article/details/79095953

参数设置:

https://linux.die.net/man/7/libhugetlbfs

https://github.com/libhugetlbfs/libhugetlbfs/blob/master/HOWTO

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页