固定提交上限
当 vm.overcommit_memory 设为 2(严格模式)时,内核按一个固定的可提交内存上限来拒绝超额分配。这个上限默认由「swap + 物理内存 × overcommit_ratio%」计算,而 vm.overcommit_kbytes 允许改用固定字节数替代比例计算:只要它非 0,就优先于 overcommit_ratio。适合需要精确控制可提交内存总量的机器,例如把余量固定下来做多租户规划或按应用文档要求固化上限。
基本信息
| 参数名 | vm.overcommit_kbytes |
|---|---|
| 生效前提 | vm.overcommit_memory = 2 时才参与计算 |
| 默认值 | 0,表示改用 overcommit_ratio 计算 |
| 单位 | 写入值以 KB 计 |
| 观察 | /proc/meminfo 的 CommitLimit 与 Committed_AS |
典型使用场景
- 多租户机器上精确规划可提交内存总量
- 内存数据库按官方文档要求调整 overcommit 后固化上限
- 排查大额分配失败(mmap 返回 ENOMEM)的原因
- 核对 CommitLimit 是否覆盖业务峰值需求
- 变更前评估余量与风险窗口
查看与设置
查看与设置
sysctl vm.overcommit_memory vm.overcommit_ratio vm.overcommit_kbytes
grep -E 'CommitLimit|Committed_AS|SwapTotal|MemTotal' /proc/meminfo
sysctl -w vm.overcommit_memory=2 # 先切到严格模式,kbytes 才会参与计算
sysctl -w vm.overcommit_ratio=50 # 比例模式下的上限
sysctl -w vm.overcommit_kbytes=8388608 # 改为固定 8GiB:非 0 时覆盖比例计算
grep -E 'CommitLimit' /proc/meminfo # 确认生效后的上限
cat /proc/sys/vm/overcommit_kbytes相关项读法
| 项 | 含义 | 注意 |
|---|---|---|
| overcommit_memory | 0 启发式,1 总是允许,2 严格按上限 | 只有 2 才使用上限计算 |
| overcommit_ratio | 按物理内存百分比计算上限 | 与 kbytes 同时配置时被忽略 |
| overcommit_kbytes | 固定的可提交字节上限 | 非 0 即优先,覆盖比例计算 |
| CommitLimit | 当前实际生效的可提交上限 | 用于核对配置结果是否如预期 |
比例模式下 CommitLimit 约等于 swap 加上物理内存乘以 overcommit_ratio%;设置为固定 kbytes 之后改用这个固定值。
上限调小后,大页、共享内存等大额分配可能直接失败;变更前应核对 CommitLimit 与 Committed_AS 的差值是否仍留有余量。
正确的核对顺序
- 先确认 overcommit_memory 是否为 2,否则上限根本不参与判断
- 再看 CommitLimit 与 Committed_AS 的差值,估算剩余可提交空间
- 变更后滚动重启大内存应用,确认大额分配仍然成功
严格模式把风险前移到分配阶段:分配会直接失败而不是等到运行期被内核杀掉,前提是应用能正确处理分配失败并降级。