静态大页配置
静态大页(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 大页,换算时要给系统留出足够的普通内存。
调整大页数量属于占用普通内存的操作,建议在应用上线前规划,避免业务高峰临时扩容引发内存紧张。