内存与 OOM58 条

大页使用量核对

/proc/meminfo 的 HugePages_Total/Free/Rsvd/Surp 显示预留与使用情况;Surp 为超额分配预留计数,长期大量 Free 表示预留浪费。

什么是大页使用量核对

大页(HugePages)把内存按 2MiB 或 1GiB 的粒度映射,减少页表项数量与 TLB 缺失,常用于数据库与虚拟化场景。核对使用量要看 /proc/meminfo 的四个字段:HugePages_Total 是预留总数、Free 是当前空闲、Rsvd 是已被预留但尚未使用的计数、Surp 是超额预留计数。判断实际占用不能拿 Total 直接乘页大小,要减掉空闲部分。

基本信息

字段/proc/meminfo 的 HugePages_Total / Free / Rsvd / Surp
页大小Hugepagesize 字段,常见 2048kB
占用估算(Total - Free + Rsvd) × Hugepagesize
调整入口/sys/kernel/mm/hugepages/hugepages-<size>kB/nr_hugepages
透明大页/sys/kernel/mm/transparent_hugepage/enabled
权限调整预留需要 root,通常需要停机窗口

典型使用场景

  • 数据库内存核对:确认大页预留是否被业务真正用上
  • 内存告警排查:区分大页预留与普通匿名内存的占用
  • 性能评估:判断是否因大页不足回落到普通页
  • 容量规划:按业务峰值确定预留数量,避免长期空闲浪费
  • 与透明大页策略一起核对,理清两种机制的区别

核对方法

核对方法
grep -i huge /proc/meminfo                # 四个字段与页大小
awk '/Hugepagesize/{print $2, $3}' /proc/meminfo
ls /sys/kernel/mm/hugepages/              # 支持的页大小目录
cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages   # 预留数量
cat /sys/kernel/mm/transparent_hugepage/enabled              # THP 策略
cat /proc/<pid>/smaps | grep -i huge      # 进程实际使用的大页映射

字段读法

字段含义异常信号
HugePages_Total预留总数长期闲置说明预留过量
HugePages_Free尚未使用的空闲页为 0 且业务报分配失败说明预留不足
HugePages_Rsvd已承诺但未映射理解占用时不能只减 Free
HugePages_Surp超额预留计数非 0 表示存在超配
Hugepagesize单页大小决定换算系数的唯一依据
明确区分大页与透明大页:前者是显式预留、由应用按需映射;后者由内核自动管理,两者的核对入口与调优手段不同。
调整大页数量通常需要停机或重启业务:预留内存一旦分配就无法被普通进程使用,变更前必须与业务确认峰值需求与窗口。
核对时注意单位口径:meminfo 以 kB 展示,而应用配置与内核参数常按 MiB/GiB 书写,换算错误会让预留数量差出数量级,务必先在纸面上对齐单位再动手。

易错点

  • 按 Total 判断占用会把未使用预留也算进去,实际使用要减 Free,并注意 Rsvd 的含义
  • 调整大页数量属于停机窗口操作,变更前与业务确认峰值需求,避免预留不足或浪费
  • 把透明大页与大页混为一谈,导致调优方向错误、问题长期无法收敛
  • 预留后不核对进程是否真的用上:只设置内核参数而不配置应用,容易得出“已优化”的错误结论

数据来源与参考

  • Linux 内核 Documentation/admin-guide/mm/hugetlbpage.rst
  • Linux 内核 Documentation/filesystems/proc.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌