在 Oracle RAC 环境中配置 HugePages(大页内存)是提升数据库性能,尤其是处理大型 SGA(系统全局区)时的关键优化步骤。它通过减少页表数量和 TLB(转换后备缓冲区)未命中率来降低 CPU 开销。
重要提示: 在 Oracle RAC 环境中,必须在所有节点上执行完全相同的配置步骤,以确保集群的稳定性和一致性。
以下是配置 HugePages 的完整步骤:
📋 前置条件检查
在开始之前,请确保满足以下所有条件。
-
禁用透明大页 (Transparent HugePages, THP) Oracle 官方强烈建议禁用操作系统的透明大页,因为它会动态分配内存,可能导致性能问题。
-
检查状态 :
cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag如果输出显示
[always],则表示 THP 已开启。 -
临时禁用 :
echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag -
永久禁用 : 编辑
/etc/default/grub文件,在GRUB_CMDLINE_LINUX行末尾添加transparent_hugepage=never。然后重新生成 grub 配置文件并重启。# 示例 (具体命令可能因操作系统版本而异) grub2-mkconfig -o /boot/grub2/grub.cfg reboot
-
-
禁用自动内存管理 (AMM) HugePages 与 Oracle 的 AMM (
MEMORY_TARGET,MEMORY_MAX_TARGET) 不兼容。必须使用自动共享内存管理 (ASMM),即设置SGA_TARGET和SGA_MAX_SIZE,并将 AMM 相关参数设为 0。-
检查并修改 :
-- 以 sysdba 身份登录 SQL*Plus SQL> SHOW PARAMETER memory_target; SQL> SHOW PARAMETER memory_max_target; -- 如果值不为0,则需关闭AMM SQL> ALTER SYSTEM SET memory_target=0 SCOPE=SPFILE; SQL> ALTER SYSTEM SET memory_max_target=0 SCOPE=SPFILE; -- 确保 SGA_MAX_SIZE 已设置 SQL> ALTER SYSTEM SET sga_max_size=<your_sga_size> SCOPE=SPFILE; SQL> ALTER SYSTEM SET sga_target=<your_sga_size> SCOPE=SPFILE;修改后需要重启数据库实例才能生效。
-
⚙️ 配置步骤
请在 RAC 的 所有节点 上执行以下步骤。
1. 计算所需的大页数量
最安全、最准确的方法是使用 Oracle 官方提供的脚本 hugepages_settings.sh(通常在 $ORACLE_HOME/rdbms/admin/ 目录下,或可从 Oracle Support Note 401749.1 获取)。
如果手动计算,可以遵循以下原则:
-
核心公式 :
HugePages_Total = (SGA_MAX_SIZE + 额外开销) / Hugepagesize -
额外开销:建议为 SGA 预留 10-20MB 或额外增加 2 个大页,以容纳数据库实例的固定开销。
-
示例 : 假设
SGA_MAX_SIZE为 100GB,系统大页大小 (Hugepagesize) 为 2MB (2048 KB)。所需大页数 ≈ (100 * 1024 MB + 20 MB) / 2 MB = 51210 页为确保万无一失,可以配置得稍大一些。
2. 配置操作系统内存锁定限制 (memlock)
Oracle 用户必须有权限将内存锁定到物理 RAM 中,防止 SGA 被交换出去。
-
编辑文件 :
/etc/security/limits.conf -
添加或修改以下行 :
oracle soft memlock <value_in_KB> oracle hard memlock <value_in_KB><value_in_KB>的值应大于你的 SGA 大小。一个常见的做法是设置为系统总物理内存的 90% 左右(单位 KB)。 例如,对于 256GB 内存的机器,可以设置为241591910(约 230GB)。
3. 设置内核参数 vm.nr_hugepages
-
编辑文件 :
/etc/sysctl.conf -
添加或修改以下行 :
vm.nr_hugepages = <计算出的大页数量>例如:
vm.nr_hugepages = 51210 -
使配置生效 :
sysctl -p执行
grep Huge /proc/meminfo确认HugePages_Total的值已更新。
4. 配置 Oracle 数据库参数
-
编辑参数文件:修改 RAC 所有实例的 SPFILE。
-
设置参数 :
-- 以 sysdba 身份登录 SQL> ALTER SYSTEM SET use_large_pages=TRUE SCOPE=SPFILE SID='*';TRUE: 默认值。如果可用,SGA 将使用大页,不足部分用普通页补充。ONLY: 强制 SGA 完全使用大页,如果大页不足,实例将无法启动。在 RAC 中不推荐,以免因配置失误导致集群问题。AUTO: (Oracle 19c 及以上) 数据库会自动在操作系统层面配置所需的大页数量。
✅ 验证配置
-
重启数据库 :在所有节点上重启数据库实例。
srvctl stop database -d <db_name> srvctl start database -d <db_name> -
检查操作系统层面 :
grep Huge /proc/meminfoHugePages_Total: 应为你设置的值。HugePages_Free: 启动数据库后,此值应显著减少,减少的量约等于 SGA 占用的大页数。HugePages_Rsvd: 应与HugePages_Total接近。
-
检查数据库内部 :
SQL> SELECT * FROM v$sgainfo WHERE name = 'Granule Size';如果配置成功,
Granule Size的值应为2097152(即 2MB)。 -
检查进程内存映射 :
pmap -x <oracle_process_pid> | grep large你应该能看到大量的 2MB 内存块。
⚠️ 常见问题与注意事项
top命令显示内存占用翻倍? 这是正常现象。启用大页后,Oracle 进程启动时就会锁定全部 SGA 内存,top的RES列会显示完整的 SGA 大小。这部分内存不会计入常规的MemFree,而是显示在/proc/meminfo的HugePages_Free中。- RAC 环境的一致性 确保所有 RAC 节点的
vm.nr_hugepages值、use_large_pages参数以及 OS 内核版本都完全一致,否则可能导致实例启动失败或集群不稳定。 - 重启前清空大页 在重启服务器前,建议执行
echo 0 > /proc/sys/vm/nr_hugepages来释放所有大页,以避免下次启动时可能出现的分配问题。