Docker的资源配额(cgroup)
什么是cgroup?
cgroup全称是control groups
cgroup是linux内核中的机制,这个机制可以根据特定的行为把一系列的任务,子任务整合或者分离,按照资源划分的等级的不同,从而实现资源统一控制的框架,cgoup可以控制、限制、隔离进程所需的物理资源,包括cpu、内存、IO,为容器虚拟化提供了支持,是构建docker一系列虚拟化的管理工具。
control groups:控制组,被整合在了linux内核当中,把进程(tasks)放到组里面,对组设置权限,对进程进行控制。可以理解为用户和组的概念,用户会继承它所在组的权限。
cgroup作用?
cgroup和namespace类似,也是讲进程分组,但是目的与namespace不一样,namespace是为了隔离进程组之前的资源,而cgroup是为了对一组进程进行统一的资源控制。
- 限制进程组可以使用的资源数量(Resource limiting )。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会触发OOM(out of memory)。
- 进程组的优先级控制(Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。
- 记录进程组使用的资源数量(Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间。
- 进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。
- 进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起和恢复。
cgroup子系统
这些具体的资源管理功能称为Cgroup子系统,有以下几大子系统实现:
Cgroup子系统 | 作用 |
---|---|
blkio | 设置限制每个块设备的输入输出控制,例如:磁盘、光盘、usb等等 |
CPU | 使用调度程序为cgroup任务提供CPU的访问 |
cpuacct | 产生cgroup任务的CPU资源报告 |
cpuset | 如果是多核心的CPU,这个子系统会为cgroup任务分配单独的CPU和内存 |
devices | 允许或拒绝cgroup任务对设备的访问 |
freezer | 暂停和恢复cgroup任务 |
memory | 设置每个cgroup的内存限制以及产生内存资源报告 |
net_cls | 标记每个网络包以供cgroup方便使用 |
ns | 命名空间子系统 |
perf_event | 增加了对每个group的检测跟踪能力,可以检测属于某个特定的group的所有线程以及运行在特定CPU上的线程 |
前言
默认情况下,容器时没有资源限制的,会尽可能的使用宿主机的资源,但是宿主机并不是所有资源都可以给,所以就需要对docker的容器进行一定的限制,这就用到了linux自带的cgroup来支持。
一、CPU的资源配额
1、CPU周期限制
默认情况下,每个容器对主机CPU周期的访问时无线的。您可以设置各种约束来限制给定容器对主机CPU周期的访问。大多数用户将使用和配置默认CFS调度程序。
2、配置默认的cfs调度程序
CFS是用于正常Linux进程的Linux内核CPU调度程序。几个运行时标志允许您配置容器对CPU资源的访问量。使用这些设置时,Docker将修改主机上容器的cgroup设置。
选项 | 描述 |
---|---|
–cpus= | 指定容器可以使用多少可用CPU资源。例如,如果主机有两个CPU,并且您设置了–cpus =“1.5”,那么该容器将保证最多可以访问一个半的CPU。这相当于设置–cpu-period =“100000”和–cpu-quota =“150000”。在Docker 1.13和更高版本中可用。 |
–cpu-period= | 指定CPU CFS调度程序周期,该周期与–cpu-quota一起使用。默认为100000微妙,以微秒表示。大多数用户不会从默认值更改此设置。如果您使用Docker 1.13或更高版本,请改用–cpus。 |
–cpu-quota= | 在容器上添加CPU CFS配额。每个–cpu-period允许CPU访问的容器数微秒数。换句话说,cpu-quota / cpu-period。如果您使用Docker 1.13或更高版本,请改用–cpus。 |
–cpuset-cpus | 限制容器可以使用的特定CPU或核心。如果您有多个CPU,则容器可以使用的逗号分隔列表或连字符分隔的CPU范围。第一个CPU编号为0.有效值可能为0-3(使用第一,第二,第三和第四个CPU)或1,3(使用第二个和第四个CPU)。 |
–cpu-shares | 将此标志设置为大于或小于默认值1024的值,以增加或减少容器的重量,并使其能够访问主机CPU周期的更大或更小比例。这仅在CPU周期受到限制时才会执行。当大量CPU周期可用时,所有容器都使用尽可能多的CPU。这样,这是一个软限制。–cpu-shares不会阻止容器在群集模式下进行调度。它优先考虑容器CPU资源的可用CPU周期。它不保证或保留任何特定的CPU访问权限。 |
1.查看CPU的资源限制
命令格式:
cat /sys/fs/cgroup/cpu/docker/[容器ID]/cpu.cfs_quota_us
例:
[root@docker ~]# docker run -itd --name test2 centos:7 /bin/bash
2964d084535d0670cdf79233a0d2e2a99620d1f0c93854ac8ca73944d4affd5e
[root@docker ~]# cat /sys/fs/cgroup/cpu/docker/2964d084535d0670cdf79233a0d2e2a99620d1f0c93854ac8ca73944d4affd5e/cpu.cfs_quota_us
-1
'//-1代表不进行任何限制'
--
2.手动修改文件以实现修改CPU限制
[root@docker ~]# echo 20000 > /sys/fs/cgroup/cpu/docker/2964d084535d0670cdf79233a0d2e2a99620d1f0c93854ac8ca73944d4affd5e/cpu.cfs_quota_us
[root@docker ~]# cat /sys/fs/cgroup/cpu/docker/2964d084535d0670cdf79233a0d2e2a99620d1f0c93854ac8ca73944d4affd5e/cpu.cfs_quota_us
20000
--
3.在运行容器的同时指定CPU限制条件
'以下这两个参数一般联合使用,控制容器可以分配到的CPU时钟周期'
'--cpu-period是用来指定容器对CPU的使用要在多长时间内做一次重新分配'
'--cpu-quota是用来指定在这个周期内,最多可以有多少时间来跑这个容器'
//创建容器是定义cpu配额
docker run -itd --name test1 --cpu-period=200000 --cpu-quota=100000 centos:7 /bin/bash
docker exec -it test1 /bin/bash
yum -y install epel-release && yum -y install stress
3、多任务比例分享CPU
当有多个容器任务同时运行时,很难计算 CPU 的使用率,我们可以设置 CPU 按照比例共享 CPU 资源,以实现使用率的动态调整
docker run -itd --name cpu1 --cpu-shares 1024 centos:7 /bin/bash
yum -y install epel-release
yum -y install stress
stress -c 10 &
docker exec -it *** bash
top '//查看CPU使用率'
--新开一个终端--
步骤和第一个类似到那时
docker run -itd --name test3 --cpu-shares 2048 centos:7 /bin/bash
'//对比CPU使用率,是1:2'
使用【–cpu-shares】,分配两个容器使用CPU资源占用权重为1:2
- 默认情况下,每个Docker容器的CPU份额都是1024,单独一个容器的份额是没有意义的,只有在同时运行多个容器时,容器CPU的加权效果才能体现出来
- 比如以上的两个容器是1:2,在CPU进行时间片分配时,后者比前者多一倍的机会获得CPU的时间片,但是分配的结果取决于当时主机和其他容器的运行状态
- 实际上也无法保证该容器一定获得相应的CPU时间片,因为若是该的进程一直是空闲的,那么cpu1就可以获取比cpu2更多的CPU时间片
- 在极端情况下,例如主机上只运行了一个容器,即使它的CPU份额较小,也是可以独占整个主机的CPU资源的
- Cgroups只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效,因此,无法根据某个容器的CPU份额来确定有多少CPU资源分给给它
- 即资源分配的结果取决于同时运行的其他容器CPU分配和容器中进程的运行情况
4、限制CPU内核使用
可以通过配置,使得某些程序独享 CPU 内核,以提高其处理速度
cat /sys/fs/cgroup/cpuset/docker/1da3b339530f1e256ff0206abb977659da494242b54c1fbeefc4b16ec0c49823/cpuset.cpus
docker run -itd --name test1 --cpuset-cpus 1 centos:7
docker exec -it test1 /bin/bash
yum -y install epel-release && yum -y install stress
stress -c 2 &
//在宿主机中
top//查看各个核心的使用情况
二、内存使用的限制
'与操作系统类似,容器可使用的内存包括两部分:物理内存和 Swap'
'-m 或 --memory:设置内存的使用限额'
'--memory-swap:设置内存+swap 的使用限额'
--
docker run -itd -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
'//--vm 1:启动1个内存工作线程'
'//--vm-bytes 280M:每个线程分配280M内存'
--
'相应的Cgroup配置文件:/sys/fs/cgroup/memory/memory.limit_in_bytes'
docker run -itd -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
'//如果让工作线程分配的内存超过300M,分配的内存超过了限额,stress线程会报错,容器退出'
--
'注意!一旦容器Cgroup使用的内存超过了限制的容量,Linux内核就会尝试收回这些内存'
'如果仍旧无法控制内存使用在这个设置的范围之内,就会杀死该进程!'
docker run -itd --name test1 -m 200m centos:7 /bin/bash
docker stats
虚拟机没配置swap分区所以无法对swap实现限制。
三、磁盘使用的限制
对读写进行限制
bps:byte per second(每秒读写的字节数)
iops:io per second(每秒IO的次数)
--
1.限制某个程序写入的bps数据量
docker run -d --device-write-bps /dev/sda:30M centos:7
2.限制读取某个程序的bps数据量
docker run -d --device-read-bps /dev/sda:30M centos:7
3.限制读取某个程序的iops次数
--device-read-iops
4.限制写入某个程序的iops次数
--device-write-iops
对读写进行权重进行限制
- 默认情况下,所有容器能平等地读写磁盘,可以通过设置–blkio-weight参数来改变容器 block IO的优先级。
- –blkio-weight 与–cpu-shares类似,设置的是相对权重值,默认为500。
docker run -it --name test1 --blkio-weight 600 centos:1
cat /sys/fs/cgroup/blkio/blkio.weight
docker run -it --name test2 --blkio-weight 300 centos:1
cat /sys/fs/cgroup/blkio/blkio.weight
test1容器:
docker exec -it test1 /bin/bash
yum -y install epel-release && yum -y install stress
stress --hdd 2 --hdd-bytes 10G --backoff 2000000
//对磁盘开启两个io进程,读写大小为10G ,新fork 出来的进程 sleep 2000000 微秒再开始运行。
test2容器:
docker exec -it test1 /bin/bash
yum -y install epel-release && yum -y install stress
stress --hdd 2 --hdd-bytes 10G --backoff 2000000
//对磁盘开启两个io进程,读写大小为10G ,新fork 出来的进程 sleep 2000000 微秒再开始运行。
宿主机:
docker stats
秒再开始运行。
test2容器:
docker exec -it test1 /bin/bash
yum -y install epel-release && yum -y install stress
stress --hdd 2 --hdd-bytes 10G --backoff 2000000
//对磁盘开启两个io进程,读写大小为10G ,新fork 出来的进程 sleep 2000000 微秒再开始运行。文章来源:https://www.toymoban.com/news/detail-470772.html
宿主机:
docker stats文章来源地址https://www.toymoban.com/news/detail-470772.html
![image-20220907193006629](https://img-blog.csdnimg.cn/img_convert/75e2ccafa89d4576e4c5f22de97f1be6.png)
到了这里,关于Docker的资源配额的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!