首页/系统/Linux 内核与性能调优速查/静态大页(HugePages)配置
内存与 OOM58 条

静态大页(HugePages)配置

通过 vm.nr_hugepages 预留固定数量的大页供应用显式使用(MAP_HUGETLB / SHM_HUGETLB),避免运行时分配 2MiB 连续内存的碎片问题。

静态大页配置

静态大页(HugePages)通过 vm.nr_hugepages 预留固定数量的大页,供应用显式使用:mmap 的 MAP_HUGETLB、shmget 的 SHM_HUGETLB,或数据库自身的配置项。预留发生在启动早期,可以避免运行期寻找 2MiB 连续内存的碎片问题,代价是这部分内存不能挪作他用。查看用 /proc/meminfo 的 HugePages_ 字段,调整通过 sysctl 或内核启动参数。

基本信息

设置vm.nr_hugepages 与启动参数 hugepagesz、default_hugepagesz
查看grep -i huge /proc/meminfo
应用接口MAP_HUGETLB 与 SHM_HUGETLB
相关控制vm.hugetlb_shm_group、/sys/kernel/mm/hugepages
默认页大小常见 2MiB,另有 1GiB 大页

典型使用场景

  • 数据库实例要求预留大页
  • 避免运行期大页分配失败
  • 评估大页对 TLB 缺失与整体性能的影响
  • 排查预留了但应用并未使用的情况
  • 与透明大页方案对比选择

查看与调整

查看与调整
grep -i huge /proc/meminfo
cat /proc/sys/vm/nr_hugepages
cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
cat /sys/kernel/mm/hugepages/hugepages-2048kB/free_hugepages
sudo sysctl -w vm.nr_hugepages=1024
cat /proc/sys/vm/hugetlb_shm_group
cat /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages   # 1GiB 大页(若支持)

meminfo 字段读法

字段含义判读
HugePages_Total预留的大页总数与 nr_hugepages 对应
HugePages_Free尚未使用的大页数长期等于总数说明应用没用到
HugePages_Rsvd已承诺但未使用的大页与应用预留机制相关
Hugepagesize单页大小常见 2MiB,另有 1GiB
预留但未使用的大页不能挪作他用,会直接减少普通内存的可用量,做容量规划时要把它计算在内。
碎片严重时调大 nr_hugepages 可能只能完成部分分配;在低峰期或用启动参数早期设置更容易成功。

规划与验证

  • 按应用官方文档给出的需求计算大页数量,不要凭经验估算
  • 同时核对 2MiB 与 1GiB 大页的可用性,不同应用要求不同
  • 启动后用 meminfo 的空闲大页数确认是否被真正使用,长期空闲说明配置未起效
  • 预留会减少普通可用内存,容量规划时要一并计算
  • 应用需要大页共享内存时,核对 hugetlb_shm_group 是否包含相应用户组
大页数量可以用内存除以页大小快速估算:2GiB 预留对应 1024 个 2MiB 大页,换算时要给系统留出足够的普通内存。
调整大页数量属于占用普通内存的操作,建议在应用上线前规划,避免业务高峰临时扩容引发内存紧张。

易错点

  • 预留后应用没配好:大页长期空闲,普通内存白白减少
  • 碎片严重时临时调大:只能部分分配,应用仍报大页不足
  • 忘记应用侧配置:数据库需要显式开启大页或指定共享内存组
  • 单位混淆:2MiB 与 1GiB 大页的数量换算差别很大
  • 只看总数不看空闲数:无法判断大页是否真正被使用

数据来源与参考

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