[转帖]Linux CGroup学习 – 入门篇_VMware, Unix及操作系统讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  VMware, Unix及操作系统讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2638 | 回复: 0   主题: [转帖]Linux CGroup学习 – 入门篇        下一篇 
    本主题由 koei123 于 2015-6-1 15:09:20 移动
lxk
注册用户
等级:上尉
经验:547
发帖:109
精华:0
注册:2011-8-18
状态:离线
发送短消息息给lxk 加好友    发送短消息息给lxk 发消息
发表于: IP:您无权察看 2015-3-18 17:52:53 | [全部帖] [楼主帖] 楼主

对于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的特点和应用场景有:

  1. 限制资源的使用:比如某个应用程序占用了大部分的系统资源,导致别的程序无法执行,或者在多核机器上,让某个应用程序只能使用某些CPU,保留一些给其他程序使用,或者限制程序只能使用最多2G的内存。
  2. 使用资源的优先权:让某个程序比另外一个程序使用更多的CPU。
  3. 记录CPU的使用量以收取费用:对于某些提供计算资源的公司来说,需要对CPU的使用进行收费,但是如果计算使用者到底使用了多少CPU呢?传统的方法是统计整个系统上所有指令使用的CPU时间,然后进行分析,现在通过cgroup很容易实现。
  4. 隔离不同群组的进程:对于不同群组的进程做到隔离,可用于lxc(linux container)。
  5. 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


3cpuset  0       1       1


4ns      0       1       1


5cpu     0       1       1


6cpuacct 0       1       1


7memory  0       1       1


8devices 0       1       1


9freezer 0       1       1


10net_cls 0       1       1


11blkio   0       1       1


12perf_event      0       1       1




libcgroup工具



RHEL 6系统提供了libcgroup来管理Cgroups,该软件包中包含了一系列Cgroup工具及其使用手册。我们可以使用它来绑定Cgroups层次结构,设置Cgroups参数。如果不安装libcgroup,就需要自己手工mount挂载和用shell语句写文件的方式来设置参数了。

libcgroup的安装:

yum install libcgroup

cgconfig服务的启动和停止:

service cgconfig start stop

cgconfig服务默认是不随系统启动的,我们可以使用chkconfig来配置它随系统启动,以便每次系统重启后都能自动恢复之前的Cgroups配置。

chkconfig cgconfig on

cgconfig服务启动时,会读取配置文件/etc/cgconfig.conf的内容,根据其内容创建和挂载指定的cgroup子系统。

启动cgconfig服务后,可以通过lsubsys命令查看对应的子系统被mount到哪个目录:

1[baoniu@search0404.sqa.cm1 ~]$ lssubsys  -m


2cpuset /cgroup/cpuset


3cpu /cgroup/cpu


4cpuacct /cgroup/cpuacct


5memory /cgroup/memory


6devices /cgroup/devices


7freezer /cgroup/freezer


8net_cls /cgroup/net_cls


9blkio /cgroup/blkio




或者,查看/proc/mounts文件也能看到挂载的文件系统:

1[baoniu@search0404.sqa.cm1 ~]$ cat/proc/mounts


2rootfs / rootfs rw 0 0


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


7/dev/sda1 /boot ext3


8cgroup /cgroup/cpuset cgroup rw,relatime,cpuset 0 0


9cgroup /cgroup/cpu cgroup rw,relatime,cpu 0 0


10cgroup /cgroup/cpuacct cgroup rw,relatime,cpuacct 0 0


11cgroup /cgroup/memory cgroup rw,relatime,memory 0 0


12cgroup /cgroup/devices cgroup rw,relatime,devices 0 0


13cgroup /cgroup/freezer cgroup rw,relatime,freezer 0 0


14cgroup /cgroup/net_cls cgroup rw,relatime,net_cls 0 0


15cgroup /cgroup/blkio cgroup rw,relatime,blkio 0 0




然后,查看 /cgroup 目录可以看到挂载后会出现响应的目录和文件:

1[baoniu@search0404.sqa.cm1]$ ll /cgroup/


2total 0


3drwxr-xr-x 2 root root 0 Jun 25 10:01 blkio


4drwxr-xr-x 2 root root 0 Jun 25 10:01 cpu


5drwxr-xr-x 2 root root 0 Jun 25 10:01 cpuacct


6drwxr-xr-x 2 root root 0 Jun 25 10:01 cpuset


7drwxr-xr-x 2 root root 0 Jun 25 10:01 devices


8drwxr-xr-x 2 root root 0 Jun 25 10:01 freezer


9drwxr-xr-x 2 root root 0 Jun 25 10:01 memory


10drwxr-xr-x 2 root root 0 Jun 25 10:01 net_cls


11[baoniu@search0404.sqa.cm1]$ ll /cgroup/cpuset


12total 0


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两个核,操作如下:

1sudomkdir/cgroup/cpuset/first_core      


2sudomkdir/cgroup/cpuset/second_core


3sudochown-R baoniu:users/cgroup/cpuset


4


5echo0 > /cgroup/cpuset/first_core/cpuset.mems


6echo1 > /cgroup/cpuset/first_core/cpuset.cpus


7echo10318 > /cgroup/cpuset/first_core/tasks


8


9echo0 > /cgroup/cpuset/second_core/cpuset.mems


10echo5-6 > /cgroup/cpuset/second_core/cpuset.cpus  


11echo10320 > /cgroup/cpuset//second_core/tasks




其中,在设置cpuset.cpus之前需要先设置内存节点cpuset.mems,详见NUMA

cgroup配置文件



/etc/cgconfig.conf是cgroup配置工具libcgroup用来进行cgroup组的定义,参数设定以及挂载点定义的配置文件,主要由mount和group两个section构成。(参考:cgroup介绍、安装和配置文件解析 

(1) mount section的语法格式如下:

1mount{


2<controller> = <path>;


3...


4}


5#########################################


6# controller:内核子系统的名称


7# path:该子系统的挂载点


8#########################################




例如:

1mount{


2cpu = /cgroup/cpu_test;


3}




上面的定义相当于如下shell指令:

mkdir /cgroup/cpu_test mount -t cgroup -o cpu cpu_test /cgroup/cpu_test

(2) group section的语法格式如下:

1group <name> {


2[<permissions>]


3<controller> {


4<param name> = <param value>;


5


6}


7


8}


9################################################################################


10## name: 指定cgroup的名称


11## permissions:可选项,指定cgroup对应的挂载点文件系统的权限,root用户拥有所有权限。


12## controller:子系统的名称


13## param name 和 param value:子系统的属性及其属性值


14#################################################################################




例如:

1mount{ ## 定义需要创建的cgroup子系统及其挂载点,这里创建cpu与cpuacct(统计)两个cgroup子系统


2cpu = /mnt/cgroups/cpu;


3cpuacct = /mnt/cgroups/cpu;


4}


5


6group daemons/www { ## 定义daemons/www(web服务器进程)组


7perm {    ## 定义这个组的权限


8task {


9uid = root;


10gid = webmaster;


11}


12admin {


13uid = root;


14gid = root;


15}


16}


17


18cpu {    ## 定义cpu子系统的属性及其值,即属于此组的任务的权重为1000


19cpu.shares = 1000;


20}


21}


22


23group daemons/ftp{ ## 定义daemons/ftp(ftp进程)组


24perm {


25task {


26uid = root;


27gid = ftpmaster;


28}


29admin {


30uid = root;


31gid = root;


32}


33}


34cpu {  ## 定义此组的任务的权重为500


35cpu.shares = 500;


36}


37}




上面配置文件定义相当于执行了如下shell命令:

1mkdir/mnt/cgroups/cpu


2mount-t cgroup -o cpu,cpuacct cpu /mnt/cgroups/cpu


3mkdir/mnt/cgroups/cpu/daemons


4mkdir/mnt/cgroups/cpu/daemons/www


5chownroot:root /mnt/cgroups/cpu/daemons/www/*


6chownroot:webmaster /mnt/cgroups/cpu/daemons/www/tasks


7echo1000 > /mnt/cgroups/cpu/daemons/www/cpu.shares


8mkdir/mnt/cgroups/cpu/daemons/ftp


9chownroot:root /mnt/cgroups/cpu/daemons/ftp/*


10chownroot:ftpmaster /mnt/cgroups/cpu/daemons/ftp/tasks


11echo500 > /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查看这些命令的用法,如

man cgclear

--转自 北京联动北方科技有限公司

该贴由koei123转至本版2015-6-1 15:09:20



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论