对于hadoop和hbase公用的集群来说,经常会发生实时性要求较高的任务被大任务抢占资源,严重的情况下,region server进程也会挂掉,集群的资源竞争日益严重。在下一代hadoop yarn中采用了cgroup对系统资源进行隔离,目前的hadoop-2.0.5-alpha版只考虑了对内存和CPU资源的隔离。最近学习了下cgroup,记录在此。
CGroup简介
cgroup的全称是Control Group(控制群组),是linux kernel里的一种资源管理机制,用来限制,记录和隔离资源。最早是2006年由Google的工程师开发,后来合并到kernel 2.6.24中.
cgroup的特点和应用场景有:
- 限制资源的使用:比如某个应用程序占用了大部分的系统资源,导致别的程序无法执行,或者在多核机器上,让某个应用程序只能使用某些CPU,保留一些给其他程序使用,或者限制程序只能使用最多2G的内存。
- 使用资源的优先权:让某个程序比另外一个程序使用更多的CPU。
- 记录CPU的使用量以收取费用:对于某些提供计算资源的公司来说,需要对CPU的使用进行收费,但是如果计算使用者到底使用了多少CPU呢?传统的方法是统计整个系统上所有指令使用的CPU时间,然后进行分析,现在通过cgroup很容易实现。
- 隔离不同群组的进程:对于不同群组的进程做到隔离,可用于lxc(linux container)。
- freezing: 暂停和恢复任务
各个模块介绍
cgroup使用预定义的控制器(子系统)来决定具体的资源限制类型,以及具体的限制参数,通过挂载伪文件系统的方式来读取设置、应用控制细节。cgroup包含了多个孤立的子系统,每一个子系统代表一个单一的资源,具有集中管理的便利性。可用的控制子系统主要包括:
- blkio: 限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。
- cpu: 为任务所使用的cpu时间提供调度控制
- cpuacct:为任务自动生成cpu资源使用报告
- cpuset: 为任务分配独立CPU(对于多核处理器)和内存节点
- devices: 允许或者拒绝某些任务访问指定的设备
- freezer: 允许挂起或者恢复群组中的任务
- memory:限制任务所使用的内存,并自动生成内存资源报告
- net_cls: 用类标识符(classid)来标记网络包,以便Linux流量控制(tc)能够分辨 cgroup 中的特定任务所发出的数据包
- ns: 允许为任务分配不同的名称空间
CGroup的使用
先检查当前系统是否支持cgroup:
1 | [baoniu@search0404.sqa.cm1 ~]$ cat/proc/cgroups |
2 | #subsys_name hierarchy num_cgroups enabled |
libcgroup工具
RHEL 6系统提供了libcgroup来管理Cgroups,该软件包中包含了一系列Cgroup工具及其使用手册。我们可以使用它来绑定Cgroups层次结构,设置Cgroups参数。如果不安装libcgroup,就需要自己手工mount挂载和用shell语句写文件的方式来设置参数了。
libcgroup的安装:
cgconfig服务的启动和停止:
service cgconfig start stop
cgconfig服务默认是不随系统启动的,我们可以使用chkconfig来配置它随系统启动,以便每次系统重启后都能自动恢复之前的Cgroups配置。
cgconfig服务启动时,会读取配置文件/etc/cgconfig.conf的内容,根据其内容创建和挂载指定的cgroup子系统。
启动cgconfig服务后,可以通过lsubsys命令查看对应的子系统被mount到哪个目录:
1 | [baoniu@search0404.sqa.cm1 ~]$ lssubsys -m |
或者,查看/proc/mounts文件也能看到挂载的文件系统:
1 | [baoniu@search0404.sqa.cm1 ~]$ cat/proc/mounts |
3 | /dev/root / ext3 rw,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered 0 0 |
4 | /dev /dev tmpfs rw,relatime,mode=755 0 0 |
5 | /proc /proc proc rw,relatime 0 0 |
6 | /sys /sys sysfs rw,relatime 0 0 |
8 | cgroup /cgroup/cpuset cgroup rw,relatime,cpuset 0 0 |
9 | cgroup /cgroup/cpu cgroup rw,relatime,cpu 0 0 |
10 | cgroup /cgroup/cpuacct cgroup rw,relatime,cpuacct 0 0 |
11 | cgroup /cgroup/memory cgroup rw,relatime,memory 0 0 |
12 | cgroup /cgroup/devices cgroup rw,relatime,devices 0 0 |
13 | cgroup /cgroup/freezer cgroup rw,relatime,freezer 0 0 |
14 | cgroup /cgroup/net_cls cgroup rw,relatime,net_cls 0 0 |
15 | cgroup /cgroup/blkio cgroup rw,relatime,blkio 0 0 |
然后,查看 /cgroup 目录可以看到挂载后会出现响应的目录和文件:
1 | [baoniu@search0404.sqa.cm1]$ ll /cgroup/ |
3 | drwxr-xr-x 2 root root 0 Jun 25 10:01 blkio |
4 | drwxr-xr-x 2 root root 0 Jun 25 10:01 cpu |
5 | drwxr-xr-x 2 root root 0 Jun 25 10:01 cpuacct |
6 | drwxr-xr-x 2 root root 0 Jun 25 10:01 cpuset |
7 | drwxr-xr-x 2 root root 0 Jun 25 10:01 devices |
8 | drwxr-xr-x 2 root root 0 Jun 25 10:01 freezer |
9 | drwxr-xr-x 2 root root 0 Jun 25 10:01 memory |
10 | drwxr-xr-x 2 root root 0 Jun 25 10:01 net_cls |
11 | [baoniu@search0404.sqa.cm1]$ ll /cgroup/cpuset |
13 | -r--r--r-- 1 root root 0 Jun 25 10:01 cgroup.procs |
14 | -rw-r--r-- 1 root root 0 Jun 25 10:01 cpuset.cpu_exclusive |
15 | -rw-r--r-- 1 root root 0 Jun 25 10:01 cpuset.cpus |
16 | -rw-r--r-- 1 root root 0 Jun 25 10:01 cpuset.mem_exclusive |
17 | -rw-r--r-- 1 root root 0 Jun 25 10:01 cpuset.mem_hardwall |
18 | -rw-r--r-- 1 root root 0 Jun 25 10:01 cpuset.memory_migrate |
19 | -r--r--r-- 1 root root 0 Jun 25 10:01 cpuset.memory_pressure |
20 | -rw-r--r-- 1 root root 0 Jun 25 10:01 cpuset.memory_pressure_enabled |
21 | -rw-r--r-- 1 root root 0 Jun 25 10:01 cpuset.memory_spread_page |
22 | -rw-r--r-- 1 root root 0 Jun 25 10:01 cpuset.memory_spread_slab |
23 | -rw-r--r-- 1 root root 0 Jun 25 10:01 cpuset.mems |
24 | -rw-r--r-- 1 root root 0 Jun 25 10:01 cpuset.sched_load_balance |
25 | -rw-r--r-- 1 root root 0 Jun 25 10:01 cpuset.sched_relax_domain_level |
26 | -rw-r--r-- 1 root root 0 Jun 25 10:01 notify_on_release |
27 | -rw-r--r-- 1 root root 0 Jun 25 10:01 release_agent |
28 | -rw-r--r-- 1 root root 0 Jun 25 10:01 tasks |
此时,可以通过shell命令或者libcgroup提供的工具来使用cgroup了。 比如有两个进程10318和10320,想让10318进程使用CPU的第1个核,而10320进程使用CPU的第5和6两个核,操作如下:
1 | sudomkdir/cgroup/cpuset/first_core |
2 | sudomkdir/cgroup/cpuset/second_core |
3 | sudochown-R baoniu:users/cgroup/cpuset |
5 | echo0 > /cgroup/cpuset/first_core/cpuset.mems |
6 | echo1 > /cgroup/cpuset/first_core/cpuset.cpus |
7 | echo10318 > /cgroup/cpuset/first_core/tasks |
9 | echo0 > /cgroup/cpuset/second_core/cpuset.mems |
10 | echo5-6 > /cgroup/cpuset/second_core/cpuset.cpus |
11 | echo10320 > /cgroup/cpuset//second_core/tasks |
其中,在设置cpuset.cpus之前需要先设置内存节点cpuset.mems,详见NUMA。
cgroup配置文件
/etc/cgconfig.conf是cgroup配置工具libcgroup用来进行cgroup组的定义,参数设定以及挂载点定义的配置文件,主要由mount和group两个section构成。(参考:cgroup介绍、安装和配置文件解析 )
(1) mount section的语法格式如下:
5 | ######################################### |
8 | ######################################### |
例如:
上面的定义相当于如下shell指令:
mkdir /cgroup/cpu_test mount -t cgroup -o cpu cpu_test /cgroup/cpu_test
(2) group section的语法格式如下:
4 | <param name> = <param value>; |
9 | ################################################################################ |
11 | ## permissions:可选项,指定cgroup对应的挂载点文件系统的权限,root用户拥有所有权限。 |
13 | ## param name 和 param value:子系统的属性及其属性值 |
14 | ################################################################################# |
例如:
1 | mount{ ## 定义需要创建的cgroup子系统及其挂载点,这里创建cpu与cpuacct(统计)两个cgroup子系统 |
3 | cpuacct = /mnt/cgroups/cpu; |
6 | group daemons/www { ## 定义daemons/www(web服务器进程)组 |
18 | cpu { ## 定义cpu子系统的属性及其值,即属于此组的任务的权重为1000 |
23 | group daemons/ftp{ ## 定义daemons/ftp(ftp进程)组 |
34 | cpu { ## 定义此组的任务的权重为500 |
上面配置文件定义相当于执行了如下shell命令:
2 | mount-t cgroup -o cpu,cpuacct cpu /mnt/cgroups/cpu |
3 | mkdir/mnt/cgroups/cpu/daemons |
4 | mkdir/mnt/cgroups/cpu/daemons/www |
5 | chownroot:root /mnt/cgroups/cpu/daemons/www/* |
6 | chownroot:webmaster /mnt/cgroups/cpu/daemons/www/tasks |
7 | echo1000 > /mnt/cgroups/cpu/daemons/www/cpu.shares |
8 | mkdir/mnt/cgroups/cpu/daemons/ftp |
9 | chownroot:root /mnt/cgroups/cpu/daemons/ftp/* |
10 | chownroot:ftpmaster /mnt/cgroups/cpu/daemons/ftp/tasks |
11 | echo500 > /mnt/cgroups/cpu/daemons/ftp/cpu.shares |
注: 修改 /etc/cgconfig.conf 之后,需要重启cgconfig服务来使配置生效。
libcgroup命令行工具
libcgroup提供了很多工具,可以方便操作cgroup, 如使用cgcreate命令创建一个cgroup
cgcreate -g cpu,net_cls:/test-subgroup
此外,还有cgclassify,cgclear,cgconfigparser,cgdelete,cgexec,cgget,cgset…等一系列命令,可以用man查看这些命令的用法,如
--转自
该贴由koei123转至本版2015-6-1 15:09:20