必须用hugepages_settings.sh在已启动实例上运行并加5%余量,否则因vm.nr_hugepages配置错误或配套参数缺失(vm.hugetlb_shm_group、kernel.shmall/shmmax、memlock unlimited、thp禁用)导致ora-27102/27123;验证需hugepages_rsvd>0且alert日志含large pages信息。

Oracle 19c 启动失败、报 ORA-27102 或 ORA-27123,八成不是内存真不够,而是 vm.nr_hugepages 没配对,或配套参数缺失——装库前不配好,实例一启动就 fallback 到普通页,性能掉一半还查不出原因。
怎么算对 vm.nr_hugepages 值(别手算)
直接用 sga_max_size / 2048 得到的数字,99% 会翻车。Oracle SGA 实际占用大页数包含保留区、IPC 共享段、LMS/LMD buffer、内核向上取整开销,实测多出 20~40 页很常见。
- 必须在数据库实例已
STARTUP(哪怕只是MOUNT)状态下运行 Oracle 官方脚本:$ORACLE_HOME/rdbms/install/hugepages_settings.sh(注意是install/,不是admin/下那个旧版) - 以
oracle用户执行,且该用户需能读取/proc/<pid>/maps</pid>(用ps -ef | grep pmon确认进程存在) - 从输出中只取这一行:
Recommended setting: vm.nr_hugepages=XXXX,忽略开头说明文字 - 把该值再上浮 5%,并向上取整:比如脚本输出
3120,实际设为3276 - 若节点有多个实例(如 RAC 双实例或主库+ADG),分别运行脚本,把各推荐值相加后再上浮 5%
只改 vm.nr_hugepages 为什么还是失败
Oracle 启动时校验四项参数是否同时就位,缺一不可。仅写 vm.nr_hugepages 到 /etc/sysctl.conf,大概率静默 fallback 回普通页——此时 grep Huge /proc/meminfo 显示 HugePages_Free 接近 HugePages_Total,就是典型假象。
-
vm.hugetlb_shm_group = <oinstall_gid></oinstall_gid>:必须填oinstall组 ID(用id -g oinstall查),否则grid/oracle用户无权挂载大页共享段 -
kernel.shmmax和kernel.shmall必须 ≥ 当前实例 SGA 实际大小(单位:字节 / 页);shmall × 2048 × 1024要 ≥ SGA 总量(MB) -
memlock必须为unlimited:检查ulimit -l,并在/etc/security/limits.conf中为oracle用户显式设置:oracle soft memlock unlimited和oracle hard memlock unlimited - 改完后必须执行
sysctl -p,且确认输出无 error;若提示"vm.nr_hugepages" is an unknown key,说明内核未启用CONFIG_HUGETLB_PAGE=y
为什么 sysctl -p 成功了,但 Oracle 还是不用大页
关键信号不是 HugePages_Total 有值,而是 HugePages_Rsvd > 0 且 HugePages_Free 显著下降(例如只剩个位数)。这表示 Oracle 进程已成功预留并绑定大页。
- 验证命令:
grep Huge /proc/meminfo,重点关注HugePages_Rsvd是否 > 0 - Oracle 启动日志(
$ORACLE_BASE/diag/rdbms/<sid>/<sid>/trace/alert_<sid>.log</sid></sid></sid>)里必须出现Large Pages字样,例如:Using large pages for SGAs - 如果
HugePages_Rsvd == 0,即使HugePages_Total很大,也说明 Oracle 没拿到页——立刻检查ulimit -l、vm.hugetlb_shm_group、THP 状态 - 禁用
transparent_hugepage必须永久生效:修改/etc/default/grub,在GRUB_CMDLINE_LINUX行末追加transparent_hugepage=never,再运行grub2-mkconfig -o /boot/grub2/grub.cfg并重启
真正麻烦的从来不是改哪几行配置,而是所有参数必须在 Oracle 启动前就位、全部生效、彼此匹配——少一个,use_large_pages=only 就变成摆设,HugePages_Rsvd 就永远是 0。











