日志标签 ‘虚拟化’

Cgroup简介-资源控制的实现

2013年4月25日

Cgroup自身通过文件系统的形式在内核中实现,通过对子系统配置文件的读写即可完成对进程组资源的控制。不过,cgroup对各种资源的实际控制则分布到整个内核代码中。下面从CPU、内存和I/O三个方面说明Cgroup对资源的控制过程。

1 CPU控制

Cgroup对进程组使用CPU的限制是通过cpu和cpuset两个子系统来完成的。cpu子系统主要限制进程的时间片大小,cpuset子系统可为进程指定cpu和内存节点。

1) cpu子系统

cpu子系统主要分布在内核的调度系统中,通过该子系统中的cpu.shares文件可对进程组设置权重。

根据CFS的原理,一个进程的权重越大,那么它的被调度的可能性就越大。那么进程组的权重如何在CFS中体现?CFS将进程和进程组视为同一个调度体,并用sched_entity结构来表示,每个结构中包含该调度体的权重以及虚拟运行时间等。

因此,用户可通过CPU子系统中的cpu.shares文件来控制进程组对CPU的使用。

2) cpuset子系统

通过cpuset子系统中的cpuset.cpus和cpuset.mems可对进程组设定可访问的CPU和内存节点。内核使用cpuset结构来描述cpuset子系统的属性信息,其中该结构中的cpus_allowed和mems_allowed两个字段分别保存上述两个文件的值。同时,进程描述符中也有cpus_allowed和mems_allowed两个字段,其值与cpuset结构保持同步。

cpuset限制进程所能访问的CPU主要通过两方面。首先体现在进程的创建,如果父进程新建子进程时没有指定CLONE_STOPPED标志,则父进程将调用wake_up_new_task()将子进程状态设置为TASK_RUNNING,并将其加入就绪队列。为子进程选择就绪队列的具体工作则由select_task_rq()完成,其内部实现将涉及CPU的检查操作,即在cpus_allowed所指定的cpu范围内为当前进程分配CPU。

其次,当调度器在调度一个进程时,也要通过select_task_rq()进行同样的对比选择。这样就可以保证cgroup实例中的进程只在cpus_allowed所限定的cpu中运行。

cpuset进程所能访问内存节点的限制表现在物理内存的分配过程中。Linux内核将物理内存在逻辑上分为node、zone和page,内核通过alloc_pages()来实现物理内存的分配工作。alloc_pages()的主要工作是在所有物理内存中选择node,再在当前node中选择zone,最终在zone中分配一个物理页框。其中,在选择node的过程中会进行mems_allowed的判断过程。

2 内存控制

cgroup对内存的控制通过memory子系统完成,其控制作用主要体现在对内存使用量的限制,同时为当前cgroup生成一份内存使用情况报告。

在具体实现的过程中,cgroup通过内核中的resource counter机制实现内存的限制。resource counter相当于一个通用的资源计数器,在内核中通过res_counter结构来描述。该结构可用于记录某类资源的当前使用量、最大使用量以及上限等信息。具体描述如下:

struct res_counter {
    /*
     * the current resource consumption level
     */
    unsigned long long usage;
    /*
     * the maximal value of the usage from the counter creation
     */
    unsigned long long max_usage;
    /*
     * the limit that usage cannot exceed
     */
    unsigned long long limit;
    /*
     * the limit that usage can be exceed
     */
    unsigned long long soft_limit;
    /*
     * the number of unsuccessful attempts to consume the resource
     */
    unsigned long long failcnt;
    /*
     * the lock to protect all of the above.
     * the routines below consider this to be IRQ-safe
     */
    spinlock_t lock;    /*
     * Parent counter, used for hierarchial resource accounting
     */
    struct res_counter *parent;
};

内核使用mem_cgroup结构描述cgroup中内存的使用信息,其内部嵌入了res_counter结构。因此res_counter中的每个字段则表示对内存使用量的记录。用户态下memory子系统所导出的配置文件与该结构中的字段互相对应,比如mem.limit_in_bytes表示当前cgroup可使用内存的最大上线,该文件与res_counter结构中的limit字段对应。也就是说,当用户在用户态向mem.limit_in_bytes文件写入值后,则res_counter中的limit字段相应更新。

内核对res_counter进行操作时有三个基本函数:res_counter_init()对res_counter进行初始化;当分配资源时,res_counter_charge()记录资源的使用量,并且该函数还会检查使用量是否超过了上限,并且记录当前资源使用量的最大值;当资源被释放时,res_counter_uncharge()则减少该资源的使用量。

cgroup对内存资源的限制主要是将上述三个函数分布到内存的分配单元中,比如,系统发生缺页异常时,由于页表项未分配而申请内存时,由于页缓存而分配内存等。

3 块I/O控制

Cgroup中通过blkio子系统完成对块设备I/O的控制。具体的控制主要通过blkio.weight文件在用户态设定当前进程组访问块I/O的权重,也就是控制进程组占有I/O的时间。

blkio子系统对块I/O的控制代码主要分布在I/O调度算法中,目前内核中默认的调度算法为CFQ(完全公平队列),该算法与进程调度算法CFS比较类似。

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

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