Docker的资源配额

这篇具有很好参考价值的文章主要介绍了Docker的资源配额。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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是用来指定在这个周期内,最多可以有多少时间来跑这个容器'

Docker的资源配额

Docker的资源配额

//创建容器是定义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

Docker的资源配额

Docker的资源配额

Docker的资源配额

Docker的资源配额

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

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

Docker的资源配额

Docker的资源配额

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//查看各个核心的使用情况

Docker的资源配额

Docker的资源配额

二、内存使用的限制

'与操作系统类似,容器可使用的内存包括两部分:物理内存和 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

Docker的资源配额

Docker的资源配额

虚拟机没配置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. 默认情况下,所有容器能平等地读写磁盘,可以通过设置–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

Docker的资源配额

Docker的资源配额

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 微秒再开始运行。

宿主机:
docker stats文章来源地址https://www.toymoban.com/news/detail-470772.html


![image-20220907193006629](https://img-blog.csdnimg.cn/img_convert/75e2ccafa89d4576e4c5f22de97f1be6.png)

到了这里,关于Docker的资源配额的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【云原生】Docker网络及Cgroup资源控制

    Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直

    2024年02月16日
    浏览(33)
  • docker网路原理及cgroup硬件资源占用控制

    docker网络模式有bridge、host、none、containe和自定义 1.host模式 相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。 Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。 一个Network N

    2024年02月08日
    浏览(33)
  • 500行代码手写docker-实现硬件资源限制cgroups

    本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。 本章的源码已经上传到github,地址如下: 之前我们对容器的网络命

    2024年02月06日
    浏览(30)
  • Linux Cgroups进程资源限制管理 之 资源子系统限制/控制、Docker资源隔离与限制原理解读

    Linux cgroups(控制组)最初由Google工程师Paul Menage在2006年提出,并在Linux内核的2.6.24版本中首次引入。自那时以来,cgroups一直是Linux内核的一部分,并在容器化技术等领域中发挥着至关重要的作用。随着时间的推移,cgroups功能不断得到改进和扩展,以满足对资源管理和隔离性能

    2024年02月21日
    浏览(32)
  • linux 内核资源配置--cgroups详解以及在docker中的应用

    1.1、cgroups 是什么 Linux cgroup (Control Groups)是 Linux 内核提供的一种机制, 用于限制进程组使用的资源(如 CPU、内存、磁盘 I/O 等) 。通过将进程组划分为层次结构,并将资源限制应用于不同层次的组,可以实现对系统资源的统一管理和限制。 cgroup 提供了一套 API,用于创建

    2024年02月16日
    浏览(34)
  • pod的requests、limits解读、LimitRange资源配额、Qos服务质量等级、资源配额管理 Resource Quotas

    环境: k8s-v1.22.17 docker-20.10.9 centos-7.9 CPU、GPU、Memory等都是计算资源,所谓计算资源,就是可计量的、能被申请的、能被分配使用的资源。 CPU在容器技术中属于可压缩资源,因此,pod对CPU的使用超过其cpu.limit限制一般不会导致容器被系统\\\"杀死\\\",而Memory属于不可压缩资源,当容

    2023年04月27日
    浏览(27)
  • k8s进阶3——资源配额、资源限制

    为什么会有资源配额管理? 可以提高集群稳定性,确保指定的资源对象在任何时候都不会超量占用系统物理资源,避免业务进程在设计或实现上的缺陷导致整个系统运行紊乱甚至意外宕机。 资源配额管理维度: 容器级别,定义每个Pod上资源配额相关的参数,比如CPU/Memory、

    2024年02月10日
    浏览(24)
  • k8s资源配额限制

    为什么会有资源配额管理? 资源配额管理维度解释? 资源配额参数有什么? 计算CPU CPU的Requests和Limits是通过CPU数(cpus)来度量的。 CPU的资源值是绝对值,而不是相对值,比如0.1CPU在单核或多核机器上是一样的,都严格等于0.1 CPU core。 计算Memory 内存的Requests和Limits计量单位

    2024年02月13日
    浏览(39)
  • K8S(五)—命名空间与资源配额

    Kubernetes(K8s)的命名空间(Namespace)是用于在集群中对资源进行逻辑隔离和分类的一种机制。它可以将集群内的资源划分为不同的组,并且每个命名空间内的资源都有一个唯一的名称。命名空间可以帮助团队将不同的项目、环境或应用程序从彼此中隔离开来,以及更好地管理

    2024年02月04日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包