sysctl -p 不生效主因是未手动加载或配置语法错误;需检查注释、空格、非法字符,并确认 systemd-sysctl 下 /etc/sysctl.d/ 的高优先级覆盖;关键参数如 shmmax/shmall/sem/aio-max-nr/file-max 必须匹配 Oracle SGA 与并发需求,且须同步调整 ulimit。
修改 /etc/sysctl.conf 后 sysctl -p 不生效?先查重载机制
改完文件没反应,不是配置写错了,而是根本没触发生效。linux 不会自动监听 /etc/sysctl.conf 变化,必须手动加载。
sysctl -p 是最直接方式,它默认读取 /etc/sysctl.conf 并立即应用;如果指定了路径(如 sysctl -p /etc/sysctl.conf),就只加载该文件,避免被其他配置干扰。
- 若某行以
#开头、等号前后缺空格、值含非法字符(如字母或单位后缀),sysctl -p会报错并中断后续加载,典型错误:error: "kernel.shmmax" is an unknown key或syntax error - 较新发行版(如 Ubuntu 20.04+)启用
systemd-sysctl,此时/etc/sysctl.d/*.conf中同名参数优先级更高,可能静默覆盖你写的值——务必用sysctl kernel.shmmax直接查当前运行值,别只信文件内容
kernel.shmmax 和 kernel.shmall 设多少才不报 ORA-27123?看 SGA 实际需求
这两个参数直接决定 Oracle 实例能否启动。设小了,startup 时抛 ORA-27123: unable to attach to shared memory segment;设太大又浪费资源,甚至触发 OOM killer。
-
kernel.shmmax:单个共享内存段最大字节数。必须 ≥ 实际 SGA_MAX_SIZE。64 位系统可设到物理内存 −1 字节(如 128GB 内存 →137438953471),但 Oracle 12c 通常用不到超过 32GB;32 位系统上限是4294967295(≈4GB) -
kernel.shmall:系统共享内存总页数(一页 = 4KB)。计算公式为ceil(shmmax / 4096),但还要确保 ≤ 当前/proc/sys/kernel/shmall上限。验证是否生效:运行ipcs -l,检查 “Maximum total shared memory” 是否等于shmall × 4096 - Oracle 官方文档建议
shmmax至少为物理内存一半,但这只是保底值——真正关键的是匹配你的sga_max_size,不是拍脑袋按内存比例算
为什么 kernel.sem 要设成 250 32000 100 128?信号量不是越大多越好
Oracle 进程间通信依赖 System V 信号量,kernel.sem 四个字段分别控制 SEMMSL(每组最大信号量)、SEMMNS(系统总信号量)、SEMOPM(每次操作最大数)、SEMMNI(信号量集总数)。
- Oracle 12c 文档明确要求最低值为
250 32000 100 128。低于这个值,实例启动或高并发连接时可能卡在 semop 等待,日志里出现ORA-00845: MEMORY_TARGET not supported on this system类似提示(尤其和 AMM 冲突时) - 盲目调高 SEMMNS(如设成百万级)反而增加内核调度开销,且部分老内核(如 RHEL 6 默认)对信号量总量有隐式限制,超限会导致
semget失败 - 验证方式:启动实例后执行
ipcs -s | wc -l,观察实际使用量;再对比cat /proc/sys/kernel/sem输出的四个值是否满足当前负载
fs.aio-max-nr 和 fs.file-max 配太低会卡在哪?不是只影响启动
这两个参数不直接关联共享内存,但 Oracle 12c 在高并发 I/O(如大量 direct path read/write、RMAN 备份)或连接数激增时,会因资源不足静默降级甚至 hang 住。
-
fs.aio-max-nr:系统允许的最大异步 I/O 请求数。Oracle 使用 AIO 做数据文件异步读写,若低于1048576(100 万),RMAN 备份或大规模索引创建可能变慢甚至失败,strace -e trace=io_submit可见大量EAGAIN -
fs.file-max:系统级文件句柄上限。每个 Oracle 进程(包括 background process + server process)都占若干句柄;设太低(如默认 8192)会导致ORA-27123之外的ORA-27125(无法创建进程)或监听器拒绝新连接 - 注意:这些值要配合
ulimit -n(用户级)一起调,否则 Oracle 用户进程仍受限于 shell 的nofile限制
真正容易被忽略的点是:所有参数之间存在隐式耦合。比如 shmmax 调高了但 shmall 没同步,或者 file-max 加了却忘了改 Oracle 用户的 ulimit,结果问题照旧。上线前务必用 ipcs -lm、cat /proc/sys/fs/file-nr、cat /proc/sys/fs/aio-nr 实时核对运行值,别只盯着配置文件。


















