zoukankan      html  css  js  c++  java
  • Control Groups简介 (Cgroups)

    1. Control Groups简介 (Cgroups)

      Red Hat Enterprise Linux 6 提供了一个新的内核特性: CONTROL GROUPS(Cgroups),它为内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。

      CONTROL GROUPS包括如下子系统:

    blkio -- 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。

    cpu -- 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。

    cpuacct -- 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。

    cpuset -- 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。

    devices -- 这个子系统可允许或者拒绝 cgroup 中的任务访问设备。

    freezer -- 这个子系统挂起或者恢复 cgroup 中的任务。

    memory -- 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。

    net_cls -- 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。

    ns -- 名称空间子系统。

    1. 使用 Control Groups

    2.1.1安装

    yum install –y libcgroup

    2.1.2 启动/停止
    # service cgconfig start

       # service cgconfig stop
    

    2.2.1配置文件 /etc/cgconfig.conf
    /etc/cgconfig.conf在安装Cgroup后会自动建立,文件包含2部分功能----mount and group:

    cat /etc/cgconfig.conf

    mount {

        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;
    

    }

    它将在服务启动后创建和挂载虚拟文件系统,等价于命令:

    mkdir -p /cgroup/cpuset

    mount -t cgroup -o cpuset cpuset /cgroup/cpuset

    …….

    Example:

    group daemons {

     cpuset {
    
         cpuset.mems = 0;
    
         cpuset.cpus = 0;
    
     }
    

    }

    group daemons/sql {

     perm {
    
         task {
    
             uid = root;
    
             gid = sqladmin;
    
         } admin {
    
             uid = root;
    
             gid = root;
    
         }
    
     }
    
     cpuset {
    
         cpuset.mems = 0;
    
         cpuset.cpus = 0;
    
     }
    

    }

    相当于在shell里面执行:

    mkdir -p /cgroup/cpuset/daemons/sql

    chown root:root -R /cgroup/cpuset/daemons

    chown root:sqladmin /cgroup/cpuset/daemons/sql/tasks

    echo $(cgget -n -v -r cpuset.mems /) > /cgroup/cpuset/daemons/cpuset.mems

    echo $(cgget -n -v -r cpuset.cpus /) > /cgroup/cpuset/daemons/cpuset.cpus

    echo 0 > /cgroup/cpuset/daemons/sql/cpuset.mems

    echo 0 > /cgroup/cpuset/daemons/sql/cpuset.cpus

    2.2.2目录 /etc/cgconfig.d/
    配置文件所在的目录。下面的文件名以conf作为后缀,语法参见/etc/cgconfig.conf。

    cgconfig服务启动时第一个读取的文件是/etc/cgconfig.conf,然后是该目录下的*.conf文件。文件的解析没有排序。不要在多个文件内定义同一个group。

    2.3列出当前的子系统

    lssubsys -am

    ns

    perf_event

    net_prio

    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

    第一列为支持的子系统名称,后面的表示已经挂载的目录。

    也可查看指定的子系统:

    lssubsys -m subsystems

    subsystems为指定的子系统名称。

    2.4 remount/umount
    对于已经挂载的子系统,同样可以再次挂载:

    mount -t cgroup -o remount,cpu cpu_and_mem /cgroup/cpu

    umount /cgroup/ cpu

    2.5.1 创建 Control Groups

    语法:cgcreate -t uid:gid -a uid:gid -g subsystems:path

    -t 指定允许向 cgroup 分配任务的用户和组 ID

    -a 指定允许管理 cgroup 和更改子系统参数的用户和组 ID

    -g subsystems:path group名称及挂载路径

    Example:

    cgcreate -g cpu,net_cls:/test-subgroup

    创建了cpu及net_cls子系统并挂载到/test-subgroup。

    2.5.2 删除 Control Groups

    语法:cgdelete subsystems:path

    Example:

    cgcreate cpu,net_cls:/test-subgroup

    2.5.3 设置 Control Groups参数

    语法:cgset -r parameter=value path_to_cgroup

    如果cpuset 已经挂载到 /cgroup/cpu_and_mem/ 并且存在目录/cgroup/cpu_and_mem/group1,那么可以:

    cgset -r cpuset.cpus=0-1 group1

    也可以:

    echo ‘0-1’ > /cgroup/cpu_and_mem/group1/cpuset.cpus

    2.5.4 复制 Control Groups参数

    也可以对一个已经存在并设置好的参数进行复制。

    语法:cgset --copy-from path_to_source_cgroup path_to_target_cgroup

    cgset --copy-from group1/ group2/

    这样croup2的参数将从group1复制而来。

    2.6 应用Control Groups

    设置好参数后,就可以对进程应用Cgroup。

    语法:cgclassify -g subsystems:path_to_cgroup pidlist

    cgclassify -g cpu,memory:group1 1701

    ID为1701的进程进程将被应用到cpu及memory子系统中的group1中。也就是说ID为1701的进程将受到cpu及memory子系统中的group1中所设定参数的限制。

    也可以:

    echo 1701 > /cgroup/cpu_and_mem/group1/tasks

    2.7 cgred Service

    Cgred 服务会启动一个守护进程 cgrulesengd ,它可根据在 /etc/cgrules.conf 文件中设定的参数将任务移动到 cgroup 中。/etc/cgrules.conf 文件可以使用以下两个格式之一:

    User hierarchies control_group

    例如:

    maria devices staff

    用户maria 的进程根据在 staff cgroup 中指定的参数访问设备子系统。

    启动/停止方法:service cgred start/stop

    /etc/cgrules.conf 文件中的条目可包括以下特殊符号:

    @ - 当在 user 使用前缀时,代表是一个组群而不是单独用户。例如:@admins 是 admins 组群中的所有用户。

      • 代表“所有”。例如:subsystem 字段中的 * 代表所有子系统。

    % - 代表与以上行中项目相同的项目。例如:

    @adminstaff devices /admingroup

    @labstaff % %(等价于

    @labstaff devices /admingroup)

    2.8 将进程放进cgroup中

    语法:cgexec -g subsystems:path_to_cgroup command arguments

    subsystems 是用逗号分开的子系统列表或者用 * 表示所有可用的子系统。

    path_to_cgroup 是该 cgroup 的路径。

    command 是要运行的命令。

    arguments 是该命令所有参数。

    还可以在 command 前面添加 -- sticky 将所有子进程放在同一 cgroup 中。如果没有设定这个选项,且 cgred 守护进程正在运行,则将根据在/etc/cgrules.conf 中的设置将子进程分配到 cgroup 中。而该进程本身仍保留在启动它的 cgroup 中。

    Example:

    cgexec -g cpu:group1 firefox

    这样firefox的进程将被放到cpu子系统的group1中。

    也可以:

    echo $$ > /cgroup/lab1/group1/tasks

    这样的话,不但firefox进程会被放到相应的cgroup中;在当前窗口的所有进程均会被放到该cgroup中。如果不希望这样的后果,可以:

    sh -c "echo $$ > /cgroup/cpu_and_mem/group1/tasks && firefox"

    2.8.1 将服务放进cgroup中

    要将一个服务放到cgroup中,服务需要具备以下条件:

    ⅰ可以使用 /etc/sysconfig/servicename 文件。

    ⅱ必须使用 /etc/init.d/functions 的 daemon() 功能启动该服务

    然后编辑文件/etc/sysconfig/servicename,添加内容:CGROUP_DAEMON="subsystem:control_group"

    Example:

    cat /etc/sysconfig/httpd

    CGROUP_DAEMON="cpuset:group1"

    service httpd start

    httpd服务将被加到cpuset子系统的group1中。

    2.9 工具

    2.9.1 生成配置文件之cgsnapshot

    列出当前配置

    cgsnapshot –s

    输出配置文件

    cgsnapshot -f ~/test/cgconfig_test.conf

    不要将输出文件直接输出到 /etc/cgconfig.conf,因为 -f 参数将会覆盖任何文件。

    也可以为子系统创建配置文件。通过指定一个子系统的名称,则输出将包含于该子系统的相应配置的:

    cgsnapshot cpuacct

    设置黑名单

    cgsnapshot -b ~/test/my_blacklist.conf

    如果不指定文件,则使用默认文件/etc/cgsnapshot_blacklist.conf。

    设置白名单

    cgsnapshot -w ~/test/my_whitelist.conf

    没有用默认文件。

    另,在使用cgsnapshot –f时,如果既不指定黑名单,也不指定白名单,那么会有相关的警告信息。因此可以使用 -t 参数。

    2.10 查找某个属于cgroup的进程

    ps -O cgroup

    如果已知进程的PID,则可以:

    cat /proc/PID/cgroup

    2.11 查找Control Groups
    列出系统中的cgroup

    lscgroup

    也可以:

    lscgroup controller:path

    Example:

    lscgroup cpuset:daemons

    2.12 查找Control Groups参数
    显示具体 cgroup 的参数:

    cgget -r parameter list_of_cgroups

    Example:

    cgget -r cpuset.cpus -r memory.limit_in_bytes group1 group2

    显示 cgroup lab1 和 lab2 的 cpuset.cpus 和 memory.limit_in_bytes 值。

    如果不知道 parameter ,可以:

    cgget -g cpuset /

    2.11. 卸载控制组群

    要清除整个 cgroup 文件系统,请使用 cgclear 命令。

    如果有些group没有写在配置文件中那么使用该命令后想要再次恢复,那么只能手动操作。

  • 相关阅读:
    高斯消元学习
    HDU 4596 Yet another end of the world(解一阶不定方程)
    Codeforces Round #318 div2
    HDU 4463 Outlets(一条边固定的最小生成树)
    HDU 4458 Shoot the Airplane(计算几何 判断点是否在n边形内)
    HDU 4112 Break the Chocolate(简单的数学推导)
    HDU 4111 Alice and Bob (博弈)
    POJ 2481 Cows(线段树单点更新)
    HDU 4288 Coder(STL水过)
    zoj 2563 Long Dominoes
  • 原文地址:https://www.cnblogs.com/beautiful-code/p/15619138.html
Copyright © 2011-2022 走看看