存档在 2013年3月

Cgroup简介-子系统与层级

2013年3月24日

Cgroup是一种资源控制机制,它将操作系统中的所有进程以组为单位划分,所有进程组以层级结构进行组织。cgroup为每个进程组都指定一组访问资源的行为,这些行为限制了该组进程对资源的访问。

1基本概念

子系统(subsystem)实际上是cgroup对进程组进行资源控制的具体体现。子系统具有多种类型,每个类型的子系统都代表一种系统资源,比如CPU、memory等。当创建一个cgroup实例时,必须至少指定一种子系统。也就是说,这个新建的进程组在访问子系统对应的系统资源时就有了一些限制。具体的限制项与子系统的类型有关。

Cgroup中进程组的层级关系与Linux中进程的层级关系比较类似。在Linux操作系统中,一个进程通过fork()系统调用创建了一个子进程,这两个进程之间存在父子这样的等级关系,并且子进程可以继承父进程的一些资源。系统中所有的进程形成一个树形的等级关系,每个进程都唯一的位于进程树中的某一个位置。

对于cgroup来说,cgroup实例之间也是具体级别关系的,但是它们层级关系是为了更细粒度的对进程组进行资源控制。同时,子cgroup会继承父cgroup的对资源的控制属性。

2子系统与层级的关系

如果要创建一个cgroup实例,通过下面的命令即可完成:

mount –t cgroup –o cpu,memory cpu_memory /cgroup/cpu_memory

可以看到,通过Linux中挂载文件系统的方法就可以创建cgroup实例。其中-t选项指定文件系统类型为cgroup类型,-o指定本次创建的cgroup实例与cpu和momory子系统(或资源)关联,cpu_momory指定了当前cgroup实例在整个cgroup树中所处的层级名称,最后的路径为文件系统挂载点。关于cgroup文件系统本文稍后说明。

图1是一个系统中的cgroup结构图,它包含两个层级,即第一层级cpu_mem和第二层级cpuset_net。接下来以该图为例说明cgroup子系统和层级之间的设置规则。

cgroup_example

图1

1. 系统中第一个被创建的cgroup被称为root cgroup,该cgroup的成员包含系统中所有的进程。

如图1所示,root cgroup位于cpu_mem层,它包含了系统中的所有进程;root cgroup又被分为cgroup1和cgroup2两个子cgroup,它们位于第二层级cpuset_net中。

2. 一个子系统只能位于一个层级中。

如图1中所示,cpu子系统位于第一层级cpu_mem中,那么这个子系统将不能再位于第二层级中。不过这种设置规则并不影响子cgroup对cpu子系统的使用,因为所有的子cgroup都将继承root cgroup所属的cpu子系统。

3. 每个层级中可以关联多个子系统。

图1中第一层级cpu_mem关联了cpu和memory两个子系统。

4. 一个进程可以位于不同层级的cgroup中。

由于root cgroup包含了系统中所有的进程,因此cgroup2中的进程P也位于root cgroup中。从资源控制角度来说,进程P所在的进程组在访问cpu、memory和net时会受到资源限制。

5. 一个进程创建了子进程后,该子进程默认为父进程所在cgroup的成员。

子进程被创建后,继承父进程的cgroup,但是后续可根据需求将子进程移动到其他cgroup中。

Cgroup简介-概述

2013年3月10日

Cgroup(Control Groups)是这样一种机制:它以分组的形式对进程使用系统资源的行为进行管理和控制。也就是说,用户通过cgroup对所有进程进行分组,再对该分组整体进行资源的分配和控制。

1 Cgroup的结构

cgroup中的每个分组称为进程组,它包含多个进程。最初情况下,系统内的所有进程形成一个进程组(根进程组),根据系统对资源的需求,这个根进程组将被进一步细分为子进程组,子进程组内的进程是根进程组内进程的子集。而这些子进程组很有可能继续被进一步细分,最终,系统内所有的进程组形成一颗具有层次等级(hierarchy)关系的进程组树。如下图:

cgroup_tree

由于进程组可以被进一步划分,因此一个进程可能处于多个进程组中,但这些进程组必然不处于同一层级中。

另外,如果某个进程组内的进程创建了子进程,那么该子进程默认与父进程处于同一进程组中。也就是说,cgroup对改进程组的资源控制同样作用于子进程。

2 subsystem

cgroup是一种对进程资源管理和控制的统一框架,它提供的是一种机制(mechanism),而具体的策略(policy)是通过子系统(subsystem)来完成的,子系统是cgroup对进程组进行资源控制的具体行为。机制和策略是Linux操作系统中一种经典的设计思想,所谓机制就是“我要提供哪种功能”,而策略则是“我要怎样来实现这种功能”。

cgroup中每个子系统都代表一种类型的资源,具体如下:

1) cpu子系统:该子系统为每个进程组设置一个使用CPU的权重值,以此来管理进程对cpu的访问。

2) cpuset子系统:对于多核cpu,该子系统可以设置进程组只能在指定的核上运行,并且还可以设置进程组在指定的内存节点上申请内存。

3) cpuacct子系统:该子系统只用于生成当前进程组内的进程对cpu的使用报告。

4) memory子系统:该子系统提供了以页面为单位对内存的访问,比如对进程组设置内存使用上限等,同时可以生成内存资源报告

5) blkio子系统:该子系统用于限制每个块设备的输入输出。首先,与CPU子系统类似,该系统通过为每个进程组设置权重来控制块设备对其的I/O时间;其次,该子系统也可以限制进程组的I/O带宽以及IOPS。

6) devices子系统:通过该子系统可以限制进程组对设备的访问,即该允许或禁止进程组对某设备的访问。

7) freezer子系统:该子系统可以使得进程组中的所有进程挂起。

8) net-cls子系统:该子系统提供对网络带宽的访问限制,比如对发送带宽和接收带宽进程限制。

如果要实现子系统对所属进程组的资源控制,那么就要实现该子系统对应的钩子函数。这个关系与虚拟文件系统类似,VFS提供统一的用户接口,而具体的文件操作则通过文件系统(比如ext3)对钩子函数的实现。具体关系如下图:

cgroup_struct

由图可以看出,cgroup在用户态提供统一的用户接口,而每个子系统对资源的控制功能则通过其钩子函数实现。这样使得cgroup在上层是一个统一的框架,而下层则可以实现多种资源的控制。每个子系统的钩子函数如下:

 
struct cgroup_subsys {
        struct cgroup_subsys_state *(*css_alloc)(struct cgroup *cgrp);
        int (*css_online)(struct cgroup *cgrp);
        void (*css_offline)(struct cgroup *cgrp);
        void (*css_free)(struct cgroup *cgrp);

        int (*can_attach)(struct cgroup *cgrp, struct cgroup_taskset *tset);
        void (*cancel_attach)(struct cgroup *cgrp, struct cgroup_taskset *tset);
        void (*attach)(struct cgroup *cgrp, struct cgroup_taskset *tset);
        void (*fork)(struct task_struct *task);
        void (*exit)(struct cgroup *cgrp, struct cgroup *old_cgrp,
                     struct task_struct *task);
        void (*bind)(struct cgroup *root);
        …… ……
}

3 cgroup文件系统

cgroup在Linux内核中是以文件系统的形式存在的,不过cgroup对应的这种文件系统与proc文件系统类似,都是只存在于内存中的“虚拟”文件系统。既然如此,就可以通过mount命令创建一个cgroup实例。

$ sudo mount -t cgroup -o memory memory_cgroup /dev/cgroup/

即在/dev/cgroup/下创建了一个memory子系统。接下来就可以通过:

$ cat /proc/filesystems | grep cgroup

可看到系统有了cgroup类型的文件系统。

当创建了一个cgroup实例后,对应的挂载点下会有一些文件,这些文件是用户与cgroup进行交互的接口。由于cgroup位于VFS层之下,因此用户可以通过统一的文件操作接口去读取或设置子系统的参数,当然也可以直接使用echo或者cat等命令。

参考:

1.Linux内核文档:

https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt

Linux下CPU的利用率

2013年3月3日

CPU利用率是对系统进行性能分析的重要因素,本文将说明CPU时间的组成以及利用率的计算方法。

内核中的时间

具体说明CPU的各种时间之前,先说明内核中几个重要的时间概念。

HZ是系统时钟在一秒内固定发出时钟中断的次数。HZ在编译内核前是可以进行配置的,因此通过下述命令就可以查看当前系统的时钟中断频率:

cat /boot/config-`uname -r` | grep CONFIG_HZ

tick为系统时钟每“滴答”一次的时间,其值为(1/HZ)秒。也就是连续两次时钟中断之间的时间间隔。

jiffies用来计算自系统启动以来tick的次数,也就是说系统时钟每产生一次时钟中断,该变量的值就增加一次。

CPU时间

CPU的工作时间由三部分组成:用户态时间、系统态时间和空闲态时间。具体的组成为;

CPU时间=User time+Nice time+System time+Hardirq time+Softirq time+Waiting time+Idle time+Steal time

空闲态时间只包含了idle time,而用户态时间和系统态时间则由多个部分组成,详析介绍如下。

用户态时间

用户态时间包括用户时间和nice时间。

用户时间(user time)指的是CPU在用户态执行进程的时间。nice时间(nice time)是指系统花费在调整进程优先级上的时间。

内核态时间

内核态时间包括系统时间、软中断时间和硬中断时间。

系统时间(system time)表示CPU在内核运行的时间,如果一个CPU的系统时间占有率高,则说明该系统中某个子系统产生了瓶颈。

软中断时间和硬中断时间分别对应系统在处理软硬中断时候所花费的CPU时间。

此外,waiting time是指CPU在等待I/O完成时所花费的时间。而steal time指的是当前CPU等待另外虚拟的CPU处理完毕时话费的时间。

CPU利用率

CPU利用率可以通过top等命令来查看,它们的计算方法如下:

%us =(User time + Nice time)/CPU时间*100%

%sy=(System time + Hardirq time +Softirq time)/

%id=(Idle time)/CPU时间*100%

%ni=(Nice time)/CPU时间*100%

%wa=(Waiting time)/CPU时间*100%

%hi=(Hardirq time)/CPU时间*100%

%si=(Softirq time)/CPU时间*100%

%st=(Steal time)/CPU时间*100%

查看方法

通过top、iostat和vmstat等命令均可以查看上述CPU的利用率。这些命令的数据来源均来自与/proc/stat文件,不过该文件中的时间是以tick为单位的。

windows 7 ultimate product key

windows 7 ultimate product key

winrar download free

winrar download free

winzip registration code

winzip registration code

winzip free download

winzip free download

winzip activation code

winzip activation code

windows 7 key generator

windows 7 key generator

winzip freeware

winzip freeware

winzip free download full version

winzip free download full version

free winrar download

free winrar download

free winrar

free winrar

windows 7 crack

windows 7 crack

windows xp product key

windows xp product key

windows 7 activation crack

windows7 activation crack

free winzip

free winzip

winrar free download

winrar free download

winrar free

winrar free

download winrar free

download winrar free

windows 7 product key

windows 7 product key