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 服务已启动。
六、配置验证与常见问题
完成上述配置后,应按顺序验证: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,再逐项核对参数与权限,避免盲目重启节点。