当内存严重不足时,页分配器在多次尝试直接回收失败后,就会调用内存耗尽OOM killer,选择杀死进程,释放内存。

先看一段oom 输出的错误

[ 7981.765805] kthreadd invoked oom-killer: gfp_mask=0x2dc2(GFP_KERNEL|__GFP_HIGHMEM|__GFP_NOWARN|__GFP_ZERO), order=0, oom_score_adj=0
[ 7981.777742] CPU: 3 PID: 2 Comm: kthreadd Tainted: G           O      5.4.0-xilinx-v2020.1 #1
[ 7981.786164] Hardware name: xlnx,zynqmp (DT)
[ 7981.790329] Call trace:
[ 7981.792767]  dump_backtrace+0x0/0x140
[ 7981.796415]  show_stack+0x14/0x20
[ 7981.799717]  dump_stack+0xac/0xd0...[ 7982.331629] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/,task=net_process,pid=1275,uid=0
[ 7982.344516] Out of memory: Killed process 1275 (net_process) total-vm:4113316kB, anon-rss:3888320kB, file-rss:36kB, shmem-rss:2052kB, UID:0 pgtables:7852032kB oom_score_adj:0
[ 7982.974247] oom_reaper: reaped process 1275 (net_process), now anon-rss:0kB, file-rss:0kB, shmem-rss:2052kB

在应用程序开发时会出现内存泄露,如上述所示,杀死net_process进程信息。在内核中是如何处理的呢?

内存耗尽可配置的参数如下:

/proc/sys/vm/oom_kill_allocating_task

是否允许杀死正在申请分配内存并触发内存耗尽的进程,避免扫描进程链表选择进程。

0表示禁止,非零表示允许

/proc/sys/vm/oom_dump_tasks

是否允许内存耗尽杀死进程的时候,是否打印所有用户进程的内存使用信息,

0表示禁止,非零表示允许

/proc/sys/vm/panic_on_oom

是否允许在内存耗尽的时候内核panic,重启系统。

0:表示禁止内核恐慌,1 表示允许内核恐慌;2强制执行内核恐慌

杀死进程的计算方法

给进程计算分数(badness score),选择分数最高的进程。分数范围0~1000,0 表示不杀死,1000表示总是杀死。

  1. 用户可以在/proc/<pid>/oom_score_adj 为进程设置分数值范围[-1000,1000]。值越大导致杀死时的分数越高。
  2. 查看进程分数/proc/<pid>/oom_socre

技术原理

内存耗尽杀手分为全局的内存耗尽杀手内存控制组的内存耗尽杀手

  1. 内存控制组的内存耗尽杀手指内存控制组的内存使用量超过硬限制的时候,内存控制组选择进程杀死。
  2. 全局的内存耗尽杀手是指内存严重不足的时候,从整个系统选择进程杀死。

oom_kill_process执行过程

  1. 如果被选中的进程有子进程,那么从所有子进程中选择badness score最高的子进程代替父进程牺牲,试图使丢失的工作量最小化。(在多进程的服务端场景)
  2. 向被选中的进程发送杀死信号SIGKILL

linux内核中内存耗尽OOM killer相关推荐

  1. Linux内核中内存管理相关配置项的详细解析3

    接前一篇文章:Linux内核中内存管理相关配置项的详细解析2 5. 2:1 compression allocator (zbud) 对应配置变量为:CONFIG_ZBUD. 此项默认为选中(如果前一 ...

  2. Linux内核中内存分配函数

    1.原理说明 Linux内核 中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表,如图2-1所示.四级页表分别为 ...

  3. linux内核killler,Linux内核参数overcommit_memory和OOM killer介绍

    什么是Linux Overcommit和OOM overcommit_memory是一个内核对内存分配的一种策略,它有三个可选值:0.1.2. 0. 表示内核将检查是否有足够的可用内存供应用进程使用: ...

  4. KSM(Kernel Samepage Merging) 剖析:Linux 内核中的内存去耦合

    简介:作为一个系统管理程序(hypervisor),Linux® 有几个创新,2.6.32 内核中一个有趣的变化是 KSM(Kernel Samepage Merging)  允许这个系统管理程序通过 ...

  5. Linux内核中的内存屏障(转)

    转自:http://www.linuxidc.com/Linux/2011-10/44623.htm 前言 之前读了关于顺序一致性和缓存一致性讨论的文章,感觉豁然开朗.对linux内核中出现的种种同步 ...

  6. Linux内核中常见内存分配函数

    1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分 ...

  7. 红黑树在linux内核中的应用场景(红黑树,进程管理CFS,内存管理)丨epoll丨c/c++linux服务器开发丨linux后台开发

    红黑树在linux内核中的应用场景(红黑树,进程管理CFS,内存管理) 视频讲解如下: 红黑树在linux内核中的应用场景(红黑树,进程管理CFS,内存管理)丨epoll丨c/c++linux服务器开 ...

  8. Linux内核中的内存管理(图例解析)

    一 ,内核管理内存的方式 (1)内核把物理页作为内存管理的基本单位,内存管理单元通常以页为单位进行处理,所以,从虚拟内存角度来看,页就是最小单位. 大多数32位系统支持4kb的页,64位系统支持8kb ...

  9. Linux内核中使用内存检测

    目录 一.slub内存检测 1.越界访问 2.释放后再访问 3.无效的释放 4.实验输出 二.KASAN 内存检测 1.数组越界 2.栈的越界访问 3.实验输出 一般的内存访问错误如下: 越界访问 访 ...

最新文章

  1. 水平和垂直翻转可视对象
  2. input和img图片水平对齐
  3. jQuery 遍历:思路总结,项目场景中如何处理/控制获取的 each 遍历次数?
  4. iOS中创建,使用动态库(dylib)
  5. 自定义的plot函数参数date坐标模型[x,y]的使用建议
  6. 中介者模式php,php设计模式 Mediator (中介者模式)
  7. Android 如何在Eclipse中查看Android API源码 及 support包源码
  8. Scale-Adaptive Neural Dense Features: Learning via Hierarchical Context Aggregation
  9. Big5和Gb编码转换
  10. win10的windows聚焦锁屏界面图片在哪个文件夹的问题解决
  11. N63043-郝子轩-第一周
  12. 本地HTML文档批量翻译软件
  13. word2016 卡顿_word2016经常发生卡顿现象
  14. echarts显示中国地图
  15. python实训总结万能版3000字_万能实习报告论文范文3000字
  16. 你的金钱和时间流向哪,你的人生就什么样!
  17. 舔狗日记更新美化版源码
  18. [Elasticsearch] 邻近匹配 (三) - 性能,关联单词查询以及Shingles
  19. vivado CORDIC ip核计算arctan记录
  20. 一个酷炫的,动态交互网页的桌面。

热门文章

  1. mySql | Error: ER_DATA_TOO_LONG: Data too long for column 'base_info' at row 1
  2. JetBrains Rider想创建新工程一直显示Syncing Project Templates...
  3. 速腾聚创16线激光雷达rslidar-16的ros驱动安装与rviz点云显示
  4. ZYNQ_MPSoC启动
  5. 单片机与ARM嵌入式,DSP,FPGA的联系与区别
  6. lotus interop.5.5
  7. 自然语言表达处理笔记01—— 1.正则表达式 2.文本标记化 3.词干提取和词形还原 4.中文分词
  8. OpenHarmony驱动子系统开发
  9. 1.01.21盒子模型,浮动,定位
  10. [noip2016]天天爱跑步