Linux CGroup之freezer分析与应用
Linux Kernel:4.4.17
CGroup的freezer子系统对于成批作业管理系统很有用,可以成批启动/停止任务,以达到及其资源的调度。
freezer子系统也有助于针对运行一组任务设置检查点。通过强制一组任务进入静默状态(quiescent state),freezer子系统可以获得任务的镜像。如果任务处于静默状态,其他任务就可以查看其proc或者读取内核接口来获取信息。通过收集必要信息到另一个node,然后在新node重启任务,被检查的任务可以在cluster中不同node之间迁移。
freezer是按等级划分的,冻结一个CGroup会冻结旗下的所有任务,并且包括他的所有子CGroup。每个freezer都有自己的状态和从父集成的状态。只有父子状态都为THAWED的时候,当前的CGroup才是THAWED。
代码解析
freezer的代码位于kernel/cgroup_freezer.c中,执行freeze的具体函数位于kernel/freezer.c中。
freezer_cgrp_subsys结构体如下:
|
struct cgroup_subsys freezer_cgrp_subsys = { |
freezer子系统用来管理CGroup的结构体如下,只有一个参数state:
|
struct freezer { |
freezer的sysfs文件节点:
|
static struct cftype files[] = { |
继续引申出freezer的状态:
|
enum freezer_state_flags { /* mask for all FREEZING flags */ |
freezer.state
那么这些状态和freezer.state的对应关系如何呢?
CGROUP_FREEZING FREEZING (冻结中)
CGROUP_FROZEN FROZEN(已冻结)
CGROUP_FREEZER_ONLINE THAWED(解冻状态)
FREEZING不是一个常态,他是当前CGroup(或其子CGroup)一组任务将要转换到FROZEN状态的一种中间状态。同时,如果当前或子CGroup有新任务加入,状态会从FROZEN返回到FRZEEING,直到任务被冻结。
只有FROZEN和THAWED两个状态是写有效的。如果写入FROZEN,当CGroup没有完全进入冻结状态,包括其所有子CGroup都会进入FREEZING状态。
如果写入THAWED,当前的CGroup状态就会变成THAWED。有一种例外是如果父CGroup还是被冻结,则不会变成THAWED。如果一个CGroup的有效状态变成THAWED,因当前CGroup造成的冻结都会停止,并离开冻结状态。
freezer.self_freezing
只读。0表示状态是THAWED,其他为1。
freezer.parent_freezing
只读。0表示父CGroup没有一个进入冻结状态,其他为1。
freezer_read
此函数会从子CGroup向上遍历所有CGroup,直到最后一个遍历当前CGroup。
|
static int freezer_read(struct seq_file *m, void *v) mutex_lock(&freezer_mutex); /* update states bottom-up */ update_if_frozen(pos); 更新当前css的state,这样确保当前css状态是最新的。然后根css的状态也是最新的。 rcu_read_lock(); rcu_read_unlock(); seq_puts(m, freezer_state_strs(css_freezer(css)->state)); |
freezer_write
|
static ssize_t freezer_write(struct kernfs_open_file *of, buf = strstrip(buf); if (strcmp(buf, freezer_state_strs(0)) == 0) 对应THAWED状态 freezer_change_state(css_freezer(of_css(of)), freeze); 切换freezer状态 |
freezer_change_state
|
static void freezer_change_state(struct freezer *freezer, bool freeze) /* if (!css_tryget_online(pos)) if (pos_f == freezer) 如果是根css则进入CGROUP_FREEZING_SELF rcu_read_lock(); |
freezer_apply_state
|
static void freezer_apply_state(struct freezer *freezer, bool freeze, if (!(freezer->state & CGROUP_FREEZER_ONLINE)) if (freeze) { 需要freeze,调用freeze_cgroup。冻结当前Cgroup下面所有task freezer->state &= ~state; if (!(freezer->state & CGROUP_FREEZING)) { 并且不是CGROUP_FREEZING状态 |
freeze_task和__thaw_task
在kernel/freezer.c中定义了冻结和解冻task的执行函数freeze_task和__thaw_task。
在freezer的tasks中存放了所有的进程,遍历所有进程执行freeze_task或者__thaw_task,即可冻结或解冻此freezer CGroup。
|
bool freeze_task(struct task_struct *p) /* spin_lock_irqsave(&freezer_lock, flags); if (!(p->flags & PF_KTHREAD)) spin_unlock_irqrestore(&freezer_lock, flags); |
|
void __thaw_task(struct task_struct *p) spin_lock_irqsave(&freezer_lock, flags); |
应用?
一个小实验
为了直观的理解,做一个小实验。
源码在:https://github.com/arnoldlu/common-use/blob/master/tools/loop.py
1.启动一个占用率100%的进程:

2.top查看进程情况,CPU占用率100%:

3.新建一个freezer CGroup,并将7234进程写入tasks:

4.将FROZEN写入freezer.state:

5.top –p 7234查看进程情况,:

6.将THAWED写入freezer.state之后:

7.可以看到7234的CPU占用率立马又变成100%:

其他应用
比如LISA工具在测试的时候,为了排除干扰,只保留必须的进程,冻结其余进程:

参考资料
Freezer Subsystem:http://lxr.free-electrons.com/source/Documentation/cgroups/freezer-subsystem.txt?v=4.4
freezer子系统:http://www.cnblogs.com/lisperl/archive/2012/04/25/2469587.html
Linux CGroup之freezer分析与应用的更多相关文章
- [转载] linux cgroup
原文: http://coolshell.cn/articles/17049.html 感谢左耳朵耗子的精彩文章. 前面,我们介绍了Linux Namespace,但是Namespace解决的问题主要 ...
- Docker基础技术:Linux CGroup
前面,我们介绍了Linux Namespace,但是Namespace解决的问题主要是环境隔离的问题,这只是虚拟化中最最基础的一步,我们还需要解决对计算机资源使用上的隔离.也就是说,虽然你通过Name ...
- Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7)
http://blog.chinaunix.net/uid-20543672-id-3157283.html Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3 ...
- linux内存源码分析 - 内存压缩(实现流程)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 本文章最好结合linux内存管理源码分析 - 页框分配器与linux内存源码分析 -伙伴系统(初始化和申请 ...
- linux内存源码分析 - SLUB分配器概述
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ SLUB和SLAB的区别 首先为什么要说slub分配器,内核里小内存分配一共有三种,SLAB/SLUB/SLOB ...
- Linux CGroup
catalog . 引言 . Cgroup安装配置 . Cgroup使用方式 . CGroup的子系统 1. 引言 我们已经讨论了Linux下命名空间(Namespace)的基本知识,详情请参阅另一篇 ...
- Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)【转】
原文地址:Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://bl ...
- LINUX CGROUP总结
简介: Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU.内存.磁盘输入输出等).这个项目最早是由Go ...
- Linux Cgroup 入门教程:cpuset
这是 Cgroup 系列的第四篇,往期回顾: Linux Cgroup 入门教程:基本概念 Linux Cgroup 入门教程:CPU Linux Cgroup 入门教程:内存 通过上篇文章的学习,我 ...
随机推荐
- Winform简单调用WebApi
WebAPI Controllers public class SimuController : ApiController { //EF 5 BIM_GENERALDICTONARY_DBEnti ...
- 继续上篇抢QQ口令红包,抢那招抢不了的红包技巧
- - - - - - - - - - -- - - --长按红包,出现回复,点击回复,那回复里有个表情,直接输入那个表情回复就可以抢了 - - - - - - - - --------------- ...
- Delphi_09_Delphi_Object_Pascal_面向对象编程
今天这里讨论一下Delphi中的面向对象编程,这里不做过多过细的讨论,主要做提纲挈领的描述,帮助自己抓做重点. 本随笔分为两部分: 一.面向对象编程 二.面向对象编程详细描述 ------------ ...
- CSS3鼠标滑过图标放大以及旋转
本人是HTML5-CSS3初学者,这次分享一款纯CSS3实现的图片动画,当鼠标滑过小图标时,图标会放大,同时图标会出现旋转的动画效果.我们在很多个性化个人博客中经常看到鼠标滑过人物头像后头像图片旋转就 ...
- Access提示“操作必须使用一个可更新的查询”的解决办法
问题:软件工程师开发了一个asp.net+access网站,本地调试增.删.改和查都没有异常.部署到服务器windows2008 R2的IIS上运行后,查询没有异常.可是在修改操作提交时,产生异常:提 ...
- 新手入门Underscore.js 中文(template)
Underscore.js是一个很精干的库,压缩后只有4KB.它提供了几十种函数式编程的方法,弥补了标准库的不足,大大方便了javaScript的编程.MVC框架Backbone.js就将这个库作为自 ...
- node.js express安装及示例网站搭建
1.首先肯定是要安装Node.JS windows cmd依次输入如下命令: cd C:\Program Files\nodejs\ npm install -g expressnpm install ...
- Java输入输出常用类Scanner
Scaner类,使用获取键盘输入. public boolean DemoTest(){ Scanner input = new Scanner(System.in); System.out.prin ...
- 我厂 WiFi SDK 开源了, 直接开源 WiFi 万能钥匙核心功能,造福中小开发者
官方地址: http://global.18wifibank.com/ github: https://github.com/yibawifi/wifisdk
- IOS 杂笔-15(知识小点 readonly)
readonly是我们并不陌生的属性. 但是他也有值得我们注意的地. 属性如其名-只读-也就是说我们只能读取-不能进行写操作 当我们尝试进行写操作时会如下 但是这并不意味着我们不可以改变其内部的属性 ...