首页/系统/Linux 内核与性能调优速查/vm.overcommit_ratio 超售比例
sysctl 内核参数72 条

vm.overcommit_ratio 超售比例

严格超售模式下 CommitLimit 的构成比例(默认 50):CommitLimit = swap + 物理内存 × ratio%;仅在 overcommit_memory=2 时生效。

超售比例是什么

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 很小或没有,严格模式下可承诺总量基本只由物理内存与比例决定。

易错点

  • 在非严格模式下调整该值:完全不产生效果,先确认模式取值再动手
  • 核算时漏掉 swap:可承诺总量被低估,调整方向随之出错
  • 同时设置比例与绝对量参数:两者互斥,后设置者生效,配置意图与实际不一致
  • 把提额当作解决分配失败的手段:只是把风险推迟到运行期,需同时评估真实内存压力
  • 忽略已承诺量本身可能虚高:大额地址空间预留会让余量看起来更紧张

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/vm.rst
  • man 5 proc(meminfo 字段)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌