Mem Cgroup目录无法清理问题分析
http://blogs.360.cn/360xitong/2013/05/02/mem-cgroup%E7%9B%AE%E5%BD%95%E6%97%A0%E6%B3%95%E6%B8%85%E7%90%86%E9%97%AE%E9%A2%98%E5%88%86%E6%9E%90/
Cgroup(Control Group)是内核提供的资源隔离的技术,用于对Linux 系统中用户态进程使用的资源进行隔离,核心思想是:把进程分组,然后为进程组分配资源(包括内存、CPU、IO等)。其中Mem Cgroup用来隔离进程组使用的内存资源。
在Hadoop集群中,我们使用了Mem Cgroup对MapReduce任务使用的内存资源进行隔离控制,以保证单个任务不能占用太大的内存,进而保证整个系统的稳定性。同时我们配置了release_agent,用于在mem cgroup中的所有进程退出后清理相关的资源。
但Mem Cgroup在Hadoop集群上线后,经常会出现某个Mem Cgroup中的进程已经全部退出,但对应的Cgroup目录清理不掉的现象。查看Cgroup的状态,有如下现象:
[root@]# cat /cgroup/memory/test/tasks
[root@]# cat /cgroup/memory/test/memory.usage_in_bytes
90112
该cgroup的所有进程确实都已经退出了,但还是存在部分内存处于被使用状态,这是神马情况,下意识地想到,难道是Page Cache,果断验证下:
echo 3 > /proc/sys/vm/drop_caches
刷掉Page Cache之后,残留的cgroup目录竟然成功被清理了, 那基本断定是Page Cache的影响了,后面就得分析下代码,研究下其中的原理了。
经过几天的分析,终于把Mem Cgroup的基本原理搞明白了。
在Linux内核中,每个Mem Cgroup都对应一个mem_cgroup结构,该结构的的核心是res_counter,记录了资源使用情况和资源限制,每个mem cgroup对象都包含一个与之关联的res_counter。
Linux内核管理内核的基本单位是页面,采用page结构管理,一个物理页框对应着一个page结构,与此同时,新增了一个page_cgroup结构,用来关联page和mem_cgroup,这样给定任何一个页面,都可以找到对应的mem_cgroup。另外,每个进程都有一个mm_struct结构来管理进程的内存信息。每个mm_struct知道自己属于的进程,进而可以知道进程所属的mem_cgroup。
用户进程物理内存的分配基本都是通过page_fault来实现,现在来看下这个过程中是如何实现mem cgroup相关功能的,page_fault的大体流程如下:
1、 根据current进程找到对应的mm_struct结构
2、 分配需要的page页面
3、 调用mem_cgroup_newpage_charge:该函数根据mm struct查找到对应的mem_cgroup,然后 判断下当前mem_cgroup是否已经超过限制,如果没有,则把新分配page对应page_cgroup指向该mem_cgroup,并更新资源使用计数。如果已经超过了限制,则进行oom相关的处理。
现在来考虑下Page cache,这些内存是系统级的,可以被所有进程使用,那这些内存的使用算在哪个进程的头上呢?mem cgroup采用的是first touch的原则,就是说哪个进程把page cache页面“带进”内存,这个页面就算在谁的头上。
大致了解了Mem cgroup的原理,回到一开始的问题,虽然mem cgroup中的进程都已经退出了,但是这些进程使用的page cache仍然计算在这个mem cgroup中,导致mem cgroup一直被引用,因此mem cgroup清理不掉,刷掉page cache后,mem cgroup就没有被引用了,也就可以清理了。
针对该问题,我们在内核新增加了一个page cache的使用计算选择:把page cache全部算入默认的根mem cgroup。这样做的另外一个好处是,mem cgroup只记录进程本身利用的物理内存,更直观可控。同时page cache是可回收的,如果某个mem cgroup中的进程产生大量的page cache时,其他mem cgroup进程的内存基本不受影响,可能的坏处是影响其他mem cgroup内存分配的效率。
Mem Cgroup目录无法清理问题分析的更多相关文章
- CentOS7的/tmp目录自动清理规则
CentOS6以下系统(含)使用watchtmp + cron来实现定时清理临时文件的效果,这点在CentOS7发生了变化. 在CentOS7下,系统使用systemd管理易变与临时文件,与之相关的系 ...
- CentOS7的/tmp目录自动清理规则(转)
CentOS7的/tmp目录自动清理规则 CentOS6以下系统(含)使用watchtmp + cron来实现定时清理临时文件的效果,这点在CentOS7发生了变化,在CentOS7下,系统使用sys ...
- Linux下关于/tmp目录的清理规则
本文将介绍Linux下/tmp目录的清理规则,rhel6和rhel7将以完全不同的两种方式进行清理. RHEL6 tmpwatch命令 tmpwatch 是专门用于解决“删除 xxx天没有被访问/修改 ...
- Uboot优美代码赏析1:目录结构和malkefile分析
Uboot优美代码赏析1:目录结构和malkefile分析 关于Uboot自己选的版本是目前最新的2011.06,官方网址为:http://www.denx.de/wiki/U-Boot/WebHom ...
- Linux tmp目录自动清理总结
在Linux系统中/tmp文件夹下的文件是会被清理.删除的,文件清理的规则是如何设定的呢? 以Redhat为例,这个主要是因为作业里面会调用tmpwatch命令删除那些一段时间没有访问的文件. 那么什 ...
- Confluence 6 连接到外部用户目录服务器的问题分析
在有关外部目录服务器配置页面中有一个测试配置(Test Settings)按钮.这个功能将会帮助你分析你的用户管理在 Active Directory 和其他 LDAP 服务器中出现的问题. 希望对你 ...
- 关于/tmp/ 目录自动清理文件
问题:今天开发人员给我说了一个错误:The temporary upload location [/tmp/tomcat.1337767218595042057.80/work/Tomcat/loca ...
- linux /boot目录下的文件分析
一. Linux 启动流程 首先说一下Linux系统大概的启动过程: 1. 主机加电后, 系统首先加载BIOS, 这个BIOS是以写在主板上的. 2. BIOS启动后,执行一些例如开机自检,硬件初始化 ...
- kolla base目录下Dockerfile.j2分析
这几天在研究kolla制作镜像的流程,记录下对kolla项目中base目录Dockerfile.j2阅读过程.本质上base目录下的Dockerfile.j2文件,对是yum 源的一些配置,从而使制作 ...
随机推荐
- HDU4276 The Ghost Blows Light SPFA&&树dp
题目的介绍以及思路完全参考了下面的博客:http://blog.csdn.net/acm_cxlove/article/details/7964739 做这道题主要是为了加强自己对SPFA的代码的训练 ...
- POJ 3104
Drying Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7959 Accepted: 2014 Descriptio ...
- C# 使用TimeSpan计算两个时间差
转载:http://www.cnblogs.com/wifi/articles/2439916.html 可以加两个日期之间任何一个时间单位. private string DateDiff(Date ...
- java基础知识回顾之javaIO类---FileWriter和FileReader
FileWriter类的构造方法定义如下: 1.public FileWriter(File file)throws IOException 字符流的操作比字节流操作好在一点,就是可以直接输出字符串了 ...
- POJ 2948 Martian Mining(DP)
题目链接 题意 : n×m的矩阵,每个格子中有两种矿石,第一种矿石的的收集站在最北,第二种矿石的收集站在最西,需要在格子上安装南向北的或东向西的传送带,但是每个格子中只能装一种传送带,求最多能采多少矿 ...
- C#实现身份证号码验证的方法
本文实例讲述了C#实现身份证号码验证的方法.分享给大家供大家参考.具体实现方法如下: 随着现在互联网的发展,越来越多的注册用户的地方都用到了身份证,那么对于输入的身份证如何验证呢?看下面的代码,其实很 ...
- lintcode 中等题:N Queens II N皇后问题 II
题目: N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 解题: 和上一题差不多,这里只是求数量,这个题目定义全局变量,递 ...
- spring 定时任务的 执行时间设置规则(转)
spring 定时任务的 执行时间设置规则 单纯针对时间的设置规则org.springframework.scheduling.quartz.CronTriggerBean允许你更精确地控制任务的运 ...
- Hibernate 主键策略
Hibernate主键生成策略 .自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL ...
- Intellij IDEA 创建消息驱动Bean - 接收JMS消息
除了同步方式的调用之外,有时还需要异步调用,用来处理不需要即时处理的信息,例如短信.邮件等,这需要使用EJB中的独特组件——消息驱动Bean(Message-Driven Bean,MDB),它提供了 ...