linux cgroup 学习的一些总结

本文以centos6.5为例,24 cpu:

一.cgroup基本概念

1.1subsystem 子系统

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

1.2 hierarchy 层级

1.3 control groups 控制群组

1.4 Tasks 任务

 cgroup中的任务的概念可以简单理解为进程

1.5 上述四者之间的关系

mount 选项中是要挂载subsystem 以及对应的层级

默认的系统配置如下:

cat /etc/cgconfig.conf

# By default, mount all controllers to /cgroup/<controller>

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;
}

有以下四种原则:

1.5.1 任何单一子系统只可以附加到一个层级中

这里写图片描述

1.5.2 单一层级可以附加一个或者多个子系统

这里写图片描述

1.5.3 任务只能够附加到是 同一个crontol group的某一级,而不能同时属于根是同一group的其他层级。

这里写图片描述

1.5.4子任务自动成为父任务所在的cgroup组的成员。

这里写图片描述

二.cgroup对cpu资源的控制(这里主要使用cpu子系统)

2.1概述

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

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

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

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

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

2.2通过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文件中,就可以控制资源了

2.3 group设置

以以下配置文件为例

 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 {
       perm {
        task {
            uid = hadoop;
            gid = hadoop;
        }
        admin {
           uid = hadoop;
           gid = hadoop;
        }
      }

       cpu {
              cpu.cfs_period_us= 100000;
              cpu.cfs_quota_us= 2160000;
       }

    }

控制组yarn,cpu最多可以使用21.6核。该控制组的权限为hadoop用户,由perm来配置task和admin权限。cpu{}表示附加的子系统。

cgroup启动后,在/cgroup/cpu/yarn目录下,可以查看文件相应的配置

2.4 任务添加到控制组

cgroup支持几种方式将任务添加到控制组。

2.4.1 echo pid > /cgroup/cpu/yarn/tasks
2.4.2 cgrule服务

用法:

user hierarchies control_group

user:command hierarchies control_group

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

cgrule配置文件在/etc/cgrule.conf,配置好启动服务后就可以根据规则自动将任务附加到控制群组了。

2.4.3 cgexec

用法:cgexec -g subsystems:path_to_cgroup command arguments

三.hadoop的nodemagner启用cgroup

cgexec -g cpu:yarn yarn-daemon.sh start nodemanager

这种方式是可以在不使用hadoop自带的cgroup功能,而启动linux的cgroup服务来实现yarn的资源控制。(我在centos6.5启用hadoop cgroup会导致服务器不定时宕机,但是一直找不到原因,大家有类似的解决办法可以评论下),所以后来才考虑这种方式来限制cpu资源,并且运行良好。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值