问题

一个其他部门的同事用我们的部署包安装了k8s集群,需要配置大页内存150GB,但是在群里反馈说修改大页内存配置无效,启动后总是只有70GB大页内存。于是求助。

排查

正常配置大页内存的方式是在/etc/default/grub中修改内核的启动参数,在其中加入类似default_hugepagesz=1G hugepagesz=1G hugepages=1的配置,重启后通过cat /proc/meminfo|grep -i hugepage查看节点的大页内存信息。

正常配置中有一步特别容易忘记:在修改/etc/default/grub后,需要update-grub,才能使新的内核参数生效,重启后才会看到新的配置生效。

如果只是忘了update-grub, 那么还不足以专门记录,我们确认update-grub后reboot,问题依旧。

多numa node下的大页内存

当机器有多个numa node时,配置的大页内存会平均分配到各个numa node上

大页内存的申请是无法跨numa node的

按numa node手工配置大页内存

如果我只想使用某一个numa node的大页内存,且要求量很大,如何实现?

大页内存可以通过linux的fs,在/sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages中手动配置。

同时设置

如果内核启动参数和fs中同时配置了大页内存,以谁为准?显然是以fs为准

因此最终怀疑本文中的问题是由于之前在操作系统中遗留了配置脚本,在fs中修改了大页内存配置,导致内核启动参数中的大页内存配置“无效”

解决

/etc目录,按照关键字hugepage找文本文件,并显示上下文,定位哪些可能的脚本修改了大页内存配置。需要根据情况调整搜索的目录和关键字

find /etc -type f -exec file --mime-type {} \; | awk -F: '/text/{print $1}' | xargs grep -Hni -C 2 "hugepage"

最终在/etc/rc.local中找到了罪魁祸首:

image-20230926163656308

参考

文章目录