semmns是linux内核参数kernel.sem的第二个值,表示系统信号量总数上限;设过低会导致oracle报“cannot create semaphore set: no space left on device”,其值应≥(processes+20)×实例数。
直接改 /etc/sysctl.conf 并执行 sysctl -p 就能生效,但参数值设错或遗漏关键项,会导致 oracle 启动失败(比如 ora-27102: out of memory)或运行中随机挂起。
kernel.shmmax 和 kernel.shmall 必须匹配物理内存与 SGA 规划
这两个参数决定 Oracle 能否成功分配 SGA。如果 shmmax 小于你计划设置的 SGA 大小,实例根本起不来;shmall 如果太小,则可能在高并发连接时触发共享内存页不足。
-
shmmax应设为「物理内存的一半」或「4GB - 1 字节」二者中较小者,但生产环境建议至少设为2147483648(2GB),19c+ 常见 SGA > 4GB 时需设为4294967296(4GB)或更高 -
shmall单位是“页”,不是字节,必须 ≥shmmax / getconf PAGESIZE;x86_64 默认页大小为 4096,所以shmmax=4294967296对应shmall=1048576 - 验证命令:
ipcs -lm查看当前共享内存上限,cat /proc/sys/kernel/shmmax看实时值
kernel.sem 中 SEMMNS 容易被低估,尤其在多实例或高并发场景
Oracle 每个进程(包括后台进程、前台进程)都会消耗信号量,SEMMNS 是全系统信号量总数上限。设低了会报 cannot create semaphore set: No space left on device,哪怕磁盘空间充足。
- 计算公式:SEMMNS ≥ (PROCESSES 参数值 + 20) × 实例数;例如单实例
PROCESSES=1000,至少设SEMMNS=10200 - 四个值顺序不能错:
SEMMSL SEMMNS SEMOPM SEMMNI;常见错误是把SEMMNS写成第二个位置却填了SEMMSL的值 - 检查命令:
cat /proc/sys/kernel/sem,输出类似250 32000 32 128
透明大页(THP)必须禁用,否则 Oracle 会出现不可预测的延迟抖动
Linux 内核默认启用 THP,但 Oracle 官方明确要求禁用——它和 Oracle 自己的内存管理机制冲突,会导致 SGA 分配卡顿、AWR 报告中出现大量 direct path read temp 或 latch: shared pool 等异常等待。
- 临时禁用:
echo never > /sys/kernel/mm/transparent_hugepage/enabled(部分发行版路径为/sys/kernel/mm/redhat_transparent_hugepage/enabled) - 永久禁用:在
/etc/default/grub的GRUB_CMDLINE_LINUX行末尾加transparent_hugepage=never,然后grub2-mkconfig -o /boot/grub2/grub.cfg && reboot - 别只改
enabled文件,内核启动参数不生效,重启后 THP 会恢复启用
I/O 调度器选错会影响 OLTP 响应时间,尤其在虚拟化或 NVMe 环境
Oracle 对 I/O 延迟敏感,调度器不当会让平均写入延迟从 0.1ms 拉高到 5ms+,直接影响 commit 响应。
- 物理机 NVMe:用
none(即 noop)最稳,避免内核层额外排队 - VMware 或 KVM 虚拟机:必须设为
noop,因为 Hypervisor 已做 I/O 调度,重复调度反而增加开销 - 传统 SATA/SAS HDD:可用
deadline,Red Hat UEK 默认就是它 - 验证命令:
cat /sys/block/sdX/queue/scheduler,中括号里的是当前激活项
真正容易被忽略的不是数值本身,而是参数之间的约束关系:比如 shmall 依赖页大小、SEMMNS 依赖实例数和 PROCESSES、THP 禁用必须通过内核参数而非仅 echo。改完不验证、不重启服务、不测 SGA 分配,等于白调。











