Rocky Linux 9中无法为应用分配HugePages的问题排查求助
在Rocky Linux 9中使用libhugetlbfs无法预留大页的问题
问题背景
- 早期CentOS 8环境下,通过配置
LD_LIBRARY_PATH指向libhugetlbfs.so路径,可实现应用使用大页内存分配。 - 迁移到Rocky Linux 9后,发现官方源无对应
libhugetlbfs包,手动安装了el8版本的libhugetlbfs-2.21-17.el8.x86_64.rpm。 - 沿用之前的启动命令:
但程序运行后查看LD_PRELOAD=/usr/lib64/libhugetlbfs.so ./brhclus <args>/proc/meminfo,大页未被预留:AnonPages: 52018332 kB AnonHugePages: 0 kB HugePages_Total: 614400 HugePages_Free: 614400 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 1258291200 kB
系统环境
OS: Rocky Linux 9.2 Kernel: 5.14.0-284.18.1.el9_2.x86_64 Memory: 1.5T
排查与解决方案
- 解决跨版本兼容性问题:el8的
libhugetlbfs与el9的glibc、内核可能存在兼容性冲突,建议从libhugetlbfs官方源码编译适配el9的版本,替换现有rpm安装的库。 - 确认hugetlbfs挂载状态:执行
mount | grep hugetlbfs检查hugetlbfs文件系统是否挂载。若未挂载,执行:
并将以下内容添加到mount -t hugetlbfs hugetlbfs /dev/hugepages/etc/fstab实现永久挂载:hugetlbfs /dev/hugepages hugetlbfs defaults 0 0 - 验证动态库是否成功加载:通过
ps aux | grep brhclus查看进程的环境变量,或用ldd ./brhclus确认libhugetlbfs.so是否被链接;也可使用strace ./brhclus <args>跟踪动态库加载流程,排查是否有加载失败的错误。 - 强制启用大页分配:添加
HUGETLB_MORECORE=yes环境变量,强制libhugetlbfs接管内存分配:HUGETLB_MORECORE=yes LD_PRELOAD=/usr/lib64/libhugetlbfs.so ./brhclus <args> - 检查应用内存分配逻辑:若应用直接调用
mmap、brk等底层内存接口而非标准malloc,LD_PRELOAD机制无法拦截这类调用,需要修改应用代码,显式使用hugetlbfs相关接口分配大页内存。 - 排查SELinux限制:Rocky Linux 9的SELinux默认策略更严格,可临时执行
setenforce 0关闭SELinux测试。若问题解决,需添加对应的SELinux允许规则,避免永久关闭SELinux带来的安全风险。
内容的提问来源于stack exchange,提问作者Fredrik Tegenfeldt
相关产品推荐
相关产品推荐

