docker的cgroup篇

一、对cgroup的认识:

Linux系统中经常有个需求就是希望能限制某个或者某些进程的分配资源。于是就出现了cgroups的概念,cgroup就是controller group,在这个group中,又分配好的特定比例的CPU时间,IO时间,可用内存大小等。cgroups是将任意进程进行分组化管理的Linux内核功能。最初由Google的工程师提出,后来被整合进Linux内核中。
cgroups中的重要概念是”子系统”,也就是资源控制器,每种子系统就是一个资源的分配器,比如CPU子系统是控制CPU时间分配的。首先挂载子系统,然后才有control group的。比如先挂载memory子系统,然后在memory子系统中创建一个cgroup节点,在这个节点中,将需要控制的进程id写入,并且将控制的属性写入,这就完成了内存的资源限制。
cgroups被Linux内核支持,有得天独后的性能优势,发展势头迅猛。在很多领域可以取代虚拟化技术分割资源。cgroup默认有诸多资源组,可以限制几乎所以服务器上的资源:cpu mem iops,
iodbandwide,net,device acess等。

cgroup 功能及组成

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

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

二、CGroup子系统介绍:

blkio – 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。

cpu – 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。

cpuacct – 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。

cpuset – 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。

devices – 这个子系统可允许或者拒绝 cgroup 中的任务访问设备。

freezer – 这个子系统挂起或者恢复 cgroup 中的任务。

memory – 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。
net_cls – 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。
ns – 名称空间子系统。

实验环境:一台虚拟机
一、对内存大小进行限制

[root@server4 ~]# yum install libcgroup.x86_64 -y
[root@server4 ~]# /etc/init.d/cgconfig start
Starting cgconfig service:                                 [  OK  ]
[root@server4 ~]# 
[root@server4 ~]# cd /cgroup/
[root@server4 cgroup]# cd memory/
[root@server4 memory]# cat memory.limit_in_bytes #查看限制字节数
9223372036854775807
限制内存的大小为200M
[root@server4 memory]# vim /etc/cgconfig.conf 
group x1 {
        memory {
                memory.limit_in_bytes = 20480000;
                memory.memsw.limit_in_bytes = 20480000;
        }
}

退出重启
[root@server4 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service:                                 [  OK  ]
Starting cgconfig service:                                 [  OK  ]

docker的cgroup篇_第1张图片
测试:

/dev/shm/是linux下一个非常有用的目录,因为这个目录不在硬盘上,而是在内存里,在linux下,它默认最大为内存的一半大小
[root@server4 ~]# cd /dev/shm/
[root@server4 shm]# free -m
             total       used       free     shared    buffers     cached
Mem:           996        275        721          0         14        159
-/+ buffers/cache:        101        895
Swap:          991          0        991
[root@server4 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file1 bs=1M count=190
190+0 records in
190+0 records out
199229440 bytes (199 MB) copied, 0.138287 s, 1.4 GB/s
[root@server4 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file2 bs=1M count=300
Killed
[root@server4 shm]# free -m
             total       used       free     shared    buffers     cached
Mem:           996        474        521          0         14        358
-/+ buffers/cache:        101        894
Swap:          991          0        991

docker的cgroup篇_第2张图片
小测试:可以执行memapp1 不可以执行memapp2,执行脚本的内存限制
这里牵扯到内存页的问题:
CPU的页式内存管理单元,负责把一个线性地址,最终翻译为一个物理地址。从管理和效率的角度出发,线性地址被分为以固定长度为单位的组,称为页(page),页目录和页表中的项,都是4个字节。

[root@server4 ~]# ls
memapp1  memapp2
[root@server4 ~]# chmod +x memapp*
[root@server4 ~]# yum install /lib/ld-linux.so.2 -y
[root@server4 ~]# ./memapp1

Process ID is: 7272

Grabbing 4096 pages of memory

Success!

Press any key to exit

[root@server4 ~]# ./memapp2

Process ID is: 7273

Grabbing 8192 pages of memory

Success!

Press any key to exit

docker的cgroup篇_第3张图片

计算5000页所占用的字节数,5000介于memapp1和2之间,可以作为选择
[root@server4 ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
5000*4*1024
20480000
[root@server4 ~]# vim /etc/cgconfig.conf 
group x2 {
        cpu {
                cpu.shares = 100;
  }
}

[root@server4 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service:                                 [  OK  ]
Starting cgconfig service:                                 [  OK  ]
[root@server4 ~]# 
指定用户执行操作
[root@server4 ~]# vim /etc/cgrules.conf 
aaa:memapp1     memory          x1/
aaa:memapp2     memory          x1/
~                                   
[root@server4 ~]# /etc/init.d/cgred restart
Stopping CGroup Rules Engine Daemon...                     [  OK  ]
Starting CGroup Rules Engine Daemon:                       [  OK  ]

docker的cgroup篇_第4张图片
docker的cgroup篇_第5张图片
测试:

[root@server4 ~]# useradd aaa
[root@server4 ~]# mv * /home/aaa/
[root@server4 ~]# su -  aaa
[aaa@server4 ~]$ ./memapp1
Process ID is: 7325

Grabbing 4096 pages of memory

Success!

Press any key to exit

[aaa@server4 ~]$ ./memapp2

Process ID is: 7326

Grabbing 8192 pages of memory
Killed

docker的cgroup篇_第6张图片
第二、控制cpu的优先级

[root@server4 ~]# vim /etc/cgconfig.conf 
group x2 {
        cpu {
                cpu.shares = 100;
  }
}

[root@server4 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service:                                 [  OK  ]
Starting cgconfig service:                                 [  OK  ]
[root@server4 ~]# cd /sys/devices/system/cpu/
  若为2CPU,则关掉一个
[root@server4 ~]# cd /sys/devices/system/cpu/cpu1    (注意:cpu0不可以关掉,里面都没有online的选择)
[root@server4 cpu1]# cat online     ##状态为1,表示cpu正在工作
    1    
[root@server4 cpu1]# echo 0 > online     ##状态为0,表示关掉cpu

docker的cgroup篇_第7张图片
测试:

    [root@server4 ~]# dd if=/dev/zero of=/dev/null &
      [root@server14]# cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &

当同时开一个正常的和一个限制的,则cpu首先分配给优先级高的
docker的cgroup篇_第8张图片
第三、I/O限制:
查看所限制设备的类型:

[root@server4 ~]# ll /dev/vda
brw-rw----. 1 root disk 252, 0 Aug 23 09:43 /dev/vda
限制设备读为1M/s
[root@server4 ~]# vim /etc/cgconfig.conf
 group x3 {
        blkio {
                blkio.throttle.read_bps_device = "252:0 1000000";
        }
}

[root@server4 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service:                                 [  OK  ]
Starting cgconfig service:                                 [  OK  ]
[root@server4 ~]# yum install iotop
[root@server4 ~]# cgexec -g blkio:x3 dd if=/dev/vda of=/dev/null &
[2] 7466
[1]   Terminated              cgexec -g blkio:x3 dd if=/dev/zero of=/dev/null
[root@server4 ~]# yum install -y iotop
[root@server4 ~]# iotop

测试:
查看读的速率大概为1M左右
docker的cgroup篇_第9张图片

第三、限制freezer:

[root@server4 ~]# vim /etc/cgconfig.conf 
group x4 {
        freezer{}
}

[root@server4 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service:                                 [  OK  ]
Starting cgconfig service:                                 [  OK  ]
[root@server4 ~]# cd /cgroup/freezer/
[root@server4 freezer]# ls
cgroup.event_control  cgroup.procs  notify_on_release  release_agent  tasks  x4
[root@server4 freezer]# cd x4/
[root@server4 x4]# ls
cgroup.event_control  cgroup.procs  freezer.state  notify_on_release  tasks
[root@server4 x4]# echo 7475 > tasks 
[root@server4 x4]# cat freezer.state 
THAWED活跃状态
[root@server4 x4]# echo FROZEN > freezer.state 冻结状态
[root@server4 x4]# top

虽然进程为冻结状态,但是分配的资源并没有被释放
docker的cgroup篇_第10张图片

你可能感兴趣的:(docker)