当前shmall值以/proc/sys/kernel/shmall为准,单位为页,必须≥ceil(shmmax/getconf PAGESIZE),且总字节数不宜超物理内存的75%,设完需sysctl -p生效并验证。

怎么查当前 shmall 值是否生效
别靠猜,直接读内核运行时参数:/proc/sys/kernel/shmall 是唯一权威来源。运行 cat /proc/sys/kernel/shmall 得到的数字,就是当前真正起作用的页数(不是字节)。如果刚改过 /etc/sysctl.conf 但没执行 sysctl -p,这里显示的还是旧值——很多问题就卡在这一步。
shmall 和页面大小必须手动换算
shmall 单位是“页”,不是字节;它必须 ≥ ceil(shmmax / getconf PAGESIZE),否则 shmget 可能成功,但后续 shmat 时直接触发 OOM killer 或报 EINVAL。常见错误是只设大了 shmmax,却按字节数填 shmall:
- 查页面大小:
getconf PAGESIZE(x86_64 多为 4096) - 若
shmmax=2147483648(2GB),则最小shmall = ceil(2147483648 / 4096) = 524288 - 设成
shmall=2097152(即 8GB 页容量)看似宽松,但若物理内存只有 16GB,可能挤占其他进程空间
永久设置后必须 reload 才生效
往 /etc/sysctl.conf 里加 kernel.shmall = 524288 不等于立刻生效。必须执行:sudo sysctl -p。漏掉这步,重启前仍是旧值;重启后若 sysctl -p 没被 systemd 自动调用(如某些精简版系统),也会静默失效。验证方式:sysctl kernel.shmall 输出应与 conf 文件一致。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
设太大反而导致应用启动失败
不是越大越安全。关键约束有三个:
-
shmall对应的总字节数不能超过物理内存的 50%~75%,否则系统缓存、页表、内核自身会缺内存 - 老内核(如 2.6.32)对
shmall有隐式上限(例如最大支持 232 页),超限会被截断,需用cat /proc/sys/kernel/shmall确认最终值 - Oracle、PostgreSQL 等要求
shmall ≥ ceil(SGA / 页面大小),但还要额外预留至少 1GB 给 OS,否则 SGA 分配时仍失败
真正容易被忽略的是:改完参数不验证是否被内核接受,或者把 shmall 当成字节数硬塞——它和 shmmax 是协同关系,单点调优没意义。

















