美文网首页
cgroup 服务限制进程资源

cgroup 服务限制进程资源

作者: 北极企鹅ys | 来源:发表于2018-08-20 13:50 被阅读0次

    用 cgroup 服务限制进程资源

    CGroup 功能及组成

    CGroup 是将任意进程进行分组化管理的 Linux 内核功能。CGroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为 CGroup 子系统或控制器。CGroup 子系统有控制内存的 Memory 控制器、控制进程调度的 CPU 控制器等。运行中的内核可以使用的 Cgroup 子系统由/proc/cgroup 来确认。

    CGroup 提供了一个 CGroup 虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。要使用 CGroup,必须挂载 CGroup 文件系统。这时通过挂载选项指定使用哪个子系统。

    安装cgroup服务

    centos 6
    yum install -y libcgroup
    
    centos 7 
    yum install -y libcgroup libcgroup-tools
    

    配置cgroup配置

    这里需要是限制cpu
    先创建一个组,把需要限制的进程,启动的时候放到这组下。

    vim /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;
    }
    group yarn {       # yarn 为组名
       perm {
        task {
            uid = hadoop;     # 权限设置,为hadoop
            gid = hadoop;
        }
        admin {
           uid = hadoop;
           gid = hadoop;
        }
      }
       cpu {   # 可以用 cpu.cfs_period_us 和 cpu.cfs_quota_us 来限制该组中的所有进程在单位时间里可以使用的 cpu 时间。
              cpu.cfs_period_us= 100000;  # 就是时间周期,默认为 100000,即百毫秒  值的范围: 1000-100000 
              cpu.cfs_quota_us= 2160000;  # cpu.cfs_quota_us 就是在这期间内可使用的 cpu 时间,默认 -1,即无限制
       }   # 现在这个设置代表,这个组可以用的cpu为21.6盒,2160000/100000 
    }
    

    启动cgroup服务

    service cgroup restart
    chkconfig cgroup on
    

    启动 yarn 服务

    su - hadoop
    yarn-daemon.sh stop nodemanager
    cgexec -g cpu:yarn yarn-daemon.sh start nodemanager
    

    注释: 用cgexe启动的服务,他的子进程也会在这个cgroup组下。总体cpu加和不会超过组的设置。

    查看进程在哪个组下:

    [hadoop@db-datanode09 ~]$ ps -eo pid,cgroup,cmd
    153514 cpu:/                               /sbin/udevd -d
    153515 cpu:/                               /sbin/udevd -d
    154089 cpu:/yarn                           /usr/java/jdk1.8.0_45/bin/java -Dproc_nodemanager -Xmx4096m -Dhadoop.log.dir=/home/hadoop/apache-hadoop/hadoop/logs
    
    # 注释: cpu:/  代表在cgroup根配置下,cpu:/yarn 代表在根的yarn的配置下
    

    检查服务

    cd /sys/fs/cgroup/cpu/yarn
    cat tasks | grep "nodemanager PID"
    

    这是在 /cgroup/cpu/ 目录下就会出现 yarn 目录, 权限是hadoop用户

    [root@db-datanode09 cpu]# cd /cgroup/cpu/yarn
    [root@db-datanode09 yarn]# ls -l
    total 0
    --w--w---- 1 hadoop hadoop 0 Aug  1 14:19 cgroup.event_control
    -rw-rw-r-- 1 hadoop hadoop 0 Aug  1 14:19 cgroup.procs
    -rw-rw-r-- 1 hadoop hadoop 0 Aug  1 14:19 cpu.cfs_period_us
    -rw-rw-r-- 1 hadoop hadoop 0 Aug  1 14:19 cpu.cfs_quota_us
    -rw-rw-r-- 1 hadoop hadoop 0 Aug  1 14:19 cpu.rt_period_us
    -rw-rw-r-- 1 hadoop hadoop 0 Aug  1 14:19 cpu.rt_runtime_us
    -rw-rw-r-- 1 hadoop hadoop 0 Aug  1 14:19 cpu.shares
    -r--r--r-- 1 hadoop hadoop 0 Aug  1 14:19 cpu.stat
    -rw-rw-r-- 1 hadoop hadoop 0 Aug  1 14:19 notify_on_release
    -rw-rw-r-- 1 hadoop hadoop 0 Aug  1 14:22 tasks
    

    cgroup服务几种模式介绍

    cgroup 配置文件说明

    mount {
           cpuset  = /cgroup/cpuset;        为cgroup中的任务分配独立的cpu
           cpu     = /cgroup/cpu;           使用调度程序对cpu的使用控制
           cpuacct = /cgroup/cpuacct;       自动生成cgroup中的cpu使用的报告
           memory  = /cgroup/memory;        管理任务的内存
           devices = /cgroup/devices;       允许或拒绝cgroup中的任务访问设备
           freezer = /cgroup/freezer;       挂起或者恢复任务
           net_cls = /cgroup/net_cls;       控制网络流量
           blkio   = /cgroup/blkio;     为块设备输入输出设置,比如物理设备(磁盘,usb等)
    }
    

    cpu限制

    cgroup中对cpu资源控制的方式大约有三种:

    1.通过cpu子系统中的cpu quote方式

    2.通过cpu子系统中的cpu share方式

    3.通过cpuset子系统中的cpuset 将任务绑定到相应的cpu核上

    cpuset的方式是限定任务可以在哪些cpu上运行;cpu share的方式,是在控制群组中设置权重,通过权重和任务等来分配能够使用cpu的资源;

    通过cpu quote方式来限制

    启动cgroup服务后,可以在/cgroup/cpu目录下看到如下文件:

    total 0
    --w--w--w- 1 root   root   0 Jul 26 11:44 cgroup.event_control
    -rw-r--r-- 1 root   root   0 Jul 26 11:44 cgroup.procs
    -rw-r--r-- 1 root   root   0 Jul 26 11:44 cpu.cfs_period_us
    -rw-r--r-- 1 root   root   0 Jul 26 11:44 cpu.cfs_quota_us
    -rw-r--r-- 1 root   root   0 Jul 26 11:44 cpu.rt_period_us
    -rw-r--r-- 1 root   root   0 Jul 26 11:44 cpu.rt_runtime_us
    -rw-r--r-- 1 root   root   0 Jul 26 11:44 cpu.shares
    -r--r--r-- 1 root   root   0 Jul 26 11:44 cpu.stat
    -rw-r--r-- 1 root   root   0 Jul 26 11:44 notify_on_release
    -rw-r--r-- 1 root   root   0 Jul 26 11:44 release_agent
    -rw-r--r-- 1 root   root   0 Jul 26 11:44 tasks
    

    这里做一下说明:

    cpu.cfs_period_us: 单位是微秒,最大值是1s,最小值是1毫秒(ms),取值范围为1000-1000000

    cpu.cfs_quota_us 单位是微秒,意思是在 cpu.cfs_period_us的时间内,用户可以占用的时间。对于单核来说,最大等于 cpu.cfs_period_us的值,对于多核来说,可以理解为最多可使用的cpu核数

    cpu.stat:

    nr_periods 时间间隔, 指经过了多少个cpu.cfs_period_us的时间间隔 nr_throttled 被限制运行的次数 throttled_time 总共被限制的时间,微秒

    在多核的系统中, cpu.cfs_quota_us/cpu.cfs_period_us 的值就是可以使用的最大的cpu的核数

    tasks 将需要控制的任务的id写入到tasks文件中,就可以控制资源了

    分组

    cpu限制也有分组、分层的概念,
    如: /cgroup/cpu 这是cpu的根级,默认不限制cpu使用量,
    /cgroup/cpu/yarn 这是cpu下的一层,也是一个组,他的cpu使用量不能大于上一层设置。
    还可以在/cgroup/cpu/yarn 下创建其他层。

    进程添加到控制组
    1. 单一pid添加到某个控制组
      echo pid > /cgroup/cpu/yarn/tasks
    2. cgrule服务
      用法:

    user hierarchies control_group
    user:command hierarchies control_group
    当在user 使用前缀时代表是一个组群而不是单独用户例如@admins 是admins组群中的所有用户
    cgrule配置文件在/etc/cgrule.conf,配置好启动服务后就可以根据规则自动将任务附加到控制群组了。

    如:
    vim /etc/cgrule.conf

    
    # Example:
    #<user>         <controllers>   <destination>
    #@student       cpu,memory      usergroup/student/
    #peter          cpu             test1/
    #%              memory          test2/
    rd                  cpu             yarn     # rd 用户所有进程的cpu限制都在yarn这个组里
    @hadoop         cpu                 yarn  # hadoop 组里所有用户的进程cpu限制都在yarn这个组里
    mtime:scp           cpu                 yarn  # mtime的scp命令的cpu限制在yarn这个组里
    

    启动服务:

    /etc/init.d/cgred restart

    1. cgexec 命令启动服务
      用法:
      cgexec -g subsystems:path_to_cgroup command arguments
      如:
      cgexec -g cpu:yarn yarn-daemon.sh start nodemanager

    redhat cgroup

    关于其他资源 如 memory、network等限制,可以参考 radhat cgroup的介绍
    地址:
    centos 6
    https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/6/html-single/Resource_Management_Guide/index.html#chap-Introduction_to_Control_Groups

    centos 7
    https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/7/html-single/Resource_Management_Guide/index.html#chap-Introduction_to_Control_Groups

    我的 gihub 地址 https://sukbeta.github.io/2018/07/05/cgroup-%E6%9C%8D%E5%8A%A1%E9%99%90%E5%88%B6%E8%BF%9B%E7%A8%8B%E8%B5%84%E6%BA%90/

    相关文章

      网友评论

          本文标题:cgroup 服务限制进程资源

          本文链接:https://www.haomeiwen.com/subject/sjxliftx.html