3. 操作系统安装与内核参数配置
Oracle 数据库在 Linux/Unix 上能否稳定运行,很大程度上取决于安装数据库软件之前对操作系统的“铺垫”是否到位。很多生产事故并非源于 SQL 或存储,而是源于内核参数、资源限制、内存管理或异步 IO 配置不当。本节围绕用户与用户组、资源限制、内核参数、HugePages 与异步 IO 五条主线,说明生产级前置配置的目标、关键参数与落地方法。
一、用户、用户组与目录规划
Oracle 官方推荐将软件安装用户与属主分离管理。典型做法是创建两个操作系统组:oinstall 作为 Oracle 软件清单(Inventory)属组,dba 作为数据库管理权限组;再创建 oracle 用户,其主组为 oinstall,附加组为 dba。若使用 Grid Infrastructure,还需 asmadmin、asmdba、asmoper 等组。用户 ID 与组 ID 在集群各节点之间必须保持一致,否则共享存储上的文件属主会错乱。
groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
useradd -u 54321 -g oinstall -G dba,oper oracle
mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1
chown -R oracle:oinstall /u01
chmod -R 775 /u01
目录规划应遵循 OFA(Optimal Flexible Architecture)思路:/u01 放软件,/u02 放数据文件,/u03 放归档与快速恢复区,避免软件与数据争抢同一文件系统 IO。生产环境还应单独划分 /tmp,Oracle 安装程序需要至少 1GB 可用空间。
二、资源限制:limits.conf 与 PAM
资源限制决定单个会话能打开多少文件、能创建多少进程、能使用多大内存锁。Oracle 实例在启动阶段会一次性申请大量内存锁,若 memlock 不足,实例可能启动失败或告警。典型生产配置如下:
# /etc/security/limits.conf
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft memlock 134217728
oracle hard memlock 134217728
oracle soft stack 10240
其中 memlock 单位为 KB,134217728 KB 即 128GB,用于覆盖 HugePages 锁定内存。修改后需确认 /etc/pam.d/login 或 system-auth 中已加载 pam_limits.so,否则 limits.conf 不会生效。验证方式:以 oracle 用户登录后执行 ulimit -a,观察 max locked memory 与 open files 是否与配置一致。
三、内核参数:共享内存、信号量与网络
内核参数通过 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的独立文件持久化。核心参数分为三类:共享内存(shmmax、shmall、shmmni)、信号量(sem)、网络(rmem/wmem、somaxconn、tcp 相关)。
kernel.shmmax = 68719476736
kernel.shmall = 16777216
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
fs.aio-max-nr = 1048576
shmmax 应不小于单个 SGA 的最大值,通常设为物理内存的一半或更大;shmall 是系统级共享内存页总数,等于 shmmax / PAGE_SIZE 再留余量。kernel.sem 四个值依次为 SEMMSL、SEMMNS、SEMOPM、SEMMNI,Oracle 要求 SEMMSL 不小于 250、SEMMNS 不小于 32000。fs.aio-max-nr 决定系统可分配的异步 IO 事件上限,默认 65536 在高并发下容易耗尽,生产建议提升到 1048576。执行 sysctl -p 后可用 sysctl -a | grep shmmax 核对。
四、HugePages:大页内存的规划与启用
HugePages 将传统 4KB 页替换为 2MB(或 1GB)大页,显著减少页表项数量,降低 TLB Miss,对 SGA 较大的实例收益明显。配置步骤是:先估算 SGA 大小,再计算所需大页数,最后写入内核参数并重启。
计算示例(假设 SGA_TARGET = 64GB,页大小 2MB):所需大页数 = 64GB / 2MB = 32768,再预留约 5% 余量,取 34400。对应配置:
vm.nr_hugepages = 34400
vm.hugetlb_shm_group = 54321
其中 hugetlb_shm_group 填 oracle 用户的主组 ID,使 oracle 有权使用大页。启用后通过 grep Huge /proc/meminfo 查看 HugePages_Total 与 HugePages_Free;实例启动后 HugePages_Free 应明显下降,说明 SGA 已使用大页。若 HugePages_Rsvd 长期为 0,通常意味着 use_large_pages 未设为 ONLY 或大页数不足。
五、异步 IO 与设备队列
Oracle 在 Linux 上默认使用 libaio 进行异步 IO。需要确认已安装 libaio 与 libaio-devel 包,并设置 fs.aio-max-nr。对于使用 ASM 或直接裸设备的场景,还应检查 /dev/sdX 的 queue/scheduler 是否为 deadline 或 noop,queue_depth 是否足够。多路径软件(如 multipath)需配置 path_checker、failback 与 no_path_retry,避免单路径故障导致 IO 挂起。
MEMORY_TARGET,需先关闭 AMM 改用 ASMM,再配置大页,否则实例无法锁定大页内存。六、配置关系总览
下图把本节五类配置与它们影响的数据库对象对应起来,便于在实施时逐项核对。
七、验证与常见问题
配置完成后,建议按以下顺序验证:以 oracle 用户执行 ulimit -a 确认资源限制;执行 sysctl -p 后核对关键参数;执行 grep Huge /proc/meminfo 确认大页数量;执行 cat /proc/sys/fs/aio-max-nr 确认异步 IO 上限。随后启动实例,观察告警日志中是否出现 ORA-27102: out of memory(通常 shmmax 或大页不足)、ORA-27300/27301(通常 memlock 或 nproc 不足)等错误。
/etc/sysctl.conf、/etc/security/limits.conf 与 /etc/pam.d/ 相关文件。最后需要强调:这些配置不是一次性的“安装前动作”,而是随实例规模、并发量和存储架构变化需要持续复核的基线。建议把上述参数整理成节点基线检查表,在每次扩容、迁移或打补丁后重新比对,确保操作系统层始终与数据库层的实际负载相匹配。