登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

huge pages 使用怎么配置或排查

来源:17golang原创

时间:2026-09-13 14:45:11 317浏览 收藏

Linux 里的 huge pages 不是一个单独的开关。需要应用明确映射大页时,通常选 HugeTLB:先预留页池,再让程序通过 hugetlbfs、mmap 或 System V 共享内存使用它;希望匿名内存由内核尽量自动使用大页时,关注的是 Transparent Huge Pages(THP)。配置后不要只看命令返回成功,还要回到 /proc/meminfo/sys/kernel/mm/hugepages 和 THP 的 sysfs 节点确认状态。

最稳妥的排查顺序是:先判断应用属于 HugeTLB 还是 THP,再核对页大小与数量,最后检查挂载点、映射方式和内存碎片。只修改 vm.nr_hugepages,并不会让所有进程自动改用大页。
要点速览
  • HugeTLB 是预留型页池,页被保留后不能在内存紧张时拿去做普通用途,也不能换出。
  • THP 主要面向匿名内存和 tmpfs/shmem,通常由 alwaysmadvisenever 控制。
  • “池里有大页”和“应用已经使用大页”是两件事,必须分别检查。

先分清 HugeTLB 和 THP 的使用边界

HugeTLB 与 THP 都能减少 TLB 失效,但配置方式和失败表现不同。HugeTLB 更像一块由内核提前划出的专用资源;THP 则是在满足条件时,把匿名内存或共享内存尝试折叠成更大的页。

方案控制入口应用侧特点先看什么
HugeTLBvm.nr_hugepages、启动参数、hugetlbfs需要显式映射或共享内存接口HugePages_TotalHugePages_Free
THP/sys/kernel/mm/transparent_hugepage/enabled内核按策略自动尝试,应用也可配合 madviseenabled、应用内存类型和折叠统计
Linux huge pages 中 HugeTLB 预留页池、页大小和应用映射的静态关系示意图
图1:HugeTLB 页池、页大小和应用映射之间的静态关系示意图,不是实际运行截图。

需要固定页池时配置 HugeTLB

先看机器当前支持和正在使用的数量。不同架构支持的默认大页大小可能不同,示例中的 2M 不能直接当成所有机器的固定值。

# 查看 HugeTLB 总量、空闲量、默认页大小和已消耗内存
grep -E 'HugePages|Hugepagesize|Hugetlb' /proc/meminfo

# 查看内核为不同页大小暴露的 HugeTLB 控制目录
find /sys/kernel/mm/hugepages -maxdepth 1 -type d -name 'hugepages-*' -print

确认页大小后,可以临时增加页池。页数越大,预留的物理内存越多;动态申请还可能受内存碎片影响。

# 临时把默认 HugeTLB 页池调整为 128 页,数值按应用内存预算修改
sudo sysctl -w vm.nr_hugepages=128

# 再次读取池统计,确认总量和空闲量是否发生变化
grep -E 'HugePages_Total|HugePages_Free|HugePages_Rsvd' /proc/meminfo

需要让应用通过文件映射使用 HugeTLB 时,还要有 hugetlbfs 挂载点。下面只是配置示例,挂载目录和权限应按发行版的服务管理方式纳入正式配置。

# 创建专用挂载目录,并挂载使用默认大页大小的 hugetlbfs
sudo mkdir -p /mnt/huge
sudo mount -t hugetlbfs none /mnt/huge

# 确认挂载类型,避免把普通 tmpfs 误当成 hugetlbfs
findmnt -t hugetlbfs

在系统启动早期预留通常更可靠,可以在内核命令行使用 hugepagesz=hugepages=。修改引导参数前先保留回滚项;如果机器支持多个页大小,要把大小参数放在数量参数前面。

希望自动使用大页时调整 THP

THP 的总开关通常位于 /sys/kernel/mm/transparent_hugepage/enabledalways 会更积极地尝试,madvise 需要应用对内存区域给出意图,never 则关闭自动尝试。生产环境不要因为某个压测结果就全局切换,先确认应用的内存访问模式和回退成本。

# 读取 THP 当前策略;方括号标记当前选项
cat /sys/kernel/mm/transparent_hugepage/enabled

# 临时选择 madvise,让应用显式表达适合使用大页的区域
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled

# 若系统存在多个 THP 页大小,也分别查看对应的 enabled 节点
find /sys/kernel/mm/transparent_hugepage -path '*/enabled' -type f -exec sh -c 'echo "-- $1"; cat "$1"' _ {} \;

THP 主要作用于匿名映射和 tmpfs/shmem,并不等于 HugeTLB 页池。即使 THP 策略是 always,受内存碎片、对齐、映射类型等条件影响,也可能回退为普通页;反过来,HugeTLB 页池空闲也不代表 THP 会消费它。

配置后不生效,按四层证据排查

先查资源,再查使用方式。下面的命令不执行任何修复,只读取内核提供的证据,适合放进值班排查脚本。

# 1. 资源层:确认 HugeTLB 页池是否真的有空闲页
grep -E 'HugePages_Total|HugePages_Free|HugePages_Rsvd|Hugepagesize' /proc/meminfo

# 2. 挂载层:确认应用需要的 hugetlbfs 是否存在
findmnt -t hugetlbfs

# 3. 策略层:确认 THP 当前是 always、madvise 还是 never
cat /sys/kernel/mm/transparent_hugepage/enabled

# 4. 进程层:从进程映射中查看是否出现 hugetlb 或大页相关区域
grep -iE 'huge|anonhugepages' /proc//smaps_rollup
现象更可能的原因下一步
HugePages_Total 仍为 0页池没有成功预留,或改的是另一个页大小目录核对 vm.nr_hugepages/sys/kernel/mm/hugepages
页池有空闲页,应用仍分配失败应用没有使用 HugeTLB 映射,或缺少 hugetlbfs/权限检查映射方式、挂载点和进程权限
THP 开启但没有大页区域映射类型、对齐、碎片或应用策略不满足条件确认匿名内存范围,再看应用是否需要 madvise
动态调大页池数量失败运行后内存碎片让连续大页难以获得降低一次申请量,或在启动阶段预留
Linux huge pages 从页池统计、hugetlbfs 挂载、THP 策略到进程映射的静态排查边界图
图2:从页池、挂载、策略到进程映射逐层划分的排查边界示意图,不表示真实执行顺序。

常见问题

只设置 vm.nr_hugepages 就能让所有进程使用 huge pages 吗?

不能。它只负责调整 HugeTLB 页池;应用仍要使用相应的映射接口或 hugetlbfs。普通匿名内存是否使用大页,应另外看 THP 策略。

HugeTLB 和 THP 可以同时开启吗?

可以共存,但它们管理的是不同路径。排查时必须把页池统计和 THP sysfs 策略分开记录,不能用一方的结果证明另一方生效。

为什么重启后临时配置消失?

sysctl -w 和直接写 sysfs 都是临时修改。需要持久化时分别配置系统的 sysctl、引导参数或服务挂载配置,并在重启后重新读取状态文件确认。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>