当前位置: 首页 > news >正文

Linux OOM Killer详解

Linux OOM Killer详解

      • 一、概述
      • 二、OOM Killer的技术原理
        • 1. 内存区域划分
        • 2. 内存耗尽与OOM Killer触发
        • 3. 选择被杀进程的策略
        • 4. 内存回收机制
        • 5. 内存分配策略
      • 三、OOM Killer的工作机制
        • 1. 内存压力监测
        • 2. 触发条件
        • 3. 选择被杀进程
        • 4. 终止进程
      • 四、实际场景举例
        • 场景一:系统内存耗尽时的OOM Killer触发
        • 场景二:LowMem耗尽导致OOM Killer触发
        • 场景三:特定进程优先被杀
        • 场景四:保护关键进程
      • 五、优化和解决方案
        • 1. 升级到64位系统
        • 2. 使用hugemem内核
        • 3. 调整内核参数
        • 4. 关闭OOM Killer(风险较高)
        • 5. 配置内核参数以自动重启系统
      • 六、总结

一、概述

在Linux操作系统中,内存管理至关重要。当系统内存耗尽时,如果不采取措施,会导致系统崩溃。为了解决这个问题,Linux内核引入了一种保护机制——OOM Killer(Out-Of-Memory Killer)。当系统内存耗尽时,OOM Killer会选择并终止一些进程,以释放内存,确保系统继续运行。本博客将详细介绍OOM Killer的技术原理、工作机制,并通过实际场景举例说明其应用。

二、OOM Killer的技术原理

1. 内存区域划分

在32位CPU架构下,Linux内核将物理内存划分为三个区域:

  1. DMA区域:0x00000000 - 0x00999999(0 - 16 MB)
  2. LowMem区域:0x01000000 - 0x037999999(16 - 896 MB)
  3. HighMem区域:0x038000000 - <硬件特定>

LowMem区域(也叫Normal Zone)一共880 MB,是内核直接映射的物理地址范围。这意味着,内核需要直接使用的内存必须分配在LowMem区域内。HighMem区域用于用户空间进程的数据存储,但内核访问这部分内存需要进行额外的地址映射。

在64位系统中,所有物理内存都可以被直接映射,因此LowMem和HighMem的划分问题不再存在。然而,在32位系统中,由于LowMem区域有限,内存密集型应用很容易导致LowMem耗尽,触发OOM Killer。

2. 内存耗尽与OOM Killer触发

当系统内存耗尽时,内核会尝试回收可用内存。如果内存仍然不足,内核将触发OOM Killer来选择并终止进程,以释放内存。OOM Killer的主要目的是确保系统不至于完全崩溃,而是通过释放内存来维持运行。

3. 选择被杀进程的策略

OOM Killer选择被杀进程的策略涉及多个因素,包括:

  • 进程的OOM得分:每个进程都有一个OOM得分(oom_score),表示该进程被杀的优先级。OOM得分越高,进程越有可能被杀。
  • 进程的内存使用量:使用内存越多的进程,更有可能被选中。
  • 进程的优先级调整:可以通过调整进程的oom_adj或oom_score_adj值来改变其OOM得分,从而影响被杀优先级。
4. 内存回收机制

Linux内核通过多种机制进行内存回收,包括:

  • 页面回收:回收不常用的页面,将其写回磁盘或释放。
  • 文件缓存回收:回收文件系统缓存,释放更多内存给应用程序使用。
  • 交换空间:将内存页交换到磁盘上的交换空间(swap),以释放物理内存。
5. 内存分配策略

Linux内核使用多种内存分配策略,包括伙伴系统、slab分配器等,以提高内存分配和回收的效率。当内存不足时,内核会使用这些策略来尽可能满足内存分配请求。

三、OOM Killer的工作机制

1. 内存压力监测

内核会持续监测系统的内存使用情况,特别是LowMem区域。当LowMem区域的可用内存达到一个临界点时,内核会认为系统处于内存压力状态,并开始采取措施。

2. 触发条件

OOM Killer的触发条件主要有两个:

  • LowMem耗尽:当LowMem区域的可用内存不足,无法满足内核的内存分配请求时,OOM Killer会被触发。
  • 系统内存耗尽:当系统整体内存耗尽,无法通过正常的内存回收机制释放足够的内存时,OOM Killer会被触发。
3. 选择被杀进程

当OOM Killer被触发时,内核会计算每个进程的OOM得分,并选择得分最高的进程进行终止。计算OOM得分的因素包括:

  • 内存使用量:使用内存越多的进程,得分越高。
  • 进程优先级:通过oom_adj或oom_score_adj调整的优先级。
  • 进程类型:系统关键进程(如init进程)通常不会被选择。
4. 终止进程

内核会向选择的进程发送SIGKILL信号,强制终止该进程,并释放其占用的内存。被终止的进程及其内存释放信息会记录在系统日志中。

四、实际场景举例

场景一:系统内存耗尽时的OOM Killer触发

假设有一个高负载的服务器,运行多个内存密集型应用。当所有应用同时消耗大量内存时,系统内存耗尽。此时,OOM Killer触发,并在/var/log/messages日志文件中记录如下信息:

Out of Memory: Killed process 1234 (myapp) total-vm:512000kB, anon-rss:256000kB, file-rss:128000kB, shmem-rss:64000kB

此信息表明进程myapp(PID为1234)被OOM Killer终止,以释放512 MB的虚拟内存。

场景二:LowMem耗尽导致OOM Killer触发

在32位系统中,LowMem区域是内核直接访问的内存。如果LowMem耗尽,即使HighMem还有可用内存,OOM Killer也会触发。例如,运行以下命令查看LowMem和HighMem的状态:

egrep 'High|Low' /proc/meminfo

输出结果:

HighTotal: 5111780 kB
HighFree: 1172 kB
LowTotal: 795688 kB
LowFree: 16788 kB

此时,LowMem只有16 MB可用内存,而HighMem还有1.1 GB。若内核需要分配更多LowMem,而没有足够空间,OOM Killer将会触发,终止一些进程以释放LowMem。

场景三:特定进程优先被杀

某些应用程序的内存使用非常高,但不是系统关键进程。在内存紧张时,可以通过调整oom_score_adj值,提高这些进程的OOM得分,使其优先被杀。例如,将一个非关键进程的oom_score_adj值设置为10:

echo 10 > /proc/[pid]/oom_score_adj

当系统内存耗尽时,这个进程将优先被OOM Killer终止。

场景四:保护关键进程

对于一些关键进程,可以通过设置oom_score_adj值为-17,使其在内存紧张时不会被OOM Killer杀死。例如:

echo -17 > /proc/[pid]/oom_score_adj

这样,即使系统内存耗尽,该进程也不会被终止。

五、优化和解决方案

1. 升级到64位系统

最有效的解决方案是升级到64位系统。在64位系统中,所有内存都属于LowMem,可以避免32位系统中LowMem耗尽的问题。如果升级64位系统不可行,可以尝试以下方法:

2. 使用hugemem内核

hugemem内核通过不同的方式划分LowMem和HighMem,并提供更多LowMem到HighMem的映射。安装hugemem内核后,系统会有更多的LowMem可用。

安装hugemem内核:

yum install kernel-hugemem
reboot
3. 调整内核参数

通过调整/proc/sys/vm/lower_zone_protection的值,增加LowMem的保护级别。该参数从2.6.x内核开始可用,可以通过以下方式设置:

echo "250" > /proc/sys/vm/lower_zone_protection

在/etc/sysctl.conf中添加设置,以便启动时生效:

vm.lower_zone_protection = 250
4. 关闭OOM Killer(风险较高)

关闭OOM Killer可以避免进程被自动终止,但可能导致系统挂起,因此需谨慎使用:

echo "0" > /proc/sys/vm/oom-kill

查看当前OOM Killer状态:

cat /proc/sys/vm/oom-kill
5. 配置内核参数以自动重启系统

在/etc/sysctl.conf中添加以下配置,使系统在Out of Memory后自动重启:

vm.panic_on_oom = 1
kernel.panic = 10

执行以下命令应用配置:

sysctl -p
  1. 调整进程的oom_score_adj值

可以通过调整进程的oom_score_adj值来保护关键进程或优先终止非关键进程。例如:

保护关键进程:

echo -17 > /proc/[pid]/oom_score_adj

优先终止非关键进程:

echo 10 > /proc/[pid]/oom_score_adj

六、总结

Linux OOM Killer是一种重要的内存保护机制,在系统内存耗尽时通过终止进程来释放内存,确保系统继续运行。理解OOM Killer的技术原理、工作机制和配置方法,有助于优化系统内存管理,避免内存不足导致的系统崩溃。在实际应用中,可以通过升级64位系统、使用hugemem内核、调整内核参数等方法,优化内存使用,提升系统稳定性。通过合理配置OOM Killer,保护关键进程,优先终止非关键进程,可以有效地管理系统内存,提高系统的可靠性和可用性。

在日常运维和开发过程中,熟悉并掌握OOM Killer的配置和优化技巧,可以帮助我们更好地应对内存紧张的情况,保证系统和应用的稳定运行。

相关文章:

Linux OOM Killer详解

Linux OOM Killer详解 一、概述二、OOM Killer的技术原理1. 内存区域划分2. 内存耗尽与OOM Killer触发3. 选择被杀进程的策略4. 内存回收机制5. 内存分配策略 三、OOM Killer的工作机制1. 内存压力监测2. 触发条件3. 选择被杀进程4. 终止进程 四、实际场景举例场景一&#xff1…...

2024rk(案例二)

试题二(25分) 阅读以下关于数据库缓存的叙述,在答题纸上回答问题1至问题3。 【说明】 某大型电商平台建立了一个在线 B2B 商店系统,并在全国多地建设了货物仓储中心,通过提前备货的方式来提高货物的运送效率。但是在运营过程中,发现会出现很多跨仓储中心调货从而延误货物…...

小红书爆文秘籍:ChatGPT助你从0到1创造热门内容!

在小红书打造爆款文案的策略中&#xff0c;以下是一些调整和同义词替换的建议&#xff0c;以便达到文章去重的要求&#xff1a; 了解目标受众&#xff1a; 在撰写文案前&#xff0c;先深入分析目标读者的属性&#xff0c;如年龄层次、性别、爱好和购买行为。通过ChatGPT, 你能迅…...

django快速实现个人博客(附源码)

文章目录 一、工程目录组织结构二、模型及管理实现1、模型2、admin管理 三、博客展现实现1、视图实现2、模板实现 四、部署及效果五、源代码 Django作为一款成熟的Python Web开发框架提供了丰富的内置功能&#xff0c;如ORM&#xff08;对象关系映射&#xff09;、Admin管理界面…...

K8s部署篇之手动部署二进制高可用集群架构

一、系统环境初始化 一&#xff09;架构设计 所有节点都操作&#xff1a;3个master&#xff08;etcd集群三个节点&#xff09;和2个node 1、K8s服务调用如图 2、各组件说明 1、API Server 供Kubernetes API接口&#xff0c;主要处理 REST操作以及更新ETCD中的对象所有资源增删…...

【Unity/XLua】xlua自带教程示例分析(6)—— lua协程

文章目录 工具准备协程测试 工具准备 首先是工具脚本&#xff0c;一个Coroutine_Runner.cs和一个cs_coroutine.lua 前者定义了一个继承自Monobehavior的脚本组件&#xff0c;后者则使用lua去在Unity中实例化一个挂载该组件的GameObject&#xff0c;并将其设置为DontDestroyOn…...

CV目标检测概述

文章目录 目标检测概述目标检测图像分割目标检测和图像分割的区别 目标检测概述 目标检测和图像分割是计算机视觉中的两个重要任务&#xff0c;它们有着不同的目的和应用。以下是它们的简要介绍和区别&#xff1a; 目标检测 目标检测&#xff08;Object Detection&#xff0…...

如何在notebook中运行nodejs

在 Python 生态系统的推动下&#xff0c;机器学习和人工智能日益流行&#xff0c;这带来了计算笔记本的概念。这些交互式计算平台主要是为以 Python 为中心的数据科学应用而开发的&#xff0c;它们将代码、计算输出、解释性文本和多媒体合并成一个有内聚力的文档。 作为 JavaS…...

Mybatis学习-day19

Mybatis学习-day19 1. resultMap resultMap 是 MyBatis 中最复杂的元素&#xff0c;主要用于解决实体类属性名与数据库表中字段名不一致的情况&#xff0c;可以将查询结果映射成实体对象。 <resultMap id"staffAndDep" type"com.easy.bean.Staff">…...

IDEA构建SpringBoot多模块项目

前言 最近一直在思考一个问题&#xff0c;springboot的多模块项目到底是怎么运行和运作的&#xff1f; 一般我们大部分的springboot项目都是单模块的项目&#xff0c;但是如果后续有要求开发多模块的项目应该怎么处理&#xff1f;于是基于这点进行了研究。 本次文章将会带大…...

【前端】NodeJS:nvm

文章目录 1 介绍2 使用2.1 下载安装2.2 常用命令 1 介绍 nvm全称&#xff1a;Node Version Manager&#xff0c;顾名思义它是用来管理node版本的工具&#xff0c;方便切换不同版本的Node.js。 2 使用 nvm的使用非常的简单&#xff0c;跟npm的使用方法类似。 2.1 下载安装 …...

Docker网络模式及通信

一、Docker默认的网络通信 1.1 Docker安装后默认的网络设置 Docker服务器安装完成之后&#xff0c;默认在每个宿主机会生成一个名称为docker0的网卡&#xff0c;其IP地址都是172.17.0.1/16 [rootubuntu1804 ~]#apt -y install bridge-utils [rootubuntu1804 ~]#brctl show 另…...

类模板实现实现Qt click/hover自定义操作

一、场景 常常会需要实现点击/hover时修改图片&#xff0c;可能是一个QPushButton、QLabel、QToolButton…… 由于Qt bug&#xff0c;QIcon/QSS只能实现常规态、按下态的图标切换&#xff0c;hover态的图片设置无效。 解决思路无非是安装事件过滤器、自定义类并重实现事件。 …...

Arco Design:引领未来的Vue 3创意先锋,一键开启高效与美感并重的Web开发之旅!

Arco Design 是一个基于 Vue 3 的 UI 框架&#xff0c;它提供了丰富的组件和样式&#xff0c;可以帮助开发者快速构建高质量的 Web 应用程序。以下是 Arco Design 的一些详细特点&#xff1a; 完整的设计系统&#xff1a;Arco Design 提供了一套完整的设计系统&#xff0c;包括…...

【MySQL】Linux下用C/C++链接MySQL数据库

文章目录 一、准备工作二、验证库和接口的使用三、链接数据库四、对数据库进行增删查改增删改查 五、结尾 一、准备工作 要使用C链接数据库, 首先要去MySQL官网下载官网提供的库, MySQL 社区下载. 如图所示: 接着选择: 按需选择版本: 如果用的是云服务器, 那么在安装mysql时…...

Python金融量化专栏简介

量化分析实战 - 专栏大纲 👉👉👉 《玩转Python金融量化专栏》👈👈👈 订阅本专栏的可以下载对应的代码和数据集 专栏目标 本专栏旨在帮助读者全面掌握使用Python进行金融技术指标的计算与应用,从基础到高级,涵盖各种技术指标的实现、策略开发与回测等内容。通过…...

出行365:依托分布式数据库,让出行无忧 | OceanBase案例

*本文首发自“新华社环球”杂志&#xff0c;作者张海鑫 每年的暑期旅游旺季&#xff0c;都会触发一轮轮的文旅消费的热潮&#xff0c;对于互联网出行服务行业而言&#xff0c;这既是一场盛大的狂欢&#xff0c;也是对其综合实力的严峻考验。 然而&#xff0c;自去年暑假起&…...

【C语言】位段详解

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html &#x1f381;代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、什么是位段&#xff1f; 二、…...

LVS集群实验

NAT模式 本质是多目标IP的DNAT&#xff0c;通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发RIP和DIP应在同一个IP网络&#xff0c;且应使用私网地址:RS的网关要指向DIP请求报文和响应报文都必须经由Direclor转发&#xff0c;Direclor易于成为系统瓶…...

在 Spring Boot 中使用适配器模式实现支付网关的统一接口

引言 在许多电子商务系统中&#xff0c;集成多个支付网关是常见的需求。不同的支付网关有着不同的接口和实现细节。适配器模式可以帮助我们以一种灵活的方式实现这些不同的支付网关接口。 适配器模式简介 适配器模式将一个类的接口转换为客户期望的另一个接口。适配器模式使…...

ZjDroid命令大全:从DEX内存dump到Lua脚本注入的完整教程

ZjDroid命令大全&#xff1a;从DEX内存dump到Lua脚本注入的完整教程 【免费下载链接】ZjDroid Android app dynamic reverse tool based on Xposed framework. 项目地址: https://gitcode.com/gh_mirrors/zj/ZjDroid ZjDroid是一款基于Xposed框架的Android应用动态逆向分…...

C++中显示与隐式加载dll的使用与区别

一、什么是 DLL&#xff1f;DLL&#xff08;Dynamic Link Library&#xff09; 是 Windows 下的动态链接库&#xff0c;包含可被多个程序共享的函数、资源或类。使用 DLL 可以实现代码复用、模块化设计和插件机制。在 C 中&#xff0c;调用 DLL 中的函数有两种主要方式&#xf…...

AMLP框架实战:基于MACE构建高精度机器学习势函数

1. 项目概述&#xff1a;当机器学习势函数遇上自动化管道在计算化学和材料科学领域&#xff0c;我们长久以来面临着一个核心矛盾&#xff1a;精度与效率的权衡。密度泛函理论&#xff08;DFT&#xff09;能提供接近实验的精度&#xff0c;但计算成本高昂&#xff0c;通常只能处…...

零基础轻松拿捏!魔珐星云青少年健康运动教学数字人搭建全流程指南

大家好&#xff01;本次给大家分享一款面向青少年体育教育的AI创意实践项目——青少年健康运动教学智能数字交互系统。本项目聚焦青少年体质健康痛点&#xff0c;围绕体育教学智能化升级需求&#xff0c;打造集健康知识教学、运动动作陪练、健康知识考核、运动能力评测于一体的…...

别再乱用npm install了!手把手教你用npx only-allow为项目指定包管理器(支持pnpm/yarn/npm)

用only-allow统一团队包管理器&#xff1a;从配置到CI的全流程指南 你是否曾经在拉取一个新项目后&#xff0c;面对npm install、yarn还是pnpm i的抉择感到困惑&#xff1f;或者更糟的是&#xff0c;团队成员混用不同包管理器导致node_modules结构不一致&#xff0c;引发各种诡…...

告别拍脑袋规划!用ArcGIS做绿道选线:如何科学量化坡度、水域、道路成本并加权计算

科学规划绿道的ArcGIS高阶技法&#xff1a;从成本栅格构建到最优路径生成绿道规划从来不是简单的"两点之间直线最短"&#xff0c;而是需要综合考虑地形、生态、人文等多维因素的复杂决策过程。传统规划中常见的"拍脑袋"决策方式&#xff0c;往往导致建成后…...

适合地产人用的中介房源管理系统

在房产经纪行业&#xff0c;房源管理与客源管理是经纪人日常工作的核心&#xff0c;直接影响业务效率与成交转化。选择一套适配行业需求的中介房源管理系统&#xff0c;能帮助中介团队规范流程、降低运营成本、大幅提升业绩。今天我们以客观视角&#xff0c;详细解析全房源系统…...

物联网与云技术赋能咖啡后处理:CeriTech 的实时监控系统实践

1. 项目概述&#xff1a;用物联网与云技术重塑咖啡后处理在印尼的咖啡农场里&#xff0c;传统的发酵与干燥过程很大程度上依赖“感觉”和“经验”。一位有经验的农人可能会用手触摸、用鼻子闻&#xff0c;或者根据天气和日照时间来估算发酵是否完成、干燥是否均匀。这种方法固然…...

Sora 2原生接入Unity 6.0:5步完成神经渲染管线嵌入,实测帧率提升47%(附GitHub认证插件)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Sora 2与Unity整合 Sora 2作为新一代AI视频生成引擎&#xff0c;其开放API设计天然支持与实时3D引擎的深度协同。Unity 2023.2版本通过URP&#xff08;Universal Render Pipeline&#xff09;与C# Job System提…...

[智能体-81]:工程化智能体 = 模型做脑力拆解 + 框架做流程落地。前者是决策者,后者是管理者,tools/function call是内部员工;mcp server是外部资源;

一、全角色人设 & 对应技术组件角色定位对应技术模块核心职责决策者&#xff08;脑力大脑&#xff09;大模型 LLM理解目标、任务拆解、逻辑判断、分支决策、内容生成&#xff0c;负责 “想方案、定步骤”管理者&#xff08;流程总管&#xff09;智能体编排框架&#xff08;…...