dpdk基础教程——大页内存进阶知识

HugePages大页内存知识点整理

使用numactl来查看node0和node1上认领的cpu核数,以及内存资源.
当然,首先确认下cpu是否是numa架构.
dpdk基础教程——大页内存进阶知识_第1张图片

查看系统所有节点的大页内存情况
cat /sys/devices/system/node/node*/meminfo | fgrep Huge
dpdk基础教程——大页内存进阶知识_第2张图片

大页内存是一种系统资源,在透明大页面机制开启的情况下,其他进程也可以申请和释放大页内存.
查看哪个程序在使用大页内存
grep -e AnonHugePages /proc/*/smaps | awk ‘{ if( 2>4)print 2 > 4 ) p r i n t 0} ’ | awk -F “/” ‘{print 0;system("psfp" 0 ; s y s t e m ( " p s − f p " 3)} ‘

查看每个节点上分配的大页内存总数
dpdk基础教程——大页内存进阶知识_第3张图片

默认情况下就是系统当前所有在线NUMA节点平均分配这些HugePages,除非那个NUMA节点本身没有足够的可用连续内存来生成HugePages,那么此时HugePages将由另外一个NUMA节点生成。
通过/proc/sys/vm/nr_hugepages_mempolicy接口,可以指定HugePages页面具体由哪个NUMA节点生成
出错截图:NUMA节点未均分HugePages,Node 0分配了60G,Node 1分配了140G

dpdk基础教程——大页内存进阶知识_第4张图片

尝试了使用/proc/sys/vm/nr_hugepages_mempolicy来调整大页内存的分配.

//先清0,以便重新生成HugePages页面
echo 0 > /proc/sys/vm/nr_hugepages

//前40个HugePages页面全部在NUMA节点0上生成
numactl -m 0 echo 40 >/proc/sys/vm/nr_hugepages_mempolicy

//后20个(即60-40)HugePages页面全部在NUMA节点1上生成
numactl -m 1 echo 60 >/proc/sys/vm/nr_hugepages_mempolicy

//再接下来的20个(即80-60)HugePages页面平均由NUMA节点0和1上生成
echo 80 >/proc/sys/vm/nr_hugepages_mempolicy

尝试上述方法依旧没有解决问题.

基于3.10内核的操作系统,默认打开了透明大页面功能(Transparent Hugepages),这个功能会使操作系统看到有大页面存在的时候,会在应用进程或者内核进程申请大块内存的时候,优先为它们分配大页面,大页面无法分配时,才会分配传统的4KB页面.

在有透明大页面功能的操作系统中,有个内核进程khugepaged,它也会定期地回收大页面,整理大页面。

如何关闭透明大页面呢?
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

有效关闭透明大页方法
更改内核选项transparent_hugepage=never
centos系统
vim /etc/grub2.cfg
定位到99行
添加transparent_hugepage=never
然后重启机器.

参考文档
http://blog.csdn.net/cybertan/article/details/9035727
https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt
https://www.jianshu.com/p/81233f3c2c14
https://www.kernel.org/doc/Documentation/vm/transhuge.txt
https://access.redhat.com/solutions/46111

你可能感兴趣的:(DPDK入门教程)