本文以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资源,并且运行良好。