控制组(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实现了对资源的配额和度量九大子系统的资源
1. blkio 限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb
2. cpu 限制使用cpu比例
3. cpuacct 产生cgroup任务的cpu资源报告。
4. cpuset 多核心的cpu时为cgroup任务分配单独的cpu和内存
5. devices 允许或拒绝对设备的访问。
6. freezer 暂停和恢复cgroup任务。
7. memory 设置内存限制以及产生内存资源报告。
8. net_cls 标记每个网络包。
9. ns 名称空间子系统
例如:对某个进程使用内存进行限制步骤:
1. 需要在controller memory下建立cgroup,如nginx_mem控制组,并针对该控制组nginx_mem设置相应的内存 限制参数
2. 将进程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限制步骤
1,创建cgroup,定义相应的限制
2,分配程序到cgroup
案例1:限制进程使用CPU
1,使用cpu子系统创建两个cgroup
配置文件添加配置
#cat /etc/cgconfig.conf group lesscpu { cpu { cpu.shares=200; } } group morecpu { cpu { cpu.shares=800; } }
创建两个组lesscpu和morecpu 200 800指定分配的份额
重启服务
[root@localhost ~]#systemctl restart cgconfig1
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情况。
PS:未成功,设置CPU下线不成功
案例2:限制进程使用Memory
添加cgroup
#cat /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
结果为失败
应该写成如下
group poormem{ memory{ memory.limit_in_bytes=268435465; //物理内存限制256M memory.memsw.limit_in_bytes=268435465; //总内存限制,物理+SWAP } }