当前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 文件一致。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
设太大反而导致应用启动失败
不是越大越安全。关键约束有三个:
-
shmall对应的总字节数不能超过物理内存的 50%~75%,否则系统缓存、页表、内核自身会缺内存 - 老内核(如 2.6.32)对
shmall有隐式上限(例如最大支持 232 页),超限会被截断,需用cat /proc/sys/kernel/shmall确认最终值 - Oracle、PostgreSQL 等要求
shmall ≥ ceil(SGA / 页面大小),但还要额外预留至少 1GB 给 OS,否则 SGA 分配时仍失败
真正容易被忽略的是:改完参数不验证是否被内核接受,或者把 shmall 当成字节数硬塞——它和 shmmax 是协同关系,单点调优没意义。










