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,通常由
always、madvise或never控制。 - “池里有大页”和“应用已经使用大页”是两件事,必须分别检查。
先分清 HugeTLB 和 THP 的使用边界
HugeTLB 与 THP 都能减少 TLB 失效,但配置方式和失败表现不同。HugeTLB 更像一块由内核提前划出的专用资源;THP 则是在满足条件时,把匿名内存或共享内存尝试折叠成更大的页。
| 方案 | 控制入口 | 应用侧特点 | 先看什么 |
|---|---|---|---|
| HugeTLB | vm.nr_hugepages、启动参数、hugetlbfs | 需要显式映射或共享内存接口 | HugePages_Total、HugePages_Free |
| THP | /sys/kernel/mm/transparent_hugepage/enabled | 内核按策略自动尝试,应用也可配合 madvise | enabled、应用内存类型和折叠统计 |

需要固定页池时配置 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/enabled。always 会更积极地尝试,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 |
| 动态调大页池数量失败 | 运行后内存碎片让连续大页难以获得 | 降低一次申请量,或在启动阶段预留 |

常见问题
只设置 vm.nr_hugepages 就能让所有进程使用 huge pages 吗?
不能。它只负责调整 HugeTLB 页池;应用仍要使用相应的映射接口或 hugetlbfs。普通匿名内存是否使用大页,应另外看 THP 策略。
HugeTLB 和 THP 可以同时开启吗?
可以共存,但它们管理的是不同路径。排查时必须把页池统计和 THP sysfs 策略分开记录,不能用一方的结果证明另一方生效。
为什么重启后临时配置消失?
sysctl -w 和直接写 sysfs 都是临时修改。需要持久化时分别配置系统的 sysctl、引导参数或服务挂载配置,并在重启后重新读取状态文件确认。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
314 收藏
-
449 收藏
-
233 收藏
-
344 收藏
-
文章 · linux | 6小时前 | Linux · systemd · 服务器运维 · 日志排查 · journalctl · journalctl启动筛选 journalctl查看上一次启动 journalctl -b -1 systemd日志按启动过滤 Linux启动日志排查222 收藏
-
402 收藏
-
197 收藏
-
345 收藏
-
420 收藏
-
186 收藏
-
245 收藏
-
456 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习