Cgroup-memory子系统分析(2)_cgroup out of memory-程序员宅基地

技术标签: kernel  cgroup  docker  

1.1      Oom

1.1.1      简介

Oom的全称是out-of-memory,是内核在处理系统内存不足而又回收无果的情况下采取的一种措施,内核会经过选择杀死一些进程,以释放一些内存,满足当前内存申请的需求。所以oom是一种系统行为,对应到memcg的oom,其原理和动机跟全局oom是一样的,区别只在于对象的不同,全局oom的对象是整个系统中所有进程,而memcg oom只针对memcg中的进程(如果使能了hierarchy,还包括所有子memcg中的进程),这里的对象主要是指oom时内核选择从哪些进程中杀死一些进程,所以memcg的oom只可能杀死属于该memcg的进程。

1.1.2      实现

跟全局oom一样,memcg的oom也分成select_bad_process和oom_kill_process两个过程:

a.     select_bad_process找出该memcg下最该被kill的进程(如果memcg设置了hierarchy,也会考虑子memcg下的进程);

b.    oom_kill_process杀掉选中的进程及与其共用mm的进程(杀进程的目的是释放内存,所以当然要把mm的所有引用都干掉);

对于实现的代码细节,不同的版本代码演进较快,之前memcg中会直接调用内核的select_bad_process和oom_kill_process,在最新的3.10中,memcg实现了自己的select_bad_process,即在memcg的代码中自己来找到要杀死的进程。虽然函数调用不同,但是找到要杀死的进程的原理都是类似的,select的过程会给memcg(或及其子memcg)下的每个进程打一个分,得分最高者被选中。评分因素每个版本不尽相同,主要会考虑以下因素:

a.     进程拥有page和swap entry越多,分得越高;

b.    可以通过/proc/$pid/oom_score_adj进行一些分值干预;

c.     拥有CAP_SYS_ADMIN的root进程分值会被调低;

 

kill的过程比较简单,简单的说就是向要杀死的进程发送SIGKILL信号,但其中依然有一些细节:

a.     如果被选中的进程有一些子进程跟他不共用同一个mm,并且也是可以被杀死的,那么就挑选这些子进程中badness得分最高的一个来代替父进程被杀死,这样是为了确保我们在释放内存的同时失去更少的东西;

b.    上面已经说了,oom_kill的过程会杀死选中的进程及与其共用mm的进程,所以会遍历所有用户态进程,找到并杀死与选中进程共用同一个mm的进程;

c.     遍历进程的过程中,会过滤掉通过/proc/$pid/oom_score_adj干预的不可被oom_kill掉的进程(目前是设置为OOM_SCORE_ADJ_MIN的进程);

 

在oom的过程中,另外值得一说的是其中的同步过程。

oom过程会向选中的进程发送SIGKILL信号,但是距离进程处理信号、释放空间,还是需要经历一定时间的。如果系统负载较高,则这段时间内很可能有其他上下文也需要却得不到page,而触发新的oom。那么如果大量oom在短时间内爆发,可能会大面积杀死系统中的进程,带来一场浩劫。

所以oom过程需要同步:在给选中的进程发送SIGKILL后,会设置其TIF_MEMDIE标记。而在select被杀死进程的过程中如果发现记有TIF_MEMDIE的进程,则终止当前的oom过程,并等待上一个oom过程结束。这样做可以避免oom时大面积的kill进程。

而在进程退出时,会先将task->mm置为NULL,再mmput(mm)释放掉引用计数,从而导致内存空间被释放(如果引用计数减为0的话)。所以,只要task->mm被置为NULL(内存即将开始释放),就没人认得它是属于哪个memcg的了&#

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tanzhe2017/article/details/81001531

智能推荐

顺序表基本练习-初始化、插入和输出_第一关:需要编写顺序表的初始化、插入相关操作来完成顺序表的建表操作;编写输出函-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏5次。【问题描述】实现可变长顺序表的建表过程。任务要求:通过顺序表的初始化、插入算法,实现顺序表的建表,并依次输出顺序表元素。_第一关:需要编写顺序表的初始化、插入相关操作来完成顺序表的建表操作;编写输出函

MySQL统计数量以及百分比_mysql 百分比-程序员宅基地

文章浏览阅读2.2k次。COUNT(*) 计算表中总的行数,无论某列有数值或者为空值。COUNT(字段名)计算指定列下总的行数,计算时将忽略空值的行。返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。round(x,d) -- x指要处理的数,d是指保留几位小数round(x,d) -- 同round(x,0),即不保存小数。_mysql 百分比

python uWSGI 框架运行 Django项目的坑_harakiri !!! worker 1 status !!!-程序员宅基地

文章浏览阅读3k次。执行以下命令 (运行uWSGI 框架命令) uwsgi --http 127.0.0.1:8000 --module /home/ubuntu/webapps/.env/hello/hello/wsgi --virtualenv /home/ubuntu/webapps/.env/--module 指的是Django 项目根目录下的 wsgi.py文件--virtualenv 创建的虚拟环境根目录遇到以下错误ModuleNotFoundError: No modnamed encodin_harakiri !!! worker 1 status !!!

HSSFWorkbook 与 XSSFWorkbook-程序员宅基地

文章浏览阅读1.6w次,点赞3次,收藏9次。刚开始使用new HSSFWorkbook(new FileInputStream(excelFile))来读取Workbook,对Excel2003以前(包括2003)的版本没有问题,但读取Excel2007时发生如下异常:org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be..._hssfworkbook和xssfworkbook

Linux 学习笔记-程序员宅基地

文章浏览阅读650次。1. 常用命令命令存放,哪些命令可以执行?root:/sbin/usr/sbinall users:/bin/usr/binbin--binary二进制文件Linux所有都是文件,都是二进制文件usr—usersbin—super binary1.1文件处理命令文...

linux笔记本没有串口,用笔记本在linux下进行串口编程-程序员宅基地

文章浏览阅读205次。由于用的是本本(无串口),之前看了别的minicom配置,怎么都不对,后来参考了一篇文章,这下我的本本也可以在linux下进行开发啦。执行下面命令aiklo@aiklo-laptop:~$ dmesg | grep usb[ 24.855373] usbcore: registered new interface driver usbfs[ 24.855399] usbcore: regi..._linux可以不通过串口工具自行运行脚本并存储吗

随便推点

Java 泛型中的PECS原则-程序员宅基地

文章浏览阅读113次。在泛型编程时,使用部分限定的形参时,<? super T>和<? extends T>的使用场景容易混淆,PECS原则可以帮助我们很好记住它们:生产者(Producer)使用extends,消费者(Consumer)使用super。留下一段代码加深印象(来自JDK 8 Collections.copy()源码)/** * Copies al..._pesc原则csdn

[逆向] x64dbg / od 设置消息断点_x64dbg 怎么下api断点-程序员宅基地

文章浏览阅读2.7k次。背景很多时候在我们不知道目标程序调用了哪些 api 时,需要使用消息断点粗略的定位关键代码位置。比如在游戏里点击一次鼠标,可以根据这个消息向下跟踪点击完鼠标后游戏执行的逻辑。方法一个简单的消息循环是这样的 :while( GetMessage(&msg,NULL,0,0) ) { TranslateMessage(&msg); //将 WM_XXXKEYXXX 消息翻译为 WM_CHAR 消息 DispatchMessage(&_x64dbg 怎么下api断点

AI大语言模型在政务与公共服务中的应用-程序员宅基地

文章浏览阅读23次。1. 背景介绍1.1 人工智能的发展随着计算机技术的飞速发展,人工智能(Artificial Intelligence,AI)已经成为了当今科技领域的热门话题。从早期的图灵测试到现在的深度学习和神经网络,人工智能已经取得了令人瞩目的成就。特别是近年来,大数据、云计算、高性能计算等技术的发展为人工智

力扣 最长有效括号_力扣最长有效括号-程序员宅基地

文章浏览阅读104次。// 有效括号的最长长度 // 子串问题:严格以每个结尾计算个答案,最终答案必在其中 public static int longestValidParentheses(String s) { if (s == null || s.length() < 2) return 0; int[] dp = new int[s.length()]; // dp[i]:严格以i位置结尾,形成的有效括号子串最长长度是多少 int max = 0;._力扣最长有效括号

使用arm-eabi-addr2line工具跟踪Android调用堆栈-程序员宅基地

文章浏览阅读1k次。使用arm-eabi-addr2line工具跟踪Android调用堆栈作者:liangshengyang转自:http://www.linuxidc.com/Linux/2011-01/31803.htm在通常的C/C++代码中,可以通过响应对内存操作不当引起的Segmentation Fault错误即信号SIGSEGV(11)做出响应处理。只要在程序中设置SIGSEGV的hand_arm-eabi-addr2line

使用yarn代替npm构建Vue项目_yarn vue-程序员宅基地

文章浏览阅读2.5w次,点赞8次,收藏57次。看到这个标题的时候,相信有些小伙伴会带有疑问,为什么明明可以使用npm来构建vue项目,现在却偏偏要使用yarn呢?最简单最直接的原因是因为它快!并且要比你用npm快很多!如果你想了解的更全面,我们来看yarn官方给出的解释Yarn 是一个依赖管理工具。它能够管理你的代码,并与全世界的开发者分享代码。Yarn 是高效、安全和可靠的,你完全可以安心使用。Yarn 能够让你使用其他开发者开..._yarn vue