暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle HugePages 配置与故障排查手册

原创 布衣 2026-09-26
67

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/
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论