cgroup 服务限制进程资源

用 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/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容