3. 操作系统与内核参数工程化配置

Oracle RAC 的稳定性在很大程度上取决于操作系统层是否被“工程化”地准备过。数据库实例、ASM、Clusterware 三类进程对内存、信号量、文件句柄、共享内存段、异步 I/O 与裸设备权限的要求各不相同,如果仅按默认安装的 Linux 参数运行,往往在实例启动、节点加入或高并发时出现 ORA-27300/ORA-27301、ORA-27125、ORA-00845 等错误。本节按“环境准备 → 内核参数 → 用户与资源限制 → HugePages → 异步 I/O 与设备权限”的顺序,说明每一项配置的对象、计算依据与验证方法。

一、环境准备与基础依赖

在安装 Grid Infrastructure 之前,需要确认操作系统版本、内核版本、架构与补丁级别符合 Oracle 认证矩阵。以 Oracle Linux 7.x/8.x 为例,通常需要安装 oracle-database-preinstall-19c 或 oracle-database-preinstall-21c 包,它会自动创建 grid、oracle 用户与 oinstall、dba、asmadmin、asmdba、asmoper 等组,并写入大部分内核参数。但生产环境不应完全依赖该包,仍需逐项核对,因为多路径、HugePages、透明大页(THP)等关键项往往需要手工调整。

基础依赖还包括:关闭或禁用 firewalld、NetworkManager 对私有网卡的管理(RAC 私网建议使用独立网卡并配置静态地址),确保 /etc/hosts 中 SCAN、公网、私网、VIP 名称解析一致;安装 bc、binutils、compat-libcap1、gcc、glibc、libaio、libstdc++、make、sysstat、unzip 等 RPM。其中 libaio 与异步 I/O 直接相关,缺失会导致 ASM 无法使用 native AIO。

二、内核参数:共享内存、信号量与网络

RAC 内核参数可分为三类:共享内存与信号量、网络、以及文件与进程限制。共享内存相关参数包括 kernel.shmmax、kernel.shmall、kernel.shmmni。其中 shmmax 应不小于单个 SGA 的最大值,通常设置为物理内存的一半或更大;shmall 以页为单位,等于 shmmax / PAGE_SIZE 向上取整。例如物理内存 128 GB、SGA 目标 64 GB、页大小 4 KB 时:

kernel.shmmax = 68719476736      # 64 GB
kernel.shmall = 16777216         # 64GB / 4KB
kernel.shmmni = 4096

信号量参数 kernel.sem 由四个值组成:SEMMSL SEMMNS SEMOPM SEMMNI。Oracle 建议 SEMMSL 不小于 250,SEMOPM 不小于 100,SEMMNI 不小于 128。对于多实例节点,SEMMNS 应满足 SEMMSL × SEMMNI 且不小于所有实例 PROCESSES 之和加 10。示例:

kernel.sem = 250 32000 100 128

网络参数中,net.ipv4.ip_local_port_range 建议为 9000 65500,避免与 SCAN 监听端口冲突;net.core.rmem_default、net.core.rmem_max、net.core.wmem_default、net.core.wmem_max 影响私网心跳与 Cache Fusion 传输,通常设置为 262144 或更大。此外 net.ipv4.tcp_rmem、net.ipv4.tcp_wmem 可按需调整。文件与进程相关参数包括 fs.file-max、fs.aio-max-nr,后者决定系统可分配的异步 I/O 请求数,Oracle 建议不小于 1048576。

三、用户与资源限制

Grid 与 Oracle 用户的资源限制通过 /etc/security/limits.conf 或 limits.d 下的独立文件配置。关键项包括 nofile(打开文件数)、nproc(进程数)、stack(栈大小)、memlock(可锁定内存)。其中 memlock 对 HugePages 至关重要,必须设置为略大于 HugePages 总大小,否则实例无法锁定共享内存。示例:

grid  soft  nofile   65536
grid  hard  nofile   65536
grid  soft  nproc    16384
grid  hard  nproc    16384
grid  soft  memlock  134217728
grid  hard  memlock  134217728
oracle soft nofile   65536
oracle hard nofile   65536
oracle soft nproc    16384
oracle hard nproc    16384
oracle soft memlock  134217728
oracle hard memlock  134217728

注意 memlock 单位为 KB,134217728 KB 即 128 GB,应大于 HugePages 总量。配置后需重新登录或重启相关服务使限制生效,可用 ulimit -a 验证。

四、HugePages 配置与计算

HugePages 是 RAC 性能与稳定性的关键。启用 HugePages 后,SGA 使用 2 MB 大页而非 4 KB 小页,可显著减少页表项、降低 TLB miss,并避免因内存碎片导致实例启动失败。配置步骤为:先估算 HugePages 数量,再设置 vm.nr_hugepages,最后验证。

估算公式为:HugePages = ceil(SGA_MAX_SIZE / 2MB) + 少量余量。例如 SGA_MAX_SIZE 为 64 GB,则 64 GB / 2 MB = 32768 页,考虑 ASM 实例与余量,可设置为 33000。同时需设置 vm.hugetlb_shm_group 为 oinstall 组 GID,使 grid 与 oracle 用户可访问大页。示例:

vm.nr_hugepages = 33000
vm.hugetlb_shm_group = 54321

配置后执行 sysctl -p,并用 grep Huge /proc/meminfo 查看 HugePages_Total、HugePages_Free、HugePages_Rsvd。实例启动后 HugePages_Free 应接近 0,说明大页已被 SGA 占用。若 HugePages_Total 小于设定值,通常是因为内存碎片或 THP 未关闭,需先禁用透明大页:

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

五、异步 I/O 与设备权限

Oracle 在 Linux 上使用 native AIO 提升 I/O 并发能力,依赖 libaio 与 fs.aio-max-nr。若 aio-max-nr 过小,会出现 ORA-27090: Unable to reserve kernel resources for asynchronous disk I/O。建议设置为 1048576 或更高,并确认 /proc/sys/fs/aio-max-nr 生效。

设备权限方面,ASM 使用的块设备或裸设备必须由 grid 用户可读写。推荐使用 ASMLib 或 UDEV 规则固定设备名与权限,避免重启后设备名漂移。以 UDEV 为例,可通过 /etc/udev/rules.d/99-oracle-asmdevices.rules 绑定 WWID 与权限:

KERNEL=="sd*", SUBSYSTEM=="block", ENV{ID_SERIAL}=="3600a0980383030524b2b4d6e4f4a4b4c", SYMLINK+="asm-disk1", OWNER="grid", GROUP="asmadmin", MODE="0660"

执行 udevadm control --reload-rules && udevadm trigger 后,用 ls -l /dev/asm-disk* 确认属主与权限。若使用多路径,还需确认 multipath.conf 中 user_friendly_names 与 wwid 配置正确,并确保 multipathd 服务已启动。

RAC 操作系统工程化配置关系图 内核参数 /etc/sysctl.conf kernel.shmmax = 64G kernel.shmall = 16777216 kernel.sem = 250 32000 100 128 fs.aio-max-nr = 1048576 fs.file-max = 6815744 net.ipv4.ip_local_port_range net.core.rmem_max = 262144 vm.nr_hugepages = 33000 用户与资源限制 grid / oracle 用户 oinstall / dba / asmadmin nofile = 65536 nproc = 16384 memlock = 134217728 KB stack = 10240 /etc/security/limits.d/ ulimit -a 验证 HugePages 配置 SGA_MAX_SIZE = 64G 64G / 2M = 32768 页 + 余量 → 33000 页 vm.nr_hugepages = 33000 vm.hugetlb_shm_group 禁用 THP grep Huge /proc/meminfo HugePages_Free ≈ 0 异步 I/O 与设备权限 Native AIO libaio 已安装 fs.aio-max-nr = 1048576 /proc/sys/fs/aio-max-nr 避免 ORA-27090 ASM 使用 native AIO UDEV 设备绑定 99-oracle-asmdevices.rules ID_SERIAL → WWID SYMLINK+="asm-disk1" OWNER="grid" GROUP="asmadmin" MODE="0660" 多路径与验证 multipath.conf user_friendly_names multipathd 已启动 ls -l /dev/asm-disk* 属主 grid:asmadmin 验证顺序:sysctl -p → ulimit -a → grep Huge /proc/meminfo → ls -l /dev/asm-disk* → 实例启动无 ORA-27300/27125/00845

六、配置验证与常见问题

完成上述配置后,应按顺序验证:sysctl -p 确认内核参数无报错;ulimit -a 确认 nofile、nproc、memlock 生效;grep Huge /proc/meminfo 确认 HugePages_Total 与预期一致;ls -l /dev/asm-disk* 确认设备属主与权限;最后启动 Clusterware 与实例,观察 crsctl stat res -t 与 alert.log 是否出现 ORA-27300、ORA-27301、ORA-27125、ORA-00845 等错误。

常见问题包括:HugePages 数量不足导致 ORA-00845;memlock 小于 HugePages 总量导致实例无法锁定内存;aio-max-nr 过小导致 ORA-27090;UDEV 规则未生效导致 ASM 磁盘权限错误。排查时应先看 /var/log/messages 与 alert.log,再逐项核对参数与权限,避免盲目重启节点。

建议将上述参数与验证命令整理为节点交付检查表,在每台节点安装前逐项打勾,可显著降低 RAC 部署阶段的返工率。