扩展:Control Group(CGroup)资源限制组
控制组(CGroups)是Linux内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免多个容器同时运行时对宿主机系统的资源竞争。控制组可以提供对容器的内存、CPU、磁盘IO等资源进行限制和计费管理。控制组的设计目标是为不同的应用情况提供统一的接口,从控制单一进程(比如nice工具)到系统级虚拟化(包括OpenVZ、Linux-VServer、LXC等)。
具体来看,控制组提供:
资源限制(Resource limiting):可以将组设置为不超过设定的内存限制。比如:内存子系统可以为进程组设定一个内存使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发Out of Memory警告。
优先级(Prioritization):通过优先级让一些组优先得到更多的CPU等资源。
资源审计(Accounting):用来统计系统实际上把多少资源用到适合的目的上,可以使用cpuacct子系统记录某个进程组使用的CPU时间。
隔离(isolation):为组隔离命名空间,这样一个组不会看到另一个组的进程、网络连接和文件系统。
控制(Control):挂起、恢复和重启动等操作。
cgroups: Control Groups
基于进程的限制,而非用户,因此对于超户运行的进程也是一样
cgroup将各种子系统定义为资源,命名为controller:
可配额/可度量 - Control Groups (cgroups)
cgroups实现了对资源的配额和度量九大子系统的资源
-
blkio 限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb
-
cpu 限制使用cpu比例
-
cpuacct 产生cgroup任务的cpu资源报告。
-
cpuset 多核心的cpu时为cgroup任务分配单独的cpu和内存
-
devices 允许或拒绝对设备的访问。
-
freezer 暂停和恢复cgroup任务。
-
memory 设置内存限制以及产生内存资源报告。
-
net_cls 标记每个网络包。
-
ns 名称空间子系统
例如:对某个进程使用内存进行限制步骤:
- 需要在controller memory下建立cgroup,如nginx_mem控制组,并针对该控制组nginx_mem设置相应的内存限制参数
- 将进程Nginx分配到 memory controller的控制组(nginx_mem),没有使用controller则不会限制。
Cgroup实现资源限制的方法:
a. cgexec 手动分配
b. cgred 自动分配
Cgroup部署方法:
[root@localhost ~]#yum -y install libcgroup*
[root@localhost ~]#systemctl enable cgconfig
[root@localhost ~]#systemctl start cgconfig
[root@localhost ~]#man cgconfig.conf
Cgroup限制步骤:
- 创建cgroup,定义相应的限制
- 分配程序到cgroup
案例1:限制进程使用CPU
- 使用cpu子系统创建两个cgroup
[root@localhost ~]#vim /etc/cgconfig.conf
group lesscpu {
cpu {
cpu.shares=200;
}
}
group morecpu {
cpu {
cpu.shares=800;
}
}
[root@localhost ~]#systemctl restart cgconfig
2.将程序分配到相应的group
实验中,为了让两个进程抢CPU时间片,故意只留一个CPU在线
[root@localhost ~]#lscpu
[root@localhost ~]#echo 0 > /sys/devices/system/cpu/cpu0/online
[root@localhost ~]#echo 1 > /sys/devices/system/cpu/cpu1/online
手动分配:
[root@localhost ~]#cgexec -g cpu:lesscpu sha1sum /dev/zero
[root@localhost ~]#cgexec -g cpu:morecpu md5sum /dev/zero
[root@localhost ~]#top
以上三条命令请在三个shell终端中打开,观察各进程所占用CPU情况。
案例2:限制进程使用Memory
- 添加cgroup
[root@localhost ~]#vim /etc/cgconfig.conf
group lessmem {
memory {
memory.limit_in_bytes=268435465; //物理内存限制256M
}
}
[root@localhost ~]#systemctl restart cgconfig
- 创建内存盘
[root@localhost ~]# mkdir /mnt/mem_test
[root@localhost ~]#mount -t tmpfs /dev/shm /mnt/mem_test
[root@localhost ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=200 //OK
[root@localhost ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=500 //OK
[root@localhost ~]#free -m
结果为失败
- 创建cgroup
[root@localhost ~]#vim /etc/cgconfig.conf
group poormem{
memory{
memory.limit_in_bytes=268435465; //物理内存限制256M
memory.memsw.limit_in_bytes=268435465; //总内存限制,物理+SWAP
}
}
[root@localhost ~]#systemctl restart cgconfig
- 创建内存盘并测试
[root@localhost ~]# mkdir /mnt/mem_test
[root@localhost ~]# mount -t tmpfs /dev/shm /mnt/mem_test
[root@localhost ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=200 //OK
[root@localhost ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=500 //Fail
[root@localhost ~]#free -m