Oracle HugePages 配置与故障排查手册
环境信息
| 项目 | 值 |
|---|---|
| 操作系统 | CentOS/RHEL 7(内核 5.10.109-1.el7.x86_64) |
| 数据库 | Oracle 11.2.0.3 64bit |
| 物理内存 | 375 GB |
| SGA 目标大小 | 200 GB |
| PGA 目标大小 | 50 GB |
| Hugepagesize | 2 MB |
问题现象
配置了 vm.nr_hugepages = 102404,但 /proc/meminfo 中 HugePages_Total 仅为 5210(约 10.2 GB),远不足 200 GB SGA 所需。Oracle SGA 绝大部分运行在普通 4KB 页面上,大页未真正生效。
排查过程
第一步:确认 AMM 已关闭
show parameter memory_target;
show parameter memory_max_target;
结果均为 0,AMM 已关闭,排除此原因。
第二步:确认 memlock 限制
su - oracle
ulimit -l
结果为 unlimited,排除此原因。
第三步:确认 SGA 实际大小
show parameter sga;
sga_target = sga_max_size = 200G,所需大页数 = 200 × 1024 ÷ 2 = 102400 个,配置值 102404 合理。
第四步:查看内核日志定位根因
dmesg | grep -i huge
关键输出:
HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
发现 GRUB 内核启动参数中完全缺少 **hugepages=xxx** 参数,内核启动时预分配了 0 个大页。当前 HugePages_Total = 5210 是系统运行后通过 sysctl 动态分配的,此时内存已碎片化,无法分配足够的连续物理内存。
根因分析
HugePages 要求物理上连续的 512 个 4KB 页面才能组成一个 2MB 大页。系统运行一段时间后,内存被各种进程、内核缓存等占用,物理内存变得碎片化,内核无法凑出足够的连续内存块。
仅通过 sysctl 设置 vm.nr_hugepages 属于运行时动态分配,在内存碎片化场景下成功率极低。必须在系统启动最早期(内存几乎全部空闲且连续时)通过 GRUB 内核参数预分配。
解决方案
第一步:编辑 GRUB 配置文件
vi /etc/default/grub
在 GRUB_CMDLINE_LINUX 行末尾(引号内)追加:
default_hugepagesz=2M hugepagesz=2M hugepages=102404
注意:transparent_hugepage=never 已存在则无需重复添加。
第二步:重新生成 GRUB 配置
判断启动方式:
ls -d /sys/firmware/efi
- 目录不存在(BIOS 启动):
- 目录存在(UEFI 启动):
第三步:重启服务器
reboot
第四步:重启后验证
# 确认内核启动参数已包含 hugepages
cat /proc/cmdline | grep hugepages
# 确认大页已全部分配
cat /proc/meminfo | grep HugePage
# 确认 dmesg 中大页预分配成功
dmesg | grep -i huge
正常输出应包含:
HugePages_Total: 102404
HugePages_Free: 102404
dmesg 中应显示:
HugeTLB registered 2.00 MiB page size, pre-allocated 102404 pages
第五步:启动数据库后再次验证
cat /proc/meminfo | grep HugePage
此时 HugePages_Free 应明显减小,说明 Oracle SGA 已成功使用大页。
修复后状态
| 指标 | 值 | 说明 |
|---|---|---|
| HugePages_Total | 102404 | 内核启动时成功预分配全部大页 |
| HugePages_Free | 24150 | 空闲约 47.2 GB |
| HugePages_Rsvd | 24147 | 已预留约 47.2 GB |
| 已使用 | 78254 页 | 约 152.8 GB 已被 Oracle SGA 使用 |
| AnonHugePages | 0 | THP 已禁用 |
SGA 实际使用约 152.8 GB,低于 sga_target=200G 是 ASMM 正常行为,各组件会根据实际负载动态伸缩。
配置优化建议
当前配置 200 GB 大页,实际使用约 152.8 GB,闲置约 47 GB 被锁定无法供 OS 使用。
| 方案 | HugePages 数量 | 说明 |
|---|---|---|
| 保守方案 | 102404(保持不变) | 确保 SGA 增长时有足够空间 |
| 优化方案 | 82000(约 160 GB) | 若业务负载稳定且 SGA 长期不超 160 GB,可释放约 40 GB 给 OS |
注意事项
/etc/sysctl.conf中的vm.nr_hugepages = 102404应保留,作为备用配置transparent_hugepage=never已在 GRUB 中正确设置,THP 已禁用numa=off使系统以单 NUMA 节点运行,大页分配不受 NUMA 限制- Oracle 11.2.0.3 的
SHM_HUGETLB机制在 5.10 内核中会输出 deprecated 警告,属于正常提示,不影响功能 - 5.10 内核的 THP sysfs 路径为
/sys/kernel/mm/transparent_hugepage/,而非旧版/sys/kernel/mm/redhat_transparent_hugepage/




