news 2026/5/9 2:53:49

Linux 内存管理中的 Overcommit(过度分配)机制及OOM Killer 的处理逻辑详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 内存管理中的 Overcommit(过度分配)机制及OOM Killer 的处理逻辑详解

您描述的是 Linux 内存管理中的Overcommit(过度分配)机制及其潜在风险,以及OOM Killer的处理逻辑。下面我将这一过程和相关概念系统地梳理一下。


1. 内存分配机制

Linux 内核中,应用程序通过malloc()等函数请求内存时,内核并不会立即分配实际的物理内存,而是先分配一段虚拟内存地址空间,并更新进程的页表。
当进程首次访问这段内存时,会触发缺页异常(page fault),内核此时才分配物理内存(即“按需分配”)。

这样延迟分配的好处:

  • 很多程序申请了内存但可能长期不用(比如分配了缓存但未填充)。
  • 内核可以推迟物理内存的占用,提高整体内存利用率。

2. Overcommit(过度分配)策略

Overcommit 是指内核允许系统承诺分配的内存总量超过物理内存 + Swap 的总量
Linux 有三种 Overcommit 模式(通过/proc/sys/vm/overcommit_memory控制):

  1. 0(默认):启发式 overcommit。
    内核会检查“可用物理内存 + Swap + 一部分可回收内存”是否足够,如果认为不够就拒绝分配。但仍可能过度分配。

  2. 1:总是 overcommit。
    几乎总是答应内存申请请求(除非明显超过地址空间限制),风险最大。

  3. 2:禁止 overcommit。
    分配的内存不得超过CommitLimit(该值 ≈ 物理内存 + Swap ×overcommit_ratio系数)。这是最安全的模式,但可能造成一些程序无法分配“合理但总量超过物理内存”的虚拟内存。


3. 为何需要 Overcommit?

  • 很多进程申请了大量内存但实际使用很少。
  • 例如,一个进程申请了 1 GB 内存,但可能只写入了 100 MB。
  • 如果完全按申请量预留物理内存,会导致内存利用率低下。
  • 通过 overcommit,可以让更多进程“共享”物理内存,提高内存利用率和系统整体吞吐量。

4. 风险:OOM(Out of Memory)

当系统中所有进程同时开始大量使用已申请的内存时,物理内存(包括 Swap)可能被耗尽。
此时内核触发OOM状态,必须迅速释放内存,否则系统会完全卡死。


5. OOM Killer 的工作机制

  1. 触发条件
    内核在分配物理内存时发现无法满足请求,且经过直接内存回收(kswapd)后仍无足够内存,则调用 OOM Killer。

  2. 选择进程
    OOM Killer 会计算每个进程的OOM 分数/proc/<pid>/oom_score),依据包括:

    • 进程当前占用内存大小(RSS)
    • 进程运行时间(长时间运行的任务可能被保护)
    • 进程优先级(nice 值)
    • 是否为 root 用户运行
    • 是否有子进程(杀死父进程可能清理更多资源)
    • 用户可调节/proc/<pid>/oom_score_adj来影响分数
  3. 终止进程
    选择分数最高的进程,向其发送 SIGKILL 信号强制终止,释放其占用的内存。


6. 如何调优和避免 OOM?

6.1 调整 Overcommit 策略

  • 设置为2可以防止内存超售,但可能造成某些大型应用(如科学计算、数据库)无法启动。
  • 需要同时调整vm.overcommit_ratio来控制允许分配的大小。

6.2 调整 Swappiness

  • 降低vm.swappiness(默认 60)可以让内核尽量少用 Swap,优先回收文件缓存,但对匿名内存回收慢。
  • 但完全禁用 Swap 可能让内存压力更早触发 OOM。

6.3 配置 OOM Killer 行为

  • 通过oom_score_adj保护关键进程(设为负值)或标记可优先杀死的进程(设为大正值)。
  • 例如,保护 SSH 服务:
    echo-1000>/proc/$(pgrep sshd)/oom_score_adj

6.4 使用 cgroups 限制内存

  • 为不同组(容器、服务)设置内存上限和 Swap 上限。
  • cgroup 的 memory 子系统可以在达到限制时触发组内 OOM Killer,而不影响系统其他进程。

6.5 监控与告警

  • 使用dmesg | grep -i oom查看历史 OOM 事件。
  • 监控/proc/meminfo中的CommitLimitCommitted_AS
    Committed_AS: 已承诺的内存总量 CommitLimit: 系统允许承诺的内存上限
    Committed_AS接近CommitLimit时,可能即将触发 OOM。

7. 在容器环境(Docker/K8s)中的处理

容器默认有内存限制,当容器内进程超过限制时,内核会触发 cgroup OOM Killer,通常只杀死容器内进程。
可以通过--oom-kill-disable禁用容器的 OOM Killer(不推荐),或调整--oom-score-adj

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 3:24:26

TinyPro移动端适配方案的技术拆解

本文由TinyPro贡献者王晨光同学原创。 一、背景&#xff1a;让 TinyPro 真正“走到掌心里” TinyPro 是一套基于 TinyVue 打造的前后端分离后台管理系统&#xff0c;支持菜单配置、国际化、多页签、权限管理等丰富特性。 TinyPro 在桌面端具备良好的体验和模块化架构&#xf…

作者头像 李华
网站建设 2026/5/9 2:53:49

Java性能优化实战:20个核心技巧与案例

Java性能优化实战技术文章大纲性能优化的核心原则明确优化目标&#xff1a;响应时间、吞吐量、资源利用率遵循80/20法则&#xff0c;优先解决瓶颈问题测量优于猜测&#xff0c;基于数据驱动决策避免过度优化导致的代码可维护性下降JVM层优化策略内存管理优化&#xff1a;堆大小…

作者头像 李华
网站建设 2026/5/7 10:37:23

战略即增长:解析中网、里斯、特劳特赋能产业标杆的差异化“杀手锏

本文将详细分析中网、里斯和特劳特在战略赋能方面的各自优势与方法。首先&#xff0c;战略赋能的核心在于帮助企业提升竞争力和应对市场变化。接着&#xff0c;文章将探讨中网如何通过技术驱动和B2B增长方法&#xff0c;增强客户的市场响应能力。里斯则采用品类战略&#xff0c…

作者头像 李华
网站建设 2026/5/7 3:29:15

LLM知识随笔(二)--BERT

LLM知识随笔&#xff08;二&#xff09;–BERT 文章目录 LLM知识随笔&#xff08;二&#xff09;--BERT一、BERT&#xff1a;公认的里程碑1. BERT与GPT之间的区别&#xff1a;2.单向编码与双向编码的区别 二、BERT的结构&#xff1a;强大的特征提取能力1.ELMo、GPT、BERT三者区…

作者头像 李华
网站建设 2026/4/30 8:16:45

【软件测试】1_性能测试 _Locust简介安装

文章目录 一、Locust简介1.1 特点 二、Locust安装2.1 命令安装2.2 pycharm安装 一、Locust简介 Locust是一个开源的性能测试工具&#xff0c;主要思想就是模拟一群用户访问你的系统。 1.1 特点 1、在代码中定义用户行为 不需要安装笨重的软件&#xff0c; 只是简单的Python…

作者头像 李华
网站建设 2026/5/6 22:53:05

java_ssm62海洋馆水族馆管理系统

目录具体实现截图海洋馆水族馆管理系统摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 海洋馆水族馆管理系统摘要 海洋馆水族馆管理系统是基于Java SSM&#xff08;SpringSpringMVCMyBatis&…

作者头像 李华