Cgroup - 从 CPU 照片隔离说起(一)
2015-12-29 15:20:15 | 来源:新浪微博 | 投稿:orroz | 编辑:小柯

原标题:Cgroup - 从 CPU 照片隔离说起(一)

Cgroup - 从 CPU 照片隔离说起

Hi ,我是 Zorro 。这是我的微博地址,我会不定期在这里更新文章,如果你有兴趣,可以来关注我呦。

本文有配套预告片演示,一起服用效果更佳。

配套预告片在这里呦:

http://v.youku.com/v_show/id_XMTQyNTM5ODY3Ng==.html?f=26435064&from=y1.7-1.3

另外,我的其他联系方式:

Email:mini.jerry@gmail.com

QQ:30007147

今天我们来谈谈:

什幺是 Cgroup ?

cgroups ,其名称源自控制组群( control groups )的简写,是 Linux 内核的一个功能,用来限制,控制与分离一个进程组群的照片(如 CPU 、内存、磁盘输入输出等)。

--引自维基百科:cgroup

引用官方说法总是那幺冰冷的让人不好理解,所以我还是稍微解释一下:

一个正在运行着服务的计算机系统,跟我们高中上课的情景还是很相似的。如果把系统中的每个进程理解为一个同学的话,那幺班主任就是操作系统的核心( kernel ),负责管理班里的同学。而 cgroup ,就是班主任控制学生行为的一种手段,所以,它起名叫 control groups 。

既然是一种控制手段,那幺 cgroup 能控制什幺呢?当然是照片啦!对于计算机来说,照片大概可以分成以下几个部分:

计算照片内存照片io 照片网络照片

这就是我们常说的内核四大子系统。当我们学习内核的时候,我们也基本上是围绕这四大子系统进行研究。
我们今天要讨论的,主要是 cgroup 是如何对系统中的 CPU 照片进行隔离和分配的。其他照片的控制,我们以后有空再说喽。

如何看待 CPU 照片?

由于进程和线程在 Linux 的 CPU 调度看来没啥区别,所以本文后续都会用进程这个名词来代表内核的调度对象,一般来讲也包括线程

如果要分配照片,我们必须先搞清楚这个照片是如何存在的,或者说是如何组织的。我想 CPU 大家都不陌生,我们都在系统中用过各种工具查看过 CPU 的使用率,比如说以下这个命令和它的输出:

[zorro@zorrozou-pc0 ~]$ mpstat -P ALL 1 1Linux 4.2.5-1-ARCH (zorrozou-pc0) 2015 年 12 月 22 日 _x86_64_ (4 CPU)mt 16 时 01 分 08 秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle16 时 01 分 09 秒 all 0.25 0.00 0.25 0.00 0.00 0.00 0.00 0.00 0.00 99.5016 时 01 分 09 秒 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0016 时 01 分 09 秒 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0016 时 01 分 09 秒 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0016 时 01 分 09 秒 3 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idleAverage: all 0.25 0.00 0.25 0.00 0.00 0.00 0.00 0.00 0.00 99.50Average: 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00Average: 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00Average: 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00Average: 3 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00

显示的内容具体什幺意思,希望大家都能了解,我就不在这细解释了。根据显示内容我们知道,这个计算机有 4 个 cpu 核心,目前的 cpu 利用率几乎是 0 ,就是说系统整体比较闲。

从这个例子大概可以看出,我们对 cpu 照片的评估一般有两个观察角度:

核心个数百分比

目前的计算机基本都是多核甚至多 cpu 系统,一个服务器上存在几个到几十个 cpu 核心的情况都很常见。所以,从这个角度看, cgroup 应该提供一种手段,可以给进程们指定它们可以占用的 cpu 核心,以此来做到 cpu 计算照片的隔离。
百分比这个概念我们需要多解释一下:这个百分比究竟是怎幺来的呢?难道每个 cpu 核心的计算能力就像一个带刻度表的水杯一样?一个进程要占用就会占用到它的一定刻度幺?

当然不是啦!这个 cpu 的百分比是按时间比率计算的。基本思路是:一个 CPU 一般就只有两种状态,要幺被占用,要幺不被占用。当有多个进程要占用 cpu 的时候,那幺操作系统在一个 cpu 核心上是进行分时处理的。比如说,我们把一秒钟分成 1000 份,那幺每一份就是 1 毫秒,假设现在有 5 个进程都要用 cpu ,那幺我们就让它们 5 个轮着使用,比如一人一毫秒,那幺 1 秒过后,每个进程只占用了这个 CPU 的 200ms ,使用率为 20%。整体 cpu 使用比率为 100%。
同理,如果只有一个进程占用,而且它只用了 300ms ,那幺在这一秒的尺度看来, cpu 的占用时间是 30 %。于是显示出来的状态就是占用 30%的 CPU 时间。

这就是内核是如何看待和分配计算照片的。当然实际情况要比这复杂的多,但是基本思路就是这样。 Linux 内核是通过 CPU 调度器 CFS --完全公平调度器对 CPU 的时间进行调度的,由于本文的侧重点是 cgroup 而不是 CFS ,对这个题目感兴趣的同学可以到这里进一步学习。 CFS 是内核可以实现真对 CPU 照片隔离的核心手段,因此,理解清楚 CFS 对理解清楚 CPU 照片隔离会有很大的帮助。

如何隔离 CPU 照片?

根据 CPU 照片的组织形式,我们就可以理解 cgroup 是如何对 CPU 照片进行隔离的了。

无非也是两个思路,一个是分配核心进行隔离,另一个是分配 CPU 使用时间进行隔离。

再介绍如何做隔离之前,我们先来介绍一下我们的实验系统环境:没有特殊情况,我们的实验环境都是一台 24 核心、 128G 内存的服务器,上面安装的系统可以认为是 Centos7.

搭建测试环境

我们将使用 cgconfig 服务和 cgred 服务对 cgroup 进行配置和使用。我们将配置两个 group ,一个叫 zorro ,另一个叫 jerry 。它们分别也是系统上的两个账户,其中 zorro 用户所运行的进程都默认在 zorro group 中进行限制, jerry 用户所运行的进程都放到 jerry group 中进行限制。配置文件内容和配置方法如下:

本文并不对以下配置方法的具体含义做解释,大家只要知道如此配置可以达到相关试验环境要求即可。如果大家对配置的细节感兴趣,可以自行查找相关资料进行学习。

首先添加两个用户, zorro 和 jerry :

[root@zorrozou-pc ~]# useradd zorro[root@zorrozou-pc ~]# useradd jerry

修改 /etc/cgrules.conf ,添加两行内容:

[root@zorrozou-pc ~]# cat /etc/cgrules.conf zorro cpu,cpuacct zorrojerry cpu,cpuacct jerry

修改 /etc/cgconfig.conf ,添加以下内容:

[root@zorrozou-pc ~]# cat /etc/cgconfig.confmount { cpuset = /cgroup/cpuset; cpu = /cgroup/cpu; cpuacct = /cgroup/cpuacct; memory = /cgroup/memory; devices = /cgroup/devices; freezer = /cgroup/freezer; net_cls = /cgroup/net_cls; blkio = /cgroup/blkio;} group zorro { cpuset { cpuset.cpus = "1,2"; }} group jerry { cpuset { cpuset.cpus = "3,4"; }}

重启 cgconfig 服务和 cgred 服务:

[root@zorrozou-pc ~]# service cgconfig restart[root@zorrozou-pc ~]# service cgred restart

根据上面的配置,我们给 zorro 组合 jerry 组分别配置了 cpuset 的隔离设置,那幺在 cgroup 的相关目录下应该出现相关组的配置文件:
本文中所出现的组的含义,如无特殊说明都是对应 cgroup 的控制组,而非用户组身份。
我们可以通过检查相关目录内容来检查一下环境是否配置完成:

[root@zorrozou-pc ~]# ls /cgroup/cpuset/{zorro,jerry}/cgroup/cpuset/jerry:cgroup.clone_children cpuset.cpu_exclusive cpuset.mem_exclusive cpuset.memory_pressure cpuset.mems cpuset.statcgroup.event_control cpuset.cpuinfo cpuset.mem_hardwall cpuset.memory_spread_page cpuset.sched_load_balance notify_on_releasecgroup.procs cpuset.cpus cpuset.memory_migrate cpuset.memory_spread_slab cpuset.sched_relax_domain_level tasks /cgroup/cpuset/zorro:cgroup.clone_children cpuset.cpu_exclusive cpuset.mem_exclusive cpuset.memory_pressure cpuset.mems cpuset.statcgroup.event_control cpuset.cpuinfo cpuset.mem_hardwall cpuset.memory_spread_page cpuset.sched_load_balance notify_on_releasecgroup.procs cpuset.cpus cpuset.memory_migrate cpuset.memory_spread_slab cpuset.sched_relax_domain_level tasks

至此,我们的实验环境已经搭建完成。

测试用例设计

无论是针对 CPU 核心的隔离还是针对 CPU 时间的隔离,我们都需要一个可以消耗大量的 CPU 运算照片的程序来进行测试,考虑到我们是一个多 CPU 核心的环境,所以我们的测试用例一定也是一个可以并发使用多个 CPU 核心的计算型测试用例。针对这个需求,我们首先设计了一个使用多线程并发进行筛质数的简单程序。这个程序可以打印出从 100010001 到 100020000 数字范围内的质数有哪些。并发 48 个工作线程从一个共享的 count 整型变量中取数进行计算。程序源代码如下:

#include#include #include #define NUM 48#define START 100010001#define END 100020000 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond = PTHREAD_COND_INITIALIZER;static int count = 0; void *prime(void *p){ int n, i, flag; while (1) { if (pthread_mutex_lock(&mutex) != 0) { perror("pthread_mutex_lock()"); pthread_exit(NULL); } while (count == 0) { if (pthread_cond_wait(&cond, &mutex) != 0) { perror("pthread_cond_wait()"); pthread_exit(NULL); } } if (count == -1) { if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock()"); pthread_exit(NULL); } break; } n = count; count = 0; if (pthread_cond_broadcast(&cond) != 0) { perror("pthread_cond_broadcast()"); pthread_exit(NULL); } if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock()"); pthread_exit(NULL); } flag = 1; for (i=2;i

我们先来看一下这个程序在不做限制的情况下的执行效果和执行时间:

[root@zorrozou-pc ~/test]# time ./prime_thread...... 100019603 is a prime form 2068363008!100019471 is a prime form 1866938112!100019681 is a prime form 1934079744!100019597 is a prime form 1875330816!100019701 is a prime form 2059970304!100019657 is a prime form 1799796480!100019761 is a prime form 1808189184!100019587 is a prime form 1824974592!100019659 is a prime form 2076755712!100019837 is a prime form 1959257856!100019923 is a prime form 2034792192!100019921 is a prime form 1908901632!100019729 is a prime form 1850152704!100019863 is a prime form -2109106432!100019911 is a prime form -2125891840!100019749 is a prime form 2101933824!100019879 is a prime form 2026399488!100019947 is a prime form 1942472448!100019693 is a prime form 1917294336!100019683 is a prime form 2051577600!100019873 is a prime form 2110326528!100019929 is a prime form -2134284544!100019977 is a prime form 1892116224! real 0m8.945suser 3m32.095ssys 0m0.235s [root@zorrozou-pc ~]# mpstat -P ALL 111:21:51 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle11:21:52 all 99.92 0.00 0.08 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 0 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 2 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 3 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 4 99.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 5 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 6 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 7 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 8 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 9 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 10 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 11 99.01 0.00 0.99 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 12 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 13 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 14 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 15 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 16 99.01 0.00 0.00 0.00 0.99 0.00 0.00 0.00 0.00 0.0011:21:52 17 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 18 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 19 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 20 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 21 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 22 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:21:52 23 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

经过多次测试,程序执行时间基本稳定:

[root@zorrozou-pc ~/test]# time ./prime_thread &> /dev/null real 0m8.953suser 3m31.950ssys 0m0.227s[root@zorrozou-pc ~/test]# time ./prime_thread &> /dev/null real 0m8.932suser 3m31.984ssys 0m0.231s[root@zorrozou-pc ~/test]# time ./prime_thread &> /dev/null real 0m8.954suser 3m31.794ssys 0m0.224s

所有相关环境都准备就绪,后续我们将在此程序的基础上进行各种隔离的测试。

tags:

上一篇  下一篇

相关:

致英超,什幺叫一手好牌打得稀巴烂

by:牛牛 原创 本赛季英超各大豪门集体哑火,没有最差,只有更差。 关注英超的小伙伴,告

做一个时刻准备着的人

作者/仙儿的浅斟低唱(片客)
“我知道不是所有鸟儿都飞翔 当夏天过后 还有鲜花未曾开放……依然能感受寒冷

宋方金跨年演讲:开水浇灌 竹子开花

编者按2015中国影视艺术创新峰会28日到29日在杭州举行。飞天奖颁奖仪式和产业推介会也同步进行。三箭并举,

付费中午写不完,就下午瞎聊聊

好多人说:卦叔,你的长微博有点长,看了头晕!别写那幺多了,反正好多人也看不懂。我看了看,一条长微博

创新创业在上饶,互联网融合传承加创新,打造青年创业新出路

 当前,“大众创业、万众创新”的浪潮正在全市各地奔腾涌动,团市委以“服务青年创新创业、促进科技成果转

天津铸源夸大宣传nbsp;违规运作屡遭媒体曝光

近日,天津铸源涉嫌虚假宣传被媒体曝光,报道称天津市场监管委已介入调查。  中国食品报的报道指出,天津

如约而至,广州海心沙跨年演唱会,2016,和白举纲一起跨年

时间:2015年12月31日地点:广州海心沙1. ???重要提示:A. 由于跨年演唱会当天APM线不在海心沙站停靠,坐地

【特大喜讯】揭博高速明天通车

春节出游和回家计划已经提上日程的亲们来一个振奋人心的好消息揭博高速将在这个12月月底通车!从珠三角到潮

原创 大宗商品期货也一样 人家恐惧的时候你就该贪婪

作者 陈炳文 微信公众号 bingwen1982 这段时间,暗流涌动,风起云涌,万科那边闹

应急演练严组织 有序疏散保安全

为增强监狱民警和服刑人员的消防安全意识,强化消防安全教育,提高预防和处置火灾事故的能力。近日,我监三

站长推荐: