linux cgroup 学习的一些总结

来源:互联网 发布:扬子石化SAP软件 编辑:程序博客网 时间:2024/05/18 00:31

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

一.cgroup基本概念

1.1subsystem 子系统

blkio      为块设备输入输出设置,比如物理设备(磁盘,usb等)cpu        使用调度程序对cpu的使用控制cpuacct    自动生成cgroup中的cpu使用的报告cpuset     为cgroup中的任务分配独立的cpudevices    允许或拒绝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资源,并且运行良好。

原创粉丝点击