• 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没有写在配置文件中那么使用该命令后想要再次恢复,那么只能手动操作。

  • 相关阅读:
    URL中#号(井号)的作用
    Sublime Text2 快捷键汇总
    Sublime Text2 使用及插件配置
    Sumblime Text 2 常用插件以及安装方法
    CSS禁止选择文本功能(兼容IE,火狐等浏览器)
    JavaScript 判断 URL
    纯真IP数据库格式读取方法(JAVA/PHP/Python)
    Sublime Text 2 性感无比的代码编辑器!程序员必备神器!跨平台支持Win/Mac/Linux
    base64:URL背景图片与web页面性能优化
    数独DFS实现
  • 原文地址:https://www.cnblogs.com/beautiful-code/p/15619138.html
Copyright © 2020-2023  润新知