当前位置:   article > 正文

Docker的资源配额_docker cpu分配

docker cpu分配

Docker的资源配额(cgroup)

什么是cgroup?

cgroup全称是control groups

cgroup是linux内核中的机制,这个机制可以根据特定的行为把一系列的任务,子任务整合或者分离,按照资源划分的等级的不同,从而实现资源统一控制的框架,cgoup可以控制、限制、隔离进程所需的物理资源,包括cpu、内存、IO,为容器虚拟化提供了支持,是构建docker一系列虚拟化的管理工具。

control groups:控制组,被整合在了linux内核当中,把进程(tasks)放到组里面,对组设置权限,对进程进行控制。可以理解为用户和组的概念,用户会继承它所在组的权限。

cgroup作用?

cgroup和namespace类似,也是讲进程分组,但是目的与namespace不一样,namespace是为了隔离进程组之前的资源,而cgroup是为了对一组进程进行统一的资源控制。

  1. 限制进程组可以使用的资源数量(Resource limiting )。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会触发OOM(out of memory)。
  2. 进程组的优先级控制(Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。
  3. 记录进程组使用的资源数量(Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间。
  4. 进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。
  5. 进程组控制(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是用来指定在这个周期内,最多可以有多少时间来跑这个容器'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

image-20220907171118798

image-20220907171839145

//创建容器是定义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
  • 1
  • 2
  • 3
  • 4

image-20220907183156731

image-20220907184133711

image-20220907184241405

image-20220907184412542

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'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

使用【–cpu-shares】,分配两个容器使用CPU资源占用权重为1:2

  1. 默认情况下,每个Docker容器的CPU份额都是1024,单独一个容器的份额是没有意义的,只有在同时运行多个容器时,容器CPU的加权效果才能体现出来
  2. 比如以上的两个容器是1:2,在CPU进行时间片分配时,后者比前者多一倍的机会获得CPU的时间片,但是分配的结果取决于当时主机和其他容器的运行状态
  3. 实际上也无法保证该容器一定获得相应的CPU时间片,因为若是该的进程一直是空闲的,那么cpu1就可以获取比cpu2更多的CPU时间片
  4. 在极端情况下,例如主机上只运行了一个容器,即使它的CPU份额较小,也是可以独占整个主机的CPU资源的
  5. Cgroups只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效,因此,无法根据某个容器的CPU份额来确定有多少CPU资源分给给它
  6. 即资源分配的结果取决于同时运行的其他容器CPU分配和容器中进程的运行情况

image-20220907173522521

image-20220907174216394

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//查看各个核心的使用情况
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

image-20220907184707251

image-20220907190046426

二、内存使用的限制

'与操作系统类似,容器可使用的内存包括两部分:物理内存和 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内核就会尝试收回这些内存'
'如果仍旧无法控制内存使用在这个设置的范围之内,就会杀死该进程!'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
docker run -itd --name test1 -m 200m centos:7 /bin/bash
docker stats
  • 1
  • 2

image-20220907190942455

image-20220907191014080

虚拟机没配置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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

对读写进行权重进行限制

  1. 默认情况下,所有容器能平等地读写磁盘,可以通过设置–blkio-weight参数来改变容器 block IO的优先级。
  2. –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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

image-20220907191850613

image-20220907191948141

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    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

秒再开始运行。

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


![image-20220907193006629](https://img-blog.csdnimg.cn/img_convert/75e2ccafa89d4576e4c5f22de97f1be6.png)
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/707934
推荐阅读
相关标签
  

闽ICP备14008679号