oracle所需hugepages数量由sga_max_size决定,计算公式为ceil(sga_max_size / hugepage_size),默认2mb页需预留5%~10%余量,并确保oracle启动前预分配、用户ulimit -l足够、禁用透明大页。
怎么算 oracle 需要多少 hugepages
直接看 sga_target 或 sga_max_size,不是看物理内存,也不是看 memory_target —— oracle 的大页只管 sga,不管 pga。如果用了 amm(memory_target),hugepages 会完全失效,必须切回 asmm(手动设 sga_target + pga_aggregate_target)。
计算公式就是:ceil(sga_max_size / hugepage_size)。Linux 默认 hugepage_size 是 2MB,所以:
- SGA 设了 12GB → 12 * 1024 / 2 = 6144 页
- 但得再加一点余量:共享池、日志缓冲区等可能动态增长,建议上浮 5%~10%
- 查当前 SGA 大小:
sqlplus / as sysdba -c "show parameter sga_max_size" - 查系统默认大页大小:
grep Hugepagesize /proc/meminfo - 别用
free -h估算——它不反映 Oracle 实际申请的连续内存块需求
为什么 /proc/sys/vm/nr_hugepages 设了没生效
常见原因是 Oracle 进程启动前没预留,或者被其他进程“抢注”了大页。Linux 分配 HugePages 是静态预分配,内核在 boot 时或写入 nr_hugepages 时就锁定物理内存,但 Oracle 只在实例启动阶段一次性尝试绑定——错过就没了。
- 必须在 Oracle 实例关闭后设置:
echo 6144 > /proc/sys/vm/nr_hugepages - 重启服务器后该值归零,得写进
/etc/sysctl.conf:vm.nr_hugepages = 6144 - 确认是否被占用:
grep Huge /proc/meminfo看HugePages_Free是否接近HugePages_Total;如果HugePages_Rsvd为 0,说明 Oracle 没成功预留 -
oracle用户需有memlock限制,否则即使页存在也 bind 不上,检查ulimit -l,建议设为unlimited或至少大于 SGA
Oracle 启动报 ORA-27123: unable to attach to shared memory segment
这是最典型的 HugePages 配置失败错误,90% 是因为 SGA 尝试用普通页分配,但内核已把那片内存划给大页池,导致无法 fallback。不是权限问题,也不是共享内存参数错。
- 立刻检查:
cat /proc/meminfo | grep -i huge,若HugePages_Free == 0但HugePages_Rsvd == 0,说明 Oracle 没拿到页 - 确认 Oracle 用户
ulimit -l是否生效(尤其用 systemd 启动时,LimitMEMLOCK得显式设) - 禁用透明大页:
echo never > /sys/kernel/mm/transparent_hugepage/enabled,否则它和显式HugePages冲突 - 不要在
spfile里设use_large_pages=only测试初期,先用try,让 Oracle 自动 fallback 到普通页,避免启不来
怎么验证 HugePages 真正在用
不能只看 /proc/meminfo,得看 Oracle 进程实际映射了哪些内存区域。SGA 绑定成功后,ipcs -m 显示的共享内存段类型会变,且 pmap 能看到大页标记。
- 查 Oracle 进程 PID:
ps -eo pid,comm,args | grep pmon - 看内存映射:
pmap -x <pid> | grep "largepage"</pid>(新内核)或找anony+ 大 size 行 - 更可靠方式:
grep -i huge /proc/<pid>/smaps</pid>,有非零HugetlbPages字段才表示真用了 - SQL 层验证:
select * from v$sgainfo where name like '%Using%';,出现Using Large Pages即生效
真正麻烦的是多实例环境:一个实例占满 HugePages,另一个只能退到普通页,但错误不报在启动日志里,得逐个查 smaps。这种场景下,页数得按所有实例 SGA 总和预留,不能只算单个。










