Oracle RAC数据库管理-hugePages大页内存配置

在 Oracle RAC 环境中配置 HugePages(大页内存)是提升数据库性能,尤其是处理大型 SGA(系统全局区)时的关键优化步骤。它通过减少页表数量和 TLB(转换后备缓冲区)未命中率来降低 CPU 开销。

重要提示: 在 Oracle RAC 环境中,必须在所有节点上执行完全相同的配置步骤,以确保集群的稳定性和一致性。

以下是配置 HugePages 的完整步骤:

📋 前置条件检查

在开始之前,请确保满足以下所有条件。

  1. 禁用透明大页 (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
  2. 禁用自动内存管理 (AMM) HugePages 与 Oracle 的 AMM (MEMORY_TARGET, MEMORY_MAX_TARGET) 不兼容。必须使用自动共享内存管理 (ASMM),即设置 SGA_TARGETSGA_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 及以上) 数据库会自动在操作系统层面配置所需的大页数量。

✅ 验证配置

  1. 重启数据库 :在所有节点上重启数据库实例。

    复制代码
    srvctl stop database -d <db_name>
    srvctl start database -d <db_name>
  2. 检查操作系统层面

    复制代码
    grep Huge /proc/meminfo
    • HugePages_Total: 应为你设置的值。
    • HugePages_Free: 启动数据库后,此值应显著减少,减少的量约等于 SGA 占用的大页数。
    • HugePages_Rsvd: 应与 HugePages_Total 接近。
  3. 检查数据库内部

    复制代码
    SQL> SELECT * FROM v$sgainfo WHERE name = 'Granule Size';

    如果配置成功,Granule Size 的值应为 2097152 (即 2MB)。

  4. 检查进程内存映射

    复制代码
    pmap -x <oracle_process_pid> | grep large

    你应该能看到大量的 2MB 内存块。

⚠️ 常见问题与注意事项

  • top 命令显示内存占用翻倍? 这是正常现象。启用大页后,Oracle 进程启动时就会锁定全部 SGA 内存,topRES 列会显示完整的 SGA 大小。这部分内存不会计入常规的 MemFree,而是显示在 /proc/meminfoHugePages_Free 中。
  • RAC 环境的一致性 确保所有 RAC 节点的 vm.nr_hugepages 值、use_large_pages 参数以及 OS 内核版本都完全一致,否则可能导致实例启动失败或集群不稳定。
  • 重启前清空大页 在重启服务器前,建议执行 echo 0 > /proc/sys/vm/nr_hugepages 来释放所有大页,以避免下次启动时可能出现的分配问题。
相关推荐
亚林瓜子2 小时前
AWS Glue Python Shell任务中读取Athena数据库
数据库·python·shell·aws·glue·athena
zhangchaoxies2 小时前
Golang怎么用K8s Secret管理密钥_Golang如何从K8s Secret安全读取密码和证书【操作】
jvm·数据库·python
2402_854808372 小时前
JavaScript中模块化在游戏引擎开发中的资源调度作用
jvm·数据库·python
SeaTunnel3 小时前
深度解析 Apache SeaTunnel 核心引擎三大技术创新:高可靠异步持久化与 CDC 架构优化实战
大数据·数据库·架构·apache·seatunnel
2401_865439634 小时前
HTML函数在低温环境下启动慢吗_温度对硬件启动影响【方法】
jvm·数据库·python
NotFound4864 小时前
分享实战心得PostgreSQL 主从复制:告别单点故障,附主从切换与延迟监控命令
数据库·postgresql
minebmw710 小时前
Oracle 19.29 中 ORA-00600 [4193] 错误完全解析与恢复指南
数据库·oracle
m0_3776182310 小时前
Golang怎么连接MySQL数据库_Golang MySQL连接教程【总结】
jvm·数据库·python
weixin_5860614611 小时前
C#怎么通过反射获取类属性_C#如何动态读取元数据【进阶】
jvm·数据库·python