超售比例是什么
vm.overcommit_ratio 只在严格超售模式(vm.overcommit_memory 等于 2)下生效,决定可承诺内存中来自物理内存的比例,默认 50。严格模式下,可承诺总量等于 swap 容量加上物理内存乘以该百分比。它也只在那一层参与计算:模式为 0 或 1 时改这个值是无效的。另有 vm.overcommit_kbytes 可以按绝对量指定同一件事,两者互斥。
基本信息
| 参数 | vm.overcommit_ratio(百分比,默认 50) |
|---|---|
| 生效前提 | vm.overcommit_memory 必须为 2 |
| 计算公式 | 可承诺总量 = swap 总量 + 物理内存 × 比例 |
| 当前数据 | /proc/meminfo 的 CommitLimit 与 Committed_AS |
| 替代参数 | vm.overcommit_kbytes 按绝对量指定,与 ratio 互斥 |
| 拒绝表现 | 应用侧看到内存分配失败 |
典型使用场景
- 严格模式容量核算:调整前先算清可承诺总量与已承诺量的差距
- 评估超售风险:用已承诺量占可承诺总量的比例判断是否存在隐患
- 排查分配失败:先确认模式取值,再核对额度是否已被占满
- 迁移与扩容验证:换机型或加内存后重新核算额度是否满足业务
- 配置评审:确认 ratio 与 kbytes 是否被同时设置导致相互覆盖
核算余量
核算余量
sysctl vm.overcommit_ratio vm.overcommit_memory # 先确认模式是否为 2
grep -E 'CommitLimit|Committed_AS' /proc/meminfo # 可承诺总量与实际已承诺量
awk -F'[: ]+' '/Committed_AS/{a=$2} /CommitLimit/{l=$2} END{printf "已用占比 %.1f%%\n", a/l*100}' /proc/meminfo
sysctl -w vm.overcommit_ratio=70 # 放宽额度(仅在模式 2 下有意义)相关量与含义
| 项目 | 含义 | 注意点 |
|---|---|---|
| CommitLimit | 当前可承诺的内存总量 | 由模式与比例(或绝对量)共同决定 |
| Committed_AS | 已承诺出去的内存总量 | 包含尚未实际使用的预留 |
| overcommit_ratio | 物理内存参与计算的比例 | 仅严格模式下参与运算 |
| overcommit_kbytes | 按绝对量指定的额度 | 与 ratio 互斥,后设置者生效 |
提高比例等于放宽准入:短期内看似解决了分配失败,但超额承诺的内存最终仍需物理内存或 swap 承接,风险只是被推迟到运行期。调整前用已承诺量与可承诺总量的比值评估现有余量。
swap 容量也计入可承诺总量:核算时不要漏掉 swap 部分,否则会低估额度。反过来,如果 swap 很小或没有,严格模式下可承诺总量基本只由物理内存与比例决定。