56 关于 linux 的 oom killer 机制

前言

这里主要讲的是 linux 的 oom killer 机制 

在系统可用内存较少的情况下,内核为保证系统还能够继续运行下去,会选择杀掉一些进程释放掉一些内存。
通常oom_killer的触发流程是:进程A想要分配物理内存(通常是读写内存)->触发缺页异常->内核去分配物理内存->物理内存不足,触发OOM。

 

 

测试用例

只要写一个 main, 不断地 malloc, 然后 访问一下 分配的空间即可 

然后 编译, 运行程序, 最终 linux 会 kill 这个进程 

 

完整的 oom_score 日志输出如下 

[  231.115880] Test06Unlimited invoked oom-killer: gfp_mask=0x14280ca(GFP_HIGHUSER_MOVABLE|__GFP_ZERO), nodemask=0, order=0, oom_score_adj=0
[  231.118999] Test06Unlimited cpuset=/ mems_allowed=0
[  231.121073] CPU: 0 PID: 253 Comm: Test06Unlimited Not tainted 4.10.14 #1
[  231.122613] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
[  231.124569] Call Trace:
[  231.124569]  __dump_stack+0x1f/0x21
[  231.124569]  dump_stack+0x58/0x76
[  231.124569]  dump_header+0x71/0xb1
[  231.124569]  oom_kill_process+0x9d/0x365
[  231.124569]  ? oom_evaluate_task+0x8d/0x10c
[  231.124569]  out_of_memory+0x1a6/0x1f1
[  231.124569]  __alloc_pages_slowpath+0xa75/0xae4
[  231.124569]  __alloc_pages_nodemask+0x161/0x218
[  231.124569]  alloc_pages_vma+0x1b4/0x235
[  231.124569]  do_anonymous_page+0x27a/0x585
[  231.124569]  handle_pte_fault+0x115/0x235
[  231.124569]  __handle_mm_fault+0x2b4/0x2ea
[  231.124569]  handle_mm_fault+0x148/0x1f0
[  231.124569]  __do_page_fault+0x40c/0x511
[  231.124569]  do_page_fault+0x22/0x27
[  231.124569]  page_fault+0x28/0x30
[  231.124569] RIP: 0033:0x7f0bf714d3e2
[  231.124569] RSP: 002b:00007ffca24d61d0 EFLAGS: 00000206
[  231.124569] RAX: 0000000000020b21 RBX: 00007f0bf7490b20 RCX: 0000000000100011
[  231.124569] RDX: 0000003c15d8f4e0 RSI: 0000003c15e8f4e0 RDI: 00007f0bf7490b20
[  231.124569] RBP: 0000000000100011 R08: 0000003c15db0000 R09: 00007f0bf76b8700
[  231.124569] R10: 0000003c15db0000 R11: 0000000000000001 R12: 0000000000120b31
[  231.124569] R13: 0000003c15d8f4d0 R14: 0000000000100000 R15: 0000000000100000
[  231.135287] Mem-Info:
[  231.136124] active_anon:312765 inactive_anon:8 isolated_anon:0
[  231.136124]  active_file:1 inactive_file:12 isolated_file:0
[  231.136124]  unevictable:24494 dirty:0 writeback:0 unstable:0
[  231.136124]  slab_reclaimable:2145 slab_unreclaimable:1265
[  231.136124]  mapped:653 shmem:8 pagetables:155990 bounce:0
[  231.136124]  free:13189 free_pcp:150 free_cma:0
[  231.140296] Node 0 active_anon:1251060kB inactive_anon:32kB active_file:4kB inactive_file:48kB unevictable:97976kB isolated(anon):0kB isolated(file):0kB mapped:2612kB dirty:0kB writeback:0kB shmem:32kB shmem_thp: 0kB shmem_pmdmapped: 0kB anon_thp: 0kB writeback_tmp:0kB unstable:0kB pages_scanned:3181 all_unreclaimable? yes
[  231.141882] Node 0 DMA free:8132kB min:356kB low:444kB high:532kB active_anon:5140kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB writepending:0kB present:15992kB managed:15908kB mlocked:0kB slab_reclaimable:0kB slab_unreclaimable:4kB kernel_stack:0kB pagetables:2588kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB
[  231.143295] lowmem_reserve[]: 0 1945 1945 1945 1945
[  231.143840] Node 0 DMA32 free:44624kB min:44696kB low:55868kB high:67040kB active_anon:1245932kB inactive_anon:32kB active_file:4kB inactive_file:48kB unevictable:97976kB writepending:0kB present:2080640kB managed:2032384kB mlocked:0kB slab_reclaimable:8580kB slab_unreclaimable:5056kB kernel_stack:992kB pagetables:621372kB bounce:0kB free_pcp:600kB local_pcp:600kB free_cma:0kB
[  231.145484] lowmem_reserve[]: 0 0 0 0 0
[  231.145639] Node 0 DMA: 1*4kB (U) 0*8kB 0*16kB 0*32kB 1*64kB (M) 1*128kB (M) 1*256kB (M) 1*512kB (M) 1*1024kB (U) 1*2048kB (U) 1*4096kB (M) = 8132kB
[  231.146861] Node 0 DMA32: 2*4kB (UM) 11*8kB (UE) 5*16kB (UE) 7*32kB (ME) 5*64kB (UME) 5*128kB (UE) 3*256kB (UME) 1*512kB (M) 1*1024kB (M) 2*2048kB (ME) 9*4096kB (M) = 44624kB
[  231.147655] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
[  231.148490] 24515 total pagecache pages
[  231.148622] 0 pages in swap cache
[  231.148784] Swap cache stats: add 0, delete 0, find 0/0
[  231.149277] Free swap  = 0kB
[  231.149358] Total swap = 0kB
[  231.149506] 524158 pages RAM
[  231.149634] 0 pages HighMem/MovableOnly
[  231.149977] 12085 pages reserved
[  231.150064] 0 pages cma reserved
[  231.150148] 0 pages hwpoisoned
[  231.150292] [ pid ]   uid  tgid total_vm      rss nr_ptes nr_pmds swapents oom_score_adj name
[  231.151042] [  112]     0   112     6615      596      17       3        0         -1000 systemd-udevd
[  231.151642] [  241]     0   241     1169      425       8       3        0             0 sh
[  231.152080] [  253]     0   253 79844610   312881  155953     307        0             0 Test06Unlimited
[  231.152734] Out of memory: Kill process 253 (Test06Unlimited) score 888 or sacrifice child

 

 

oom-killer 进程的选择

场景是操作系统在申请物理内存的时候 资源已经没有了

然后 导致操作系统需要选择一个 物理内存占用相对较高的进程进行杀掉

然后 这里来看一下 具体的情况

 

 

这里是根据策略寻找一个 最佳匹配的进程

然后下面 oom_kill_process 发送信号, 杀掉对应的进程 

1c46121b93aa4104ba174fbd1b706929.png

 

select_bad_process 相关 

循环所有的进程, 计算 oom_score, oc 中记录 oom_score 最大的分数, 以及对应的进程 

ac70d107256f43e7806f98afd17959ba.png

 

oom_evaluate_task 相关 

某一些进程不能杀, 直接跳过 比如 init进程, 内核进程 

如果给定的进程已经被杀掉了 跳过/放弃

如果进程 有 oom_flag_origin, 直接 select 该进程, 并设置 score 为 LONG_MAX

接下来是根据 进程的情况计算 oom_score, 如果 score 比已有的 oc.choosen_points 大, 更新 oc->choosen, oc->choosen_points

f19f07e824534d78b33bf6941eda5bd7.png

 

oom_unkillable_task 不能杀的这一部分进程 

cfdefb7e01534437875b2eeaea2369f8.png

 

 

oom_badness 计算进程得分情况 

如果 进程不能杀, 得 0 分 

如果进程不存在, 得 0 分 

如果 oom_score_adj 为 OOM_SCORE_ADJ_MIN 或者 有 MMF_OOM_SKIP 标记, 得 0 分 

points 基础为 FILEPAGES + ANNOPAGES + SHMEMPAGES + SWAP_EVENTS + 页框数量 + pmd 数量 

然后 再计算一个 oom_score_adj 的一个偏移 (rampages + swappages) / 1000

最终得分为 points + oom_score_adj

79709ec57ab049119eda97186a0af288.png 

 

在外面 select_bad_process 的地方对于 oom_score 有调整

以这里的 Test06Unlimited 为例

rss 为 312881
swapents 为 0
nr_ptes 为 155953
nr_pmds 为 307
oom_adj_score 为 0
totalpages 为 524158 – 12085 = 512073

根据计算规则 oom_badness 中 oom_score 计算结果为 (((312881 + 0 + 155953 + 307) + (0 * (512073 / 1000))) * 0.97) = 455066
然后 外层的 select_bad_process 更新 oom_score 为 455066 * 1000 / 512073 = 888

MM_RSS 为 FILEPAGES + ANNOPAGES + SHMEMPAGES  3ebda27ff9ed4eac88e60e8dfab8b1fe.png

 

 

输出任务, 寄存器信息

task_struct->comm 可以查看 给定的进程的 执行程序的信息

输出进程相关信息 

5c60bc8e8004406799f86a94d45a5656.png

fbd02266c8434eaba52592aeb937c4c3.png 

 

输出堆栈信息 

printk_stack_address 是输出每一行调用栈信息 

__show_regs 中输出各个寄存器相关 

c167f5544a1b4c25baf3660dbee67816.png

4d6e8048f3574bf49835e835f282cde2.png

0842a513815b470f8f25d646e9bde349.png

 

__show_regs 输出各个寄存器相关信息 

c089d22531c4468aa582680bc391a2d1.png

 

 

输出内存信息 

fcc54fd549e3482c9377dcab6459f314.png

75adb2bd982a4923a720314ccd7eb5b9.png

 

 

输出进程的相关信息 

只要是可以杀掉的进程 统统列出来, 根据这些信息已经可以大致计算出每一个进程的 得分情况了

aa10344810e646aaa8f64c2e9524b40b.png

 

 

输出要杀的进程的信息

40e5d83cf4ab4916b8b27749c51f99f7.png

 

 

 

 

 

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

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

相关文章

笨方法自学python(九)-读写文件

读取文件 前面已经学过了 input 和 argv,这些是你开始学习读取文件的必备基础。你可能需要多多实验才能明白它的工作原理,这节练习涉及到写两个文件。一个正常的 ex15.py 文件,另外一个是 ex15_sample.txt,第二个文件并不是脚本&…

图像锐化——非锐化掩膜USM和锐化掩膜SM(附代码)

非锐化掩膜 (USM) 和锐化掩膜 (SM) 都是常用的图像锐化技术。它们都可以通过增强图像的边缘信息来提高图像的清晰度。 目录 一、非锐化掩膜USM1.1 USM原理1.2 USM实现步骤1.3 优点1.4 代码 二、锐化掩膜SM2.1 SM原理2.2 SM实现步骤2.3 优点2.4 代码 三、锐化效果四、总结4.1 效…

Qt三方库:QuaZIP介绍、编译和使用

前言 Qt使用一些压缩解压功能,探讨过libzip库,zlib库,libzip库比较原始,还有其他库,都比较基础,而在基础库之上,又有高级封装库,Qt中的QuaZIP是一个很好的选择。Quazip是一个用于压缩…

5.11学习记录

20长安杯部分 检材 1 的操作系统版本 CentOS Linux 7.6.1810 (Core) 检材 1 中,操作系统的内核版本是 3.10.0-957.el7.x86_64 检材 1 中磁盘包含一个 LVM 逻辑卷,该 LVM 开始的逻辑区块地址(LBA)是 2099200 物理卷&#xff…

20240510每日后端---聊聊文件预览,doc,image,ppt转PDF预览

一、引入依赖 <dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>15.8</version></dependency><dependency><groupId>com.aspose</groupId><artifactId>crac…

(Mac)RocketMQ的本地安装测试(详细图示)

目录 部署服务 namesrv / broker下载解压缩运行 namesrvnohup ./bin/mqnamesrv & 启动命令详解运行 broker 测试收发消息运行自带的生产者测试类运行自带的消费者测试类 部署 Dashboard 可视化下载打包运行访问 部署服务 namesrv / broker 下载解压缩 官网下载 https://r…

mac苹果电脑卡顿反应慢如何解决?2024最新免费方法教程

苹果电脑以其稳定的性能、出色的设计和高效的操作系统&#xff0c;赢得了广大用户的喜爱。然而&#xff0c;随着时间的推移&#xff0c;一些用户会发现自己的苹果电脑开始出现卡顿、反应慢等问题。这不仅影响使用体验&#xff0c;还会影响工作效率。那么&#xff0c;面对这些问…

FPGA -手写异步FIFO

一&#xff0c;FIFO原理 FIFO&#xff08;First In First Out&#xff09;是一种先进先出的数据缓存器&#xff0c;没有外部读写地址线&#xff0c;使用起来非常简单&#xff0c;只能顺序写入数据&#xff0c;顺序的读出数据&#xff0c;其数据地址由内部读写指针自动加1完成&a…

win10无法被远程桌面连接,Win10系统无法被远程桌面连接的原因有哪些

win10无法被远程桌面连接&#xff0c;Win10系统无法被远程桌面连接的原因有哪些&#xff1f; 先&#xff0c;我们需要明确Win10系统无法被远程桌面连接的可能原因。其中&#xff0c;最常见的原因包括&#xff1a;远程桌面功能未启用、网络连接问题、防火墙或安全软件设置不当、…

哪个牌子的电视盒子好用?小编分享最新电视盒子排名

最近电视盒子是大家热议的话题&#xff0c;就目前来看它的地位依然无可替代&#xff0c;但许多朋友硬不知道哪个牌子的电视盒子好用&#xff0c;面对众多品牌和产品究竟要如何选择才是最好的呢&#xff1f;本期小编要分享最新发布的电视盒子排名&#xff0c;看看哪些电视盒子最…

C++ 抽象与封装

一 抽象 抽象实例&#xff1a;时钟 数据抽象&#xff1a; 具有表面当前时间的时、分、秒 行为抽象&#xff1a; 具有设置时间和显示时间两个最基本的功能。 抽象实例&#xff1a;人 数据抽象&#xff1a;姓名、年龄、性别等。 行为抽象&#xff1a; 生物属性&#xff1a;吃…

【线性代数】英语版听课笔记

线性代数 - 北京航天航空大学&#xff08;英文版&#xff09;_哔哩哔哩_bilibili 39.concept of vector space in this lecture we will studyvector space&#xff0c; the concept of basis dimension and coordinates 向量空间的维数&#xff1a;向量空间的基底所含向量的…

TCP超时重传机制

一、TCP超时重传机制简介 TCP超时重传机制是指当发送端发送数据后&#xff0c;如果在一定时间内未收到接收端的确认应答&#xff0c;则会认为数据丢失或损坏&#xff0c;从而触发重传机制。发送端会重新发送数据&#xff0c;并等待确认应答。如果在多次重传后仍未收到确认应答&…

车载测试__公司面试题(整理)

案例1&#xff1a; 镁佳 外包岚图汽车 车载测试 区域经理视频面试 1.首先自我介绍一下 2.项目是怎么测的举例说明 3.你是怎么看待加班的 4.你是怎么看待驻场单位 5.是否可以接受外派去做一段时间的技术支持&#xff0c;比如去襄阳&#xff0c;最长一个月。 6.多快能到…

Codigger:优化Vim编辑器的关键是可视化

Vim是一款高度灵活的文本编辑器&#xff0c;以其高效的快捷键和命令行界面而闻名。然而&#xff0c;对于一些初学者来说&#xff0c;Vim的复杂性和强大的功能可能会让他们感到困惑。为了使Vim更易于使用&#xff0c;Codigger引入可视化操作的概念&#xff0c;将原本抽象的、难以…

智慧公厕,运用数据提升公共厕所管理水平!

随着城市人口的增加和生活水平的提高&#xff0c;公共厕所的管理变得越来越重要。传统的厕所管理方式已经无法满足人们对卫生、便利和舒适的需求。而智慧公厕作为新一代公厕管理方式&#xff0c;通过运用数据技术和大数据分析手段&#xff0c;彻底改变了公厕管理的模式&#xf…

C++对象的赋值

同类的对象之间可以互相赋值&#xff0c;即一个对象的值可以赋值给另一个对象。对象之间的赋值通过“”进行。默认就是把一个对象所有非static数据成员的值依次赋值给另一个对象。 对象赋值的一般形式为&#xff1a; 对象名1 对象名2; 注意:对象名1和对象名2必须是属于同一个…

flutter开发实战-GetX响应式状态管理使用

flutter开发实战-GetX响应式状态管理使用 GetX是一个简单的响应式状态管理解决方案。GetX是Flutter的一款超轻、功能强大的解决方案。它将高性能状态管理、智能依赖注入和路由管理快速而实用地结合在一起。这里简单使用一下GetX 一、引入GetX 在工程的pubspec.yaml中引入插件…

信息系统架构模型_1.单机应用模式和客户机/服务器模式

1.单机应用模式&#xff08;Standalone&#xff09; 单机应用系统是最简单的软件结构&#xff0c;是指运行在一台物理机器上的独立应用程序。这些软件系统&#xff0c;从今天的软件架构上来讲&#xff0c;是很简单&#xff0c;是标准的单机系统。当然至今&#xff0c;这种复杂的…

电路板维修【二】

【维修一个65W的氮化镓快充头&#xff0c;摔地上就没输出了&#xff0c;看下怎么回事】&#xff1a;https://www.bilibili.com/video/BV1vG411Q7MDvd_source3cc3c07b09206097d0d8b0aefdf07958 对于某些电器&#xff0c;维修之前需要先测量主滤波电容上面有没有存电&#xff0c…