近几年,以docker为代表的容器技术异常火热,它的轻量、高效让人欣喜若狂,它被赋予了改变传统IT运维的使命。相信随着时间推移,以容器云为落地形式的产品将真正实现这一使命。

  我们都知道docker能够实现资源的隔离和控制,正当打算引入docker来管理产品不同业务的资源占用时,发现它的隔离性是我们所不需要的,而我们都知道,docker底层实际上是利用了linux内核提供的namespace和cgroup机制,而前者是用于资源隔离的,后者是用于资源控制的。这时,我们想到了直接用cgroup来实现。下面先谈谈什么是cgroup,接着讲解如何使用cgroup来轻松实现对系统资源的管控:

首先,什么是cgroup:

cgroup是Linux内核提供的一种机制,这种机制可以根据特定的行为,把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。cgroups可以限制、记录、隔离进程组所使用的物理资源(包括:CPU、memory、IO等),为容器实现虚拟化提供了基本保证,是构建Docker等一系列虚拟化管理工具的基石。

cgroup提供了哪些功能:

1、资源限制(Resource Limitation):cgroups可以对进程组使用的资源总额进行限制。如设定应用运行时使用内存的上限,一旦超过这个配额就发出OOM(Out of Memory)。

2、优先级分配(Prioritization):通过分配的CPU时间片数量及硬盘IO带宽大小,实际上就相当于控制了进程运行的优先级。

3、资源统计(Accounting): cgroups可以统计系统的资源使用量,如CPU使用时长、内存用量等等,这个功能非常适用于计费。

4、进程控制(Control):cgroups可以对进程组执行挂起、恢复等操作。

对开发者来说,cgroup有哪些有趣的特点:

1、cgroups的API以一个伪文件系统的方式实现,即用户可以通过文件操作实现cgroups的组织管理。

2、cgroups的组织管理操作单元可以细粒度到线程级别,用户态代码也可以针对系统分配的资源创建和销毁cgroups,从而实现资源再分配和管理。

3、所有资源管理的功能都以“subsystem(子系统)”的方式实现,接口统一。

4、子进程创建之初与其父进程处于同一个cgroups的控制组。

本质上,cgroups是内核附加在程序上的一系列钩子(hooks),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。

好了,下面到主题了,cgroup有这么一些特性,怎么用起来呢,下面分步骤简要描述整个过程:

1、更新linux内核,加入对cgroup机制的支持

2、安装libcgroup,libcgroup是一个开源cgroup工具包,利用它可以更方便使用cgroup特性

1)解压上面的压缩包

2)设置ac_default_prefix指定安装路径,接着执行./configure

3)make clean;make

4)make install

5)拷贝安装文件、脚本、配置到设备上,其中部分启动脚本,包括cgconfig、cgred存在于samples目录下

6)修改/etc/init.d/cgconfig、/etc/init.d/cgred等脚本运行出错问题

3、启动cgconfig、cgred守护服务

1)配置/etc/cgconfig.conf、/etc/cgrules.conf

#######/etc/cgconfig.conf(供cgconfig加载,用于mount挂载成cgroup文件系统)#######

#cgconfigparser -l cgconfig.conf

mount {

cpu = /sys/fs/cgroup;

memory = /sys/fs/cgroup;

cpuset = /sys/fs/cgroup;

cpuacct = /sys/fs/cgroup;

devices = /sys/fs/cgroup;

freezer = /sys/fs/cgroup;

blkio = /sys/fs/cgroup;

hugetlb = /sys/fs/cgroup;

}

group cgroup1{

perm{

admin{

uid=root;

gid=root;

}

task{

uid=root;

gid=root;

}

}

cpuset{

cpuset.cpus=2;

cpuset.mems=0;

}

cpu{

cpu.shares=1024;

}

memory{

memory.limit_in_bytes=40M;

}

blkio{

blkio.weight=1000;

}

}

group cgroup2{

perm{

admin{

uid=root;

gid=root;

}

task{

uid=root;

gid=root;

}

}

cpuset{

cpuset.cpus=2;

cpuset.mems=0;

}

cpu{

cpu.shares=512;

}

memory{

memory.limit_in_bytes=40M;

}

blkio{

blkio.weight=1000;

}

}

#########/etc/cgrules.conf(供cgred加载,用于控制不同名字进程加入指定cgroup,怎么样,这个是不是很叼!)########

#<user>   <controllers>   <destination>

#

#john          cpu usergroup/faculty/john/

#john:cp       cpu usergroup/faculty/john/cp

#@student      cpu,memory usergroup/student/

*:test_cpu1.sh       *        cgroup1  #模拟测试cpu资源分配有效性

*:test_mem1.sh       *        cgroup1  #模拟测试内存资源分配有效性

*:test_blk1.sh       *        cgroup1  #模拟测试io资源分配有效性

*:test_cpuset.sh    *        cgroup1  #模拟测试cpu core分配有效性

*:test_blk2.sh       *        cgroup2  #模拟测试io资源分配有效性

*:test_cpu2.sh       *        cgroup2  #模拟测试cpu资源分配有效性

*:test_mem2.sh       *        cgroup2  #模拟测试内存资源分配有效性

2)使用/etc/init.d/cgconfig start、/etc/init.d/cgred start启动服务

3)启动成功之后可以使用多个命令查看cgroup信息,如lscgroup/lssubsys/cgget/等

4、到这里,就已经完成了基本环境的搭建,下一步就可以通过脚本模拟各种资源占用(包括cpu/内存/io/cpu core等)来测试cgroup

对应子系统有效性了

由于时间关系这里就先不描述具体的测试过程了,可以自行摸索下,有疑问可以留言

http://www.infoq.com/cn/articles/docker-kernel-knowledge-cgroups-resource-isolation/
http://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html#ibm-pcon

libcgroup:
http://libcg.sourceforge.net/html/index.html

libcgroup使用:
http://www.jianshu.com/p/dc3140699e79
https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/
http://www.elmerzhang.com/2012/12/28/cgroups-learning-6-blkio-subsystem/

内核读写文件过程分析:
http://oenhan.com/linux-kernel-write
mmap和direct io区别:
http://www.cnblogs.com/zhaoyl/p/5901680.html

利用内核cgroup机制轻松实现类似docker的系统资源管控的更多相关文章

  1. Docker资源管理探秘:Docker背后的内核Cgroups机制

    http://www.infoq.com/cn/articles/docker-resource-management-cgroups 随着Docker技术被越来越多的个人.企业所接受,其用途也越来越 ...

  2. Linux内核同步机制--转发自蜗窝科技

    Linux内核同步机制之(一):原子操作 http://www.wowotech.net/linux_kenrel/atomic.html 一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个 ...

  3. Linux内核OOM机制的详细分析【转】

    本文转载自:http://blog.csdn.net/liukuan73/article/details/43238623 Linux内核根据应用程序的要求分配内存,通常来说应用程序分配了内存但是并没 ...

  4. 锁相关知识 & mutex怎么实现的 & spinlock怎么用的 & 怎样避免死锁 & 内核同步机制 & 读写锁

    spinlock在上一篇文章有提到:http://www.cnblogs.com/charlesblc/p/6254437.html  通过锁数据总线来实现. 而看了这篇文章说明:mutex内部也用到 ...

  5. Linux内核同步机制

    http://blog.csdn.net/bullbat/article/details/7376424 Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环 ...

  6. Linux内核OOM机制的详细分析(转)

    Linux 内核 有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了 防止内存耗尽而内核会把该进程杀掉.典 ...

  7. Linux 内核同步机制

        本文将就自己对内核同步机制的一些简要理解,做出一份自己的总结文档.     Linux内部,为了提供对共享资源的互斥访问,提供了一系列的方法,下面简要的一一介绍. Technorati 标签: ...

  8. Linux内核OOM机制的详细分析

    Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉.典型的 ...

  9. 利用linux信号机制调试段错误(Segment fault)

    在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过 ...

随机推荐

  1. XHTML 是以 XML 格式编写的 HTML

    什么是 XHTML? XHTML 指的是可扩展超文本标记语言 XHTML 与 HTML 4.01 几乎是相同的 XHTML 是更严格更纯净的 HTML 版本 XHTML 是以 XML 应用的方式定义的 ...

  2. Postman编程

    Postman常用Api Postman像jmeter一样提供前置处理脚本和后置处理脚本.脚本主要使用JavaScript语法,并内置提供了一些js代码库,提供了一些内置对象和方法. 参考:https ...

  3. 照片提取GPS 转成百度地图坐标

    感谢: 小慧only http://www.cnblogs.com/zhaohuionly/p/3142623.html  GPS转化坐标方法 大胡子青松 http://www.cnblogs.com ...

  4. easyui datagrid的json格式

    easyui datagrid的json格式: {"columns":[[{"field":"one","title": ...

  5. iOS之内存分析

    静态内存分析(Product->Analyze) 静态内存分析是不运行程序,直接对代码进行分析. 但是没有真正分配内存,根据代码的上下文的语法结构,来分析是否有内存泄露 缺点:不一定准确,但是如 ...

  6. 在C语言中以编程的方式获取函数名

    仅仅为了获取函数名,就在函数体中嵌入硬编码的字符串,这种方法单调乏味还易导致错误,不如看一下怎样使用新的C99特性,在程序运行时获取函数名吧. 对象反射库.调试工具及代码分析器,经常会需要在运行时访问 ...

  7. [转载]【虚拟化系列】VMware vSphere 5.1 网络管理

    转载自:http://mabofeng.blog.51cto.com/2661587/1020375 网络是VMware vSphere 5.1的基础,所有虚拟机都需要网络来进行通信.如果将所有的虚拟 ...

  8. js面试题-2

    // 1.截取字符串 var aa = "abcd"; console.log(aa.substr(,)); var str = "qweda"; consol ...

  9. Omi原理-Hello Omi

    Hello Omi Omi框架的每个组件都继承自Omi.Component,本篇会去完成Omi的Component的基本锥形,让其能够渲染第一个组件. omi.js实现 var Omi = {}; O ...

  10. 【4N魔方阵】

    /* 4N魔方阵 */ #include<stdio.h> #include<stdlib.h> #define N 8 int main(void){ int i, j; ] ...