cgroup介绍

cgroup是control group的简称,它为Linux内核提供了一种任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。

Cgroups是control groups的缩写,最初由Google工程师提出,后来编进linux内核。

Cgroups是实现IaaS虚拟化(kvm、lxc等),PaaS容器沙箱(Docker等)的资源管理控制部分的底层基础

子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源,目前,redhat默认支持10个子系统,但默认只挂载了8个子系统,ubuntu 12.04 默认支持8个子系统,但默认只挂载了5个子系统。

cgroup子系统介绍

当然也用户可以自定义子系统并进行挂载。

下面对每一个子系统进行简单的介绍:

  1. blkio 设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。

  2. cpu 使用调度程序为cgroup任务提供cpu的访问。

  3. cpuacct 产生cgroup任务的cpu资源报告。

  4. cpuset 如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存。

  5. devices 允许或拒绝cgroup任务对设备的访问。

  6. freezer 暂停和恢复cgroup任务。

  7. memory 设置每个cgroup的内存限制以及产生内存资源报告。

  8. net_cls 标记每个网络包以供cgroup方便使用。

  9. ns 名称空间子系统。

  10. perf_event 增加了对每group的监测跟踪的能力,即可以监测属于某个特定的group的所有线程以及             运行在特定CPU上的线程,此功能对于监测整个group非常有用,具体参见 http://lwn.net/Articles/421574/

libcgroup工具安装

以Centos 6.4为例

yum install libcgroup

service cgconfig start   #开启cgroups服务

chkconfig cgconfig on   #开机启动

[root@localhost /]# ls /cgroup/
blkio  cpu  cpuacct  cpuset  devices  freezer  memory  net_cls

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

cgroup配置文件分析

/etc/cgconfig.conf是cgroup配置工具libcgroup用来进行cgroup组的定义,参数设定以及挂载点定义的配置文件,

主要由mount和group两个section构成。

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

mount {<controller> = <path>;...
}
#########################################
# controller:内核子系统的名称
# path:该子系统的挂载点
#########################################
举个例子:mount {cpuset = /cgroup/red;
}
上面定义相当于如下shell指令:mkdir /cgroup/red
mount -t cgroup -o cpuset red /cgroup/red

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

group <name> {[<permissions>]<controller> {<param name> = <param value>;…}…
}
################################################################################
## name: 指定cgroup的名称
## permissions:可选项,指定cgroup对应的挂载点文件系统的权限,root用户拥有所有权限。
## controller:子系统的名称
## param name 和 param value:子系统的属性及其属性值
#################################################################################
举个例子:mount {  ## 定义需要创建的cgroup子系统及其挂载点,这里创建cpu与cpuacct(统计)两个cgroup子系统cpu = /mnt/cgroups/cpu;cpuacct = /mnt/cgroups/cpu;
}group daemons/www { ## 定义daemons/www(web服务器进程)组perm {      ## 定义这个组的权限task {uid = root;gid = webmaster;}admin {uid = root;gid = root;}}cpu {      ## 定义cpu子系统的属性及其值,即属于词组的任务的权重为1000cpu.shares = 1000;}
}group daemons/ftp { ## 定义daemons/ftp(ftp进程)组perm {task {uid = root;gid = ftpmaster;}admin {uid = root;gid = root;}}cpu {  ## 定义词组的任务的权重为500cpu.shares = 500;}
}
上面配置文件定义相当于执行了如下shell命令:mkdir /mnt/cgroups/cpu
mount -t cgroup -o cpu,cpuacct cpu /mnt/cgroups/cpu
mkdir /mnt/cgroups/cpu/daemons
mkdir /mnt/cgroups/cpu/daemons/www
chown root:root /mnt/cgroups/cpu/daemons/www/*
chown root:webmaster /mnt/cgroups/cpu/daemons/www/tasks
echo 1000 > /mnt/cgroups/cpu/daemons/www/cpu.shares
mkdir /mnt/cgroups/cpu/daemons/ftp
chown root:root /mnt/cgroups/cpu/daemons/ftp/*
chown root:ftpmaster /mnt/cgroups/cpu/daemons/ftp/tasks
echo 500 > /mnt/cgroups/cpu/daemons/ftp/cpu.shares

对于虚拟机VM,应用沙盒,cgroups技术选型比较

cgroups资源控制

cgroups管理进程cpu资源

跑一个耗cpu的脚本

x=0

while [ True ];do

x=$x+1

done;

top可以看到这个脚本基本占了100%的cpu资源

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

30142 root      20   0  104m 2520 1024 R 99.7  0.1  14:38.97 sh

下面用cgroups控制这个进程的cpu资源

mkdir -p /cgroup/cpu/foo/   #新建一个控制组foo

echo 50000 > /cgroup/cpu/foo/cpu.cfs_quota_us  #将cpu.cfs_quota_us设为50000,相对于cpu.cfs_period_us的100000是50%

echo 30142 > /cgroup/cpu/foo/tasks

然后top的实时统计数据如下,cpu占用率将近50%,看来cgroups关于cpu的控制起了效果

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                         30142 root      20   0  105m 2884 1024 R 49.4  0.2  23:32.53 sh

cpu控制组foo下面还有其他的控制,还可以做更多其他的关于cpu的控制

[root@localhost ~]# ls /cgroup/cpu/foo/

cgroup.event_control  cgroup.procs  cpu.cfs_period_us  cpu.cfs_quota_us  cpu.rt_period_us  cpu.rt_runtime_us  cpu.shares  cpu.stat  notify_on_release  tasks

cgroups管理进程内存资源

跑一个耗内存的脚本,内存不断增长

x="a"

while [ True ];do

x=$x$x

done;

top看内存占用稳步上升

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                         30215 root      20   0  871m 501m 1036 R 99.8 26.7   0:38.69 sh

30215 root      20   0 1639m 721m 1036 R 98.7 38.4   1:03.99 sh

30215 root      20   0 1639m 929m 1036 R 98.6 49.5   1:13.73 sh

下面用cgroups控制这个进程的内存资源

mkdir -p /cgroup/memory/foo

echo 1048576 >  /cgroup/memory/foo/memory.limit_in_bytes   #分配1MB的内存给这个控制组

echo 30215 > /cgroup/memory/foo/tasks

发现之前的脚本被kill掉

[root@localhost ~]# sh /home/memory.sh

已杀死

因为这是强硬的限制内存,当进程试图占用的内存超过了cgroups的限制,会触发out of memory,导致进程被kill掉。

实际情况中对进程的内存使用会有一个预估,然后会给这个进程的限制超配50%比如,除非发生内存泄露等异常情况,才会因为cgroups的限制被kill掉。

也可以通过配置关掉cgroups oom kill进程,通过memory.oom_control来实现(oom_kill_disable 1),但是尽管进程不会被直接杀死,但进程也进入了休眠状态,无法继续执行,仍让无法服务。

关于内存的控制,还有以下配置文件,关于虚拟内存的控制,以及权值比重式的内存控制等

[root@localhost /]# ls /cgroup/memory/foo/

cgroup.event_control  memory.force_empty         memory.memsw.failcnt

memory.memsw.usage_in_bytes      memory.soft_limit_in_bytes  memory.usage_in_bytes  tasks

cgroup.procs          memory.limit_in_bytes      memory.memsw.limit_in_bytes

memory.move_charge_at_immigrate  memory.stat                 memory.use_hierarchy

memory.failcnt        memory.max_usage_in_bytes  memory.memsw.max_usage_in_bytes

memory.oom_control               memory.swappiness           notify_on_release

cgroups管理进程io资源

跑一个耗io的脚本

dd if=/dev/sda of=/dev/null &

通过iotop看io占用情况,磁盘速度到了284M/s

30252 be/4 root      284.71 M/s    0.00 B/s  0.00 %  0.00 % dd if=/dev/sda of=/dev/null

下面用cgroups控制这个进程的io资源

mkdir -p /cgroup/blkio/foo

echo '8:0   1048576' >  /cgroup/blkio/foo/blkio.throttle.read_bps_device

#8:0对应主设备号和副设备号,可以通过ls -l /dev/sda查看

echo 30252 > /cgroup/blkio/foo/tasks

再通过iotop看,确实将读速度降到了1M/s

30252 be/4 root      993.36 K/s    0.00 B/s  0.00 %  0.00 % dd if=/dev/sda of=/dev/null

对于io还有很多其他可以控制层面和方式,如下

[root@localhost ~]# ls /cgroup/blkio/foo/

blkio.io_merged         blkio.io_serviced      blkio.reset_stats

blkio.throttle.io_serviced       blkio.throttle.write_bps_device   blkio.weight          cgroup.procs

blkio.io_queued         blkio.io_service_time  blkio.sectors

blkio.throttle.read_bps_device   blkio.throttle.write_iops_device  blkio.weight_device   notify_on_release

blkio.io_service_bytes  blkio.io_wait_time     blkio.throttle.io_service_bytes

blkio.throttle.read_iops_device  blkio.time                        cgroup.event_control  tasks

参考

http://blog.chinaunix.net/uid-20940095-id-3294134.html

http://www.cnblogs.com/yanghuahui/p/3751826.html

cgroup介绍、安装和控制cpu,内存,io示例相关推荐

  1. Linux 查看CPU 内存 IO使用率,linux 查看CPU内存 网络 流量 磁盘 IO

    使用vmstat命令来察看系统资源情况 在命令行方式下,如何查看CPU.内存的使用情况,网络流量和磁盘I/O? Q: 在命令行方式下,如何查看CPU.内存的使用情况,网络流量和磁盘I/O? A: 在命 ...

  2. 用PerformanceCounter做进程的CPU内存IO监控示例

    1.PerformanceCounter有很多Category,监控进程时Category为Process.它下面有一些windows已实现的PerformanceCounter public sta ...

  3. linux性能测试cpu内存io,Linux下磁盘IO性能测试工具介绍

    近来想了解一下开发环境的IO性能,分别用dd/orion/iozone/bonnie++四种工具测试了一下 开发环境系统配置如下: Intel SR1625 server, 2 CPU, 32GB内存 ...

  4. 虚拟化技术简介--CPU/内存/IO/网络虚拟化介绍

    1. 概述 本文讨论的虚拟化,是指将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响. 2. ...

  5. linux内存跑分,RaspberryPi 4B 4G版本跑分测|CPU|内存|IO|网络|性能全面测试

    前言 拿到手最新的RaspberryPi 4B 4G版本,新版本的4修复了之前的硬件bug. 直接官方安装软件刷上了最新版本的Linux raspberrypi 4.19.97,MicroSD卡选用的 ...

  6. python glances来监控linux服务器CPU 内存 IO使用

    什么是 Glances? Glances 是一个由 Python 编写,使用 psutil 库来从系统抓取信息的基于 curses 开发的跨平台命令行系统监视工具. 通过 Glances,我们可以监视 ...

  7. css控制边界与边框示例(内边距、外边距使用方法)

    这篇文章主要介绍了css控制边界与边框示例,需要的朋友可以参考下 一.CSS控制边界 1.内边距 padding(内边距也叫内填充) padding-bottom 长度/百分比 元件下端边线的空隙 p ...

  8. Linux下CGroup进行CPU内存等资源控制

    留存 from: http://www.cnblogs.com/kevingrace/p/5685433.html  and  http://www.cnblogs.com/wang_yb/p/394 ...

  9. Linux资源控制-使用cgroup控制CPU和内存

    原文地址:http://www.cnblogs.com/wang_yb/p/3942208.html 主要介绍Linux下, 如果对进程的CPU和内存资源的使用情况进行控制的方法. CPU资源控制 每 ...

最新文章

  1. 自然语言处理-Word2Vec
  2. 我来悟微服务(3)-需求管理
  3. iOS:多线程的详细介绍
  4. Makefile中的变量
  5. linux 有线网络管理,uos linux网络管理
  6. LeetCode 1689. 十-二进制数的最少数目(脑筋急转弯)
  7. VS2010编译器经常遇到的小问题
  8. 第一章节 初始类和对象
  9. ASP.NET Development Server的Directory Browsing模式HTML垃圾代码
  10. 小米电视android版本最好,小米电视安装当贝桌面+安卓TV最简单好用的NAS播放器...
  11. 已知鸡和兔的总数量n,总脚数为m。输入n和m,依次输出鸡和兔的数目。如果无解,输出“no answer”。 将下面的代码填写完整。
  12. 使用百度人工智能识别表格
  13. Windows程序开机自启动
  14. 苹果专用视频下载工具:Downie 3 for Mac
  15. 【成长必备】我为什么推荐你写博客?愿你多年以后成为你想成为的样子。
  16. 听文字 - win10系统最简单的txt自动语音阅读 - 在线txt文字转语音 - 刷题神器 - 听新闻的办法 - 人工智能语音朗读 - 文字转语音真人发声 - 粤语听txt文字 - 戴耳机刷题
  17. OpenCV将视频转存为一帧帧的图片(Python)
  18. 2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录
  19. 详解802.11n无线技术
  20. 同样的安全,不一样的SAME

热门文章

  1. 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
  2. GGGit与Github
  3. mpvue开发小程序所遇问题及h5转化方案
  4. 一张图看懂混合云数据同步一站式解决方案
  5. 水晶报表设置FiledObject支持HTML格式的数据
  6. 使用Hexo在Github搭建静态博客
  7. 好程序员web前端CSS选择符(选择器):表示要定义样式的对象
  8. Mysql关闭和修改密码
  9. Python之旅.第四章.模块与包
  10. 在MVC控制器里面使用dynamic和ExpandoObject,实现数据转义的输出