当前位置:首页 > 文章列表 > 文章 > linux > huge pages 使用怎么配置或排查

huge pages 使用怎么配置或排查

来源:17golang原创 2026-09-13 14:45:11 0浏览 收藏

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删除
Go testing.T.Cleanup 清理回调 panic 时怎么处理Go testing.T.Cleanup 清理回调 panic 时怎么处理
上一篇
Go testing.T.Cleanup 清理回调 panic 时怎么处理
Vite import.meta.glob怎么配置或排查
下一篇
Vite import.meta.glob怎么配置或排查
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    112次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    34次使用
  • OpenCompass大模型评测体系详解:功能、使用指南与应用场景
    OpenCompass
    OpenCompass是上海AI实验室推出的开源大模型评测平台,提供CompassKit、CompassHub和CompassRank三大核心组件,支持LLM及多模态模型的一站式标准化评估与排行榜查询。
    51次使用
  • AGI-Eval大模型评测平台:权威榜单、数据集与人机协同评测方案
    AGI-Eval
    AGI-Eval是由上海交大等高校联合发布的大模型评测社区,提供公正透明的LLM能力榜单、多领域评测集及Data Studio数据服务,助力AI模型性能评估与NLP科研开发。
    32次使用
  • SuperCLUE中文大模型评测基准:功能、能力维度与应用指南
    SuperCLUE
    SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
    267次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码