近期公司老大让我研究大页内存,说是大页内存可以优化程序,让我根据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