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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1201616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL InnoDB Cluster升级到MySQL 8.4.x

MySQL InnoDB Cluster升级到MySQL 8.4.x2026-01-22 20:11 潇湘隐者 阅读(0) 评论(0) 收藏 举报上一篇文章总结了MySQL单实例从MySQL 8.0.35 升级到MySQL 8.4.x版本,这里简单总结一下MySQL InnoDB Cluster的升级到M…

LangGraph MCP Tool Calling Agent:让企业级智能体开发不再头大

LangGraph MCP Tool Calling Agent&#xff1a;让企业级智能体开发不再头大 用 LangGraph 开发复杂的 AI 智能体时&#xff0c;头疼的可能不是代码逻辑处理&#xff0c;而是如何让智能体安全、高效地访问企业内部的数据和工具。这个问题困扰了不少开发者&#xff0c;搞不好还要…

2026年电动刮研刀厂家推荐,提升生产效率与加工精度

在2026年的电动刮研刀市场中,了解正规的刮硏工厂、床身刮研制造商与直销厂家至关重要。这些厂商不仅在技术上不断进步,同时也把客户的需求放在首位。通过深入分析,建议关注它们的生产质量、技术水平和售后服务,以确…

做自媒体3年,终于找到稳定免费图床:CloudFlare-ImgBed实测

90%的博主都不知道!免费100G图床竟比付费的还稳定~ 写文章、做分享时,你是不是也总被图床问题折磨?免费的容量小得可怜,付费的一年要花几百块,更糟的是还常遇到文件失效、大文件传不了的坑,辛苦写的内容全白费!…

Mac Mouse Fix:让几十块的普通鼠标也能拥有丝滑触控板体验

Mac Mouse Fix&#xff1a;让几十块的普通鼠标也能拥有丝滑触控板体验 习惯了 Mac 触控板的丝滑手感&#xff0c;再切回普通鼠标总觉得不得劲儿&#xff0c;滚动生硬卡顿不说&#xff0c;那些好用的手势操作也全没了&#xff0c;搞得人好不安逸。 &#x1f517; Claude Code 国…

数列分块入门学习笔记

分块九讲前言: 本篇主要是作者写完数列分块入门1~9后想写下一篇文章来记录自己的学习的历程,如果有错误的地方可以指出 分块的概念: 其实,分块是一种思想,而不是一种数据结构. 从 NOIP 到 NOI 到 IOI,各种难度的分…

FastScheduler:让 Python 定时任务变得优雅简单

FastScheduler&#xff1a;让 Python 定时任务变得优雅简单 写定时任务这事儿&#xff0c;估计每个 Python 开发者都遇到过。Python 自带的 schedule 库虽然简单&#xff0c;用着确实顺手&#xff0c;但一遇到异步任务、时区处理、失败重试这些高级场景&#xff0c;立马就感觉…

HanaVerse:把本地大模型变成二次元虚拟女友,这才是我们想要的 AI

HanaVerse&#xff1a;把本地大模型变成二次元虚拟女友&#xff0c;这才是我们想要的 AI 说实话&#xff0c;在本地跑大模型确实挺爽的&#xff0c;不用把数据上传到云端&#xff0c;隐私安全有保障&#xff0c;而且还能白嫖各种开源模型。但是吧&#xff0c;每天对着冷冰冰的…

2026年物业管理行业发展核心趋势解析:服务升级与价值重塑

物业管理作为城市治理与居民生活保障的核心环节&#xff0c;其服务质量不仅直接关系到业主的居住体验&#xff0c;更对房产保值增值具有重要影响。当前&#xff0c;国内物业管理行业正处于从传统基础服务向多元化、智能化、专业化转型的关键阶段&#xff0c;行业规模持续扩大&a…

从 0 到 1 认识大模型:核心原理与价值应用指南

在 AI 技术飞速迭代的今天&#xff0c;“大模型” 早已不是专业领域的小众术语&#xff0c;而是渗透到内容创作、智能交互、行业解决方案等多个场景的核心技术。但它究竟是什么&#xff1f;与普通 AI 模型有何本质区别&#xff1f;本文将用通俗的语言拆解大模型的核心概念、发展…

实用指南:spark的静态内存管理机制

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Qt国际化实战指南:使用翻译官实现多语言应用

引言&#xff1a;为什么需要国际化&#xff1f;在当今全球化的软件开发环境中&#xff0c;应用程序往往需要面向不同国家和地区的用户。Qt作为一个跨平台的C框架&#xff0c;提供了完善的国际化&#xff08;i18n&#xff09;支持&#xff0c;允许开发者轻松实现多语言界面。通过…

智能体插件研发应该的技巧

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Vue3登录注册验证码实战

以下是使用 Vue.js 实现登录、注册和验证码功能的完整代码示例。我将逐步解释关键部分&#xff0c;并提供可运行的 HTML 文件代码。代码使用了 Vue 3 的 Composition API&#xff0c;并模拟了验证码生成&#xff08;真实应用中应通过后端 API 获取验证码&#xff09;。 思路说…

期货飞马柜台系统+超融合:全栈国产,节省超60%硬件成本!

随着金融行业国产化替代的纵深推进&#xff0c;期货行业核心交易系统的国产转型正在从“选择题”变为“必答题”。不过长期以来&#xff0c;期货机构普遍将核心交易系统部署在物理服务器上&#xff0c;在当下硬件成本大幅上涨的现实情况下&#xff0c;对于绝大多数中小期货客户…

一张图看懂无线网络参考模型

在深入研究复杂的无线通信协议之前&#xff0c;我们需要一张“地图”来搞清楚我们在讨论什么。经典的OSI七层模型是我们计算机网络的教科书标准&#xff0c;但在实际的无线网络&#xff08;如Wi-Fi&#xff09;中&#xff0c;我们使用的是一套更为实用、精简的架构。今天我们就…

详解静态资源分配的三种流派

在无线通信的世界里&#xff0c;空气&#xff08;频谱&#xff09;是最宝贵的资源。如何让成千上万个设备同时说话而不吵架&#xff1f;这就需要介质访问控制&#xff08;MAC&#xff09;层来制定规则。 而在MAC的众多流派中&#xff0c;“静态分配&#xff08;Static Allocat…

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

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

Elcomsoft Advanced PDF Password Recovery: PDF 文件离线解密取证方案

本文内容&#xff1a; 文档的数字化趋势PDF 文档格式有何优点&#xff1f;PDF 文档保护需求与方法PDF 文档访问权限丢失破解 PDF 解密谜题ElcomSoft 解决方案——安全访问 PDF 文件关于 ElcomSoft 1、文档的数字化趋势 数字技术和电子通信的快速发展&#xff0c;移动电脑和智…

详解无线网络中的“轮询 (Polling)”机制

在之前的篇章中&#xff0c;我们聊过了“分蛋糕”的静态分配&#xff08;如TDMA、FDMA&#xff09;&#xff0c;也聊过了“这就去抢”的随机竞争&#xff08;如ALOHA、CSMA&#xff09;。今天&#xff0c;我们要介绍一种介于两者之间&#xff0c;强调绝对控制与动态调度的机制—…