cgroup 服务限制进程资源

CGroup 功能及组成

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

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

安装cgroup服务

1
2
3
4
5
centos 6
yum install -y libcgroup

centos 7
yum install -y libcgroup libcgroup-tools

配置cgroup配置

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

vim /etc/cgconfig.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
}

强制上限的可调参数

1
2
3
4
5
6
7
cpu.cfs_period_us  
此参数可以设定重新分配 cgroup 可用 CPU 资源的时间间隔,单位为微秒(µs,这里以 “us” 表示)。如果一个 cgroup 中的任务在每 1 秒钟内有 0.2 秒的时间可存取一个单独的 CPU,则请将 cpu.rt_runtime_us 设定为 2000000,并将 cpu.rt_period_us 设定为 1000000。cpu.cfs_quota_us 参数的上限为 1 秒,下限为 1000 微秒。

cpu.cfs_quota_us
此参数可以设定在某一阶段(由 cpu.cfs_period_us 规定)某个 cgroup 中所有任务可运行的时间总量,单位为微秒(µs,这里以 "us" 代表)。一旦 cgroup 中任务用完按配额分得的时间,它们就会被在此阶段的时间提醒限制流量,并在进入下阶段前禁止运行。如果 cgroup 中任务在每 1 秒内有 0.2 秒,可对单独 CPU 进行存取,请将 cpu.cfs_quota_us 设定为 200000,cpu.cfs_period_us 设定为 1000000。请注意,配额和时间段参数都根据 CPU 来操作。例如,如要让一个进程完全利用两个 CPU,请将 cpu.cfs_quota_us 设定为 200000,cpu.cfs_period_us 设定为 100000。

如将 cpu.cfs_quota_us 的值设定为 -1,这表示 cgroup 不需要遵循任何 CPU 时间限制。这也是每个 cgroup 的默认值(root cgroup 除外)。

启动cgroup服务

1
2
service cgroup restart
chkconfig cgroup on

启动 yarn 服务

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

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

查看进程在哪个组下:

1
2
3
4
5
6
[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的配置下

检查服务

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
[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 配置文件说明

1
2
3
4
5
6
7
8
9
10
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目录下看到如下文件:

1
2
3
4
5
6
7
8
9
10
11
12
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

1
2
3
4
5
6
7
8
9

# 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

感觉文章还可以的话,帮忙点点下面的广告哦! 谢谢支持!

感谢您的支持!