先检查/proc/meminfo中HugePages_Total是否为0及Hugepagesize是否为2048 kB,再验证内核配置CONFIG_HUGETLB_PAGE=y和CONFIG_HUGETLB_PAGE_SIZE_2MB=y;若不满足则大页无法启用。

确认当前 HugePages 状态和内核支持
先看系统是否已启用大页机制,避免盲目配置。执行 cat /proc/meminfo | grep -i huge,重点观察 HugePages_Total 是否为 0、Hugepagesize 是否为 2048 kB(即 2MB)。若全为 0,说明未启用;若 Hugepagesize 是 1048576(1GB),则需确认硬件是否支持 1GB 大页(多数 Oracle 场景仍用 2MB)。
再验证内核编译选项:grep -i hugeltb /boot/config-$(uname -r)。必须看到 CONFIG_HUGETLB_PAGE=y 和 CONFIG_HUGETLB_PAGE_SIZE_2MB=y,否则即使改参数也无效。Oracle Linux 7/8 默认开启,但某些最小化安装或自定义内核可能禁用。
常见错误现象:/proc/sys/vm/nr_hugepages 写入后 HugePages_Free 不变,大概率是内核没启用或内存碎片导致分配失败。
计算并设置 vm.nr_hugepages 值
别直接拍脑袋填数字。Oracle 官方推荐用 MOS 文档 401749.1 的 hugepages_settings.sh 脚本,它基于当前运行的 ipcs -m 共享内存段自动计算。手动估算时:取 sga_max_size(单位字节)除以 Hugepagesize(默认 2097152),结果向上取整。例如 SGA=12G → 12 * 1024 * 1024 * 1024 / 2097152 ≈ 6144,建议设为 6145 避免边界误差。
写入方式有两种:
- 临时生效(重启失效):
echo 6145 | sudo tee /proc/sys/vm/nr_hugepages - 永久生效:在
/etc/sysctl.conf中添加vm.nr_hugepages = 6145,然后运行sudo sysctl -p
注意:该值是系统级总数,不是 per-process;且只控制“预分配”数量,不等于实际被 Oracle 使用的数量。
配置 oracle 用户的 memlock 限制
Oracle 进程必须能锁定大页内存,否则启动时报 ORA-27123: unable to attach to shared memory segment。关键不是设成 unlimited,而是数值要 ≥ 所有 SGA 总和(KB 单位)。
编辑 /etc/security/limits.conf,为 oracle 用户添加:
oracle soft memlock 12582912 oracle hard memlock 12582912
其中 12582912 = 12G × 1024(换算为 KB),比 SGA 实际值略大即可。设太大(如 50G)反而可能触发 ulimit 检查失败。
验证是否生效:sudo -u oracle bash -c 'ulimit -l'。输出应为设定的 KB 值。若仍是 64,说明 limits.conf 未加载——需重新登录 oracle 用户或重启 session。
禁用透明大页(THP)并重启服务
Oracle 官方明确要求关闭 transparent_hugepage,否则与标准 HugePages 冲突,引发 RAC 节点驱逐或单机 latch 争用。检查状态:cat /sys/kernel/mm/transparent_hugepage/enabled,若输出含 [always] 或 [madvise] 就必须关。
关闭方法(Oracle Linux 7/8):
- 编辑
/etc/default/grub,在GRUB_CMDLINE_LINUX行末加transparent_hugepage=never - 运行
sudo grub2-mkconfig -o /boot/grub2/grub.cfg(UEFI 系统路径可能是/boot/efi/EFI/redhat/grub.cfg) - 重启系统,再确认
cat /sys/kernel/mm/transparent_hugepage/enabled输出为always madvise [never]
容易忽略的点:仅改 sysfs 临时开关(如 echo never > /sys/...)在重启后失效,必须固化到 grub 参数里;且 THP 关闭后,/proc/meminfo 中的 AnonHugePages 应趋近于 0。


















