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 是将任意进程进行分组化管理的 Linux 内核功能。CGroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为 CGroup 子系统或控制器。CGroup 子系统有控制内存的 Memory 控制器、控制进程调度的 CPU 控制器等。运行中的内核可以使用的 Cgroup 子系统由/proc/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 ]
/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
小测试:可以执行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
计算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 ]
[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
[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/
若为2个CPU,则关掉一个
[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
[root@server4 ~]# dd if=/dev/zero of=/dev/null &
[root@server14]# cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &
当同时开一个正常的和一个限制的,则cpu首先分配给优先级高的
第三、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
第三、限制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