huge pages 使用怎么配置或排查
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、引导参数或服务挂载配置,并在重启后重新读取状态文件确认。
Go testing.T.Cleanup 清理回调 panic 时怎么处理
- 上一篇
- Go testing.T.Cleanup 清理回调 panic 时怎么处理
- 下一篇
- Vite import.meta.glob怎么配置或排查
-
- 文章 · linux | 27分钟前 |
- perf stat 分支怎么配置或排查
- 314浏览 收藏
-
- 文章 · linux | 2小时前 |
- nftables set 地址怎么配置或排查
- 449浏览 收藏
-
- 文章 · linux | 4小时前 |
- ss 监听端口怎么配置或排查
- 233浏览 收藏
-
- 文章 · linux | 5小时前 |
- Linux logrotate 轮转后应用如何重新打开新日志文件
- 344浏览 收藏
-
- 文章 · linux | 6小时前 | Linux · systemd · 服务器运维 · 日志排查 · journalctl · journalctl启动筛选 journalctl查看上一次启动 journalctl -b -1 systemd日志按启动过滤 Linux启动日志排查
- journalctl 启动筛选怎么配置或排查
- 222浏览 收藏
-
- 文章 · linux | 7小时前 | Linux · 运维排障 · mount · Linux mount bind mount 只读挂载
- mount bind 只读怎么配置或排查
- 402浏览 收藏
-
- 文章 · linux | 10小时前 | cgroup cgroup v2 io.max Linux I/O 限速
- cgroup v2 io.max怎么配置或排查
- 345浏览 收藏
-
- 文章 · linux | 11小时前 | cgroup cgroup v2 memory.high Linux 内存限制
- cgroup v2 memory.high怎么配置或排查
- 420浏览 收藏
-
- 文章 · linux | 12小时前 | Linux · systemd · EnvironmentFile ·
- systemd EnvironmentFile 多行变量如何保留空格与换行
- 186浏览 收藏
-
- 文章 · linux | 13小时前 |
- systemd socket activation怎么配置或排查
- 245浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 112次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 34次使用
-
- OpenCompass
- OpenCompass是上海AI实验室推出的开源大模型评测平台,提供CompassKit、CompassHub和CompassRank三大核心组件,支持LLM及多模态模型的一站式标准化评估与排行榜查询。
- 51次使用
-
- AGI-Eval
- AGI-Eval是由上海交大等高校联合发布的大模型评测社区,提供公正透明的LLM能力榜单、多领域评测集及Data Studio数据服务,助力AI模型性能评估与NLP科研开发。
- 32次使用
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 267次使用
-
- Linux vmstat 如何分辨内存抖动与磁盘等待:si、so、wa 与复测顺序
- 2026-08-30 501浏览
-
- Linux搭建vsftpdFTP服务器教程
- 2026-04-30 501浏览
-
- Shell脚本安装教程:.sh一键安装指南
- 2026-03-16 501浏览
-
- Linux清空文件内容的几种方法
- 2025-12-01 501浏览
-
- Linux命令行下载文件技巧
- 2025-11-23 501浏览

