cgroup 服务限制进程资源

0.1字数 1089阅读 1866

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

推荐阅读更多精彩内容