docker 资源限制

目录

1、CPU使用率

2、CPU共享比例

3、CPU周期限制

4、CPU核心限制

5、CPU 配额控制参数的混合案例

6、内存限制

7、Block IO 的限制

8、限制bps 和iops


docker资源限制

Docker容器技术底层是通过Cgroup(Control Group 控制组)实现容器对物理资源使用的限制,限制的资源包括CPU、内存、磁盘三个方面。基本覆盖了常见的资源配额和使用量控制。

Cgroup 是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源的机制,被LXC及Docker等很多项目用于实现进程的资源控制。

Cgroup 是提供将进程进行分组化管理的功能和接口的基础结构,Docker中I/O 或内存的分配控制等具体的资源管理功能都是通过Cgroup功能来实现的。这些具体的资源管理功能称为Cgroup子系统,以下是对几大子系统的介绍。

  1. blkio:限制块设备的输入输出控制。如:磁盘、光盘、USB等。
  2. cpu:限制CPU资源的访问
  3. cpuacct:产生Cgroup 任务的CPU资源报告。
  4. cpuset:限制分配单独的cpu 和内存资源。
  5. devices:允许或拒绝对设备的访问。
  6. freezer:暂停和恢复Cgroup 任务。
  7. memory:设置每个Cgroup 的内存限制以及产生内存资源报告。
  8. net_cls:用于标记每个网络包。
  9. ns:命名空间子系统。
  10. perf_event:增加了对每group 的监测跟踪的能力,可以监测属于某个特定的group 的所有线程以及运行在特定CPU 上的线程。

使用下面的Dockerfile 来创建一个基于CentOS的stress工具镜像。

[root@localhost ~]# cat centos-7-x86_64.tar.gz | docker import - centos:7[root@localhost ~]# mkdir stress
[root@localhost ~]# cd stress
[root@localhost stress]# vim Dockerfile
FROM centos:7
MAINTAINER crushlinux "crushlinux@163.com"
RUN yum -y install wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum -y install stress
[root@localhost ~]# cd stress/
[root@localhost stress]# docker build -t centos:stress .

1、CPU使用率

在CentOS7中可以通过修改对应的Cgroup配置文件cpu.cfs_quota_us的值来实现,直接执行echo命令将设定值导入到文件中就会立即生效。

例如将容器face0aee201c的CPU使用设置为20000,设置CPU的使用率限定为20%。

[root@localhost ~]# docker run -itd centos:stress /bin/bash

7faed0c97b48c0ae236473431589b5c55aa94d3a93b5cdc7f6887f62e3ca9d00

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

7faed0c97b48        centos              "/bin/bash"         30 seconds ago      Up 29 seconds                           cranky_mclaren

[root@localhost ~]# echo "20000" > /sys/fs/cgroup/cpu,cpuacct/docker/7faed0c97b48c0ae236473431589b5c55aa94d3a93b5cdc7f6887f62e3ca9d00/cpu.cfs_quota_us

2、CPU共享比例

当多个容器任务运行时,很难计算CPU的使用率,为了使容器合理使用CPU资源,可以通过--cpu-shares选项设置容器按比例共享CPU资源,这种方式还可以实现CPU使用率的动态调整。

命令中的--cpu-shares 选项值不能保证可以获得1 个vcpu 或者多少GHz 的CPU 资源,仅仅只是一个弹性的加权值。

例如,运行3个新建容器A、B、C。占用CPU资源的比例为1:1:2:4

docker run --name A -itd --cpu-shares 1024 centos:stress /bin/bash

docker run --name B -itd --cpu-shares 1024 centos:stress /bin/bash

docker run --name C -itd --cpu-shares 2048 centos:stress /bin/bash

docker run --name D -itd --cpu-shares 4096 centos:stress /bin/bash

如果又一个容器D需要更多CPU资源,则可以将其--cpu-shares的值设置为4096,那么ABCD的CPU资源比例变为1:1:2:4。

默认情况下,每个docker容器的cpu份额都是1024。单独一个容器的份额是没有意义的。只有在同时运行多个容器时,容器的CPU加权的效果才能体现出来。例如,两个容器A、B的CPU份额分别为1000和500,在CPU进行时间片分配的时候,容器A比容器B多一倍的机会获得CPU的时间片。但分配的结果取决于当时主机和其他容器的运行状态,实际上也无法保证容器A一定能获得CPU时间片。比如容器A的进程一直是空闲的,那么容器B 是可以获取比容器A更多的CPU时间片的。极端情况下,比如说主机上只运行了一个容器,即使它的CPU份额只有50,它也可以独占整个主机的CPU资源。

Cgroups 只在容器分配的资源紧缺时,也就是说在需要对容器使用的资源进行限制时才会生效。因此无法单纯根据某个容器的CPU份额来确定有多少CPU 资源分配给它,资源分配结果取决于同时运行的其他容器的CPU分配和容器中进程运行情况。

换句话说,可以通过cpu shares可以设置容器使用CPU的优先级,比如启动了两个容器及运行查看CPU使用百分比。

[root@localhost ~]# docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10

[root@localhost ~]# docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

f68b6a6c4e3c        centos:stress       "stress -c 10"      13 seconds ago      Up 12 seconds                           cpu1024

487ec0954a8b        centos:stress       "stress -c 10"      23 seconds ago      Up 22 seconds                           cpu512

[root@localhost ~]# docker exec -it f68b6a6c4e3c /bin/bash

 

[root@localhost ~]# docker exec -it 487ec0954a8b /bin/bash

 

开启了10 个stress 进程,目的是充分让系统资源变得紧张。只有这样竞争资源,设定的资源比例才可以显现出来。如果只运行一个进行,会自动分配到空闲的CPU,这样比例就无法看出来。由于案例的环境不一样,可能导致上面两张图中占用CPU 百分比会不同,但是从cpu share 来看两个容器总比例一定会是1:2。

3、CPU周期限制

docker 提供了--cpu-period、--cpu-quota 两个参数控制容器可以分配到的CPU 时钟周期。

  1. --cpu-period 是用来指定容器对CPU的使用要在多长时间内做一次重新分配。
  2. --cpu-quota 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。与--cpu-shares 不同的是:这种配置是指定一个绝对值,而且没有弹性在里面,容器对CPU 资源的使用绝对不会超过配置的值。

cpu-period 和cpu-quota 的单位为微秒(μs)。cpu-period 的最小值为1000 微秒,

最大值为1 秒(10^6 μs),默认值为0.1 秒(100000 μs)。cpu-quota 的值默认为-1,

表示不做控制。cpu-period、cpu-quota 这两个参数一般联合使用。

举个例子,如果容器进程需要每1 秒使用单个CPU 的0.2 秒时间,可以将cpu-period 设置为1000000(即1 秒),cpu-quota 设置为200000(0.2 秒)。当然,在多核情况下,如果允许容器进程需要完全占用两个CPU,则可以将cpu-period 设置为100000(即0.1 秒),cpu-quota 设置为200000(0.2 秒)。

[root@localhost ~]# docker run -it --cpu-period 100000 --cpu-quota 200000 centos:stress /bin/bash

[root@2474ee0f7e62 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us

1000000

[root@2474ee0f7e62 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us

200000

4、CPU核心限制

多核CPU的服务器Docker还可以控制容器运行限定使用哪些CPU内核,可以使用--cpuset-cpus选项来使某些程序独享CPU核心,以便提高其处理速度,对应的Cgroup文件为/sys/fs/cgroup/cpuset/docker/容器ID号/cpuset.cpus。选项后直接跟参数0、1、2……表示第1个内核,第2个内核,第3个内核,与/proc/cpuinfo中的标号相同。

如果服务器有16个核心,那么CPU编号为0~15,使新建容器绑定第1~4的核心使用:

docker run -itd --cpuset-cpus 0,1,2,3 centos:stress /bin/bash

或者

docker run --itd --cpuset-cpus 0-3 centos:stress /bin/bash

那么该容器内的进程只会在0,1,2,3的CPU上运行。

通过下面指令也可以看到容器中进程与CPU 内核的绑定关系,可以认为达到了绑定CPU 内核的目的。

[root@localhost ~]# docker exec 2474ee0f7e62 taskset -c -p 1

pid 1's current affinity list: 0-3       //容器内部第一个进程编号一般为1

尽量使用绑定内核的方式分配CPU资源给容器进程使用,然后在配合--cpu-shares选项动态调整CPU使用资源的比例。

5、CPU 配额控制参数的混合案例

通过--cpuset-cpus 指定容器A 使用CPU 内核0,容器B 只是用CPU 内核1。在主机上只有这两个容器使用对应CPU 内核的情况,它们各自占用全部的内核资源,--cpu-shares 没有明显效果。

--cpuset-cpus、--cpuset-mems 参数只在多核、多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的。

在系统具有多个CPU 内核的情况下,需要通过cpuset-cpus 为容器CPU 内核才能比较方便地进行测试。

用下列命令创建测试用的容器:

[root@localhost ~]# docker run -itd --name cpu3 --cpuset-cpus 3 --cpu-shares 512 centos:stress stress -c 1

[root@localhost ~]# docker exec -it容器ID /bin/bash

输入top 命令查看

 

[root@localhost ~]# docker run -itd --name cpu4 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1

[root@localhost ~]# docker exec -it容器ID /bin/bash

输入top 命令查看

 

上面的centos:stress 镜像安装了stress 工具,用来测试CPU 和内存的负载。通过在两个容器上分别执行stress -c 1 命令,将会给系统一个随机负载,产生1 个进程。这个进程都反复不停的计算由rand() 产生随机数的平方根,直到资源耗尽。

观察到宿主机上的CPU 试用率,第三个内核的使用率接近100%,并且一批进程的CPU 使用率明显存在2:1 的使用比例的对比。

6、内存限制

与操作系统类似,容器可使用的内存包括两部分:物理内存和swap。Docker 通过下面两组参数来控制容器内存的使用量。

  1. -m --memory:设置内存的使用限额,例如100M, 1024M
  2. --memory-swap:设置内存swap 的使用限额。

当执行如下命令:

其含义是允许该容器最多使用200M 的内存和300M 的swap。

[root@localhost ~]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd

stress: dbug: [1] using backoff sleep of 3000us

stress: dbug: [1] --> hogvm worker 1 [6] forked

stress: dbug: [6] allocating 293601280 bytes ...

stress: dbug: [6] touching bytes in strides of 4096 bytes ...

stress: dbug: [6] freed 293601280 bytes

stress: dbug: [6] allocating 293601280 bytes ...

stress: dbug: [6] touching bytes in strides of 4096 bytes ...

  1. --vm 1:启动1 个内存工作线程。
  2. --vm-bytes 280M:每个线程分配280M 内存。

默认情况下,容器可以使用主机上的所有空闲内存。与CPU 的cgroups 配置类似,docker 会自动为容器在目录/sys/fs/cgroup/memory/docker/<容器的完整长ID>中创建相应cgroup 配置文件。

因为280M 在可分配的范围(300M)内,所以工作线程能够正常工作,其过程是:

  1. 分配280M 内存。
  2. 释放280M 内存。
  3. 再分配280M 内存。
  4. 再释放280M 内存。
  5. 一直循环......

如果让工作线程分配的内存超过300M,分配的内存超过限额,stress 线程报错,容器退出。

[root@localhost ~]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 380M

stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd

stress: dbug: [1] using backoff sleep of 3000us

stress: dbug: [1] --> hogvm worker 1 [7] forked

stress: dbug: [7] allocating 398458880 bytes ...

stress: dbug: [7] touching bytes in strides of 4096 bytes ...

stress: FAIL: [1] (416) <-- worker 7 got signal 9

stress: WARN: [1] (418) now reaping child worker processes

stress: FAIL: [1] (422) kill error: No such process

stress: FAIL: [1] (452) failed run completed in 1s

7、Block IO 的限制

默认情况下,所有容器能平等地读写磁盘,可以通过设置--blkio-weight 参数来改变容器block IO 的优先级。

--blkio-weight 与--cpu-shares 类似,设置的是相对权重值,默认为500。在下面的例子中,容器A 读写磁盘的带宽是容器B 的两倍。

[root@localhost ~]# docker run -it --name container_A --blkio-weight 600 centos:stress /bin/bash

[root@a4b63e72a03b /]# cat /sys/fs/cgroup/blkio/blkio.weight

600

[root@localhost ~]# docker run -it --name container_B --blkio-weight 300 centos:stress /bin/bash

[root@ee688a3bba2b /]# cat /sys/fs/cgroup/blkio/blkio.weight

300

8、限制bps 和iops

如果在一台服务器上进行容器的混合部署,那么会存在同时几个程序写磁盘数据的情况,这时可以通过--device-write-iops选项来限制每秒写io次数来限制制定设备的写速度。相应的还有--device-read-iops选项可以限制读取IO的速度,但是这种方法只能限制设备,而不能限制分区,相应的Cgroup写配置文件为/sys/fs/cgroup/blkio/容器ID/ blkio.throttle.write_iops_device。

  1. bps 是byte per second,每秒读写的数据量。
  2. iops 是io per second,每秒IO 的次数。

可通过以下参数控制容器的bps 和iops:

  • --device-read-bps,限制读某个设备的bps
  • --device-write-bps,限制写某个设备的bps
  • --device-read-iops,限制读某个设备的iops
  • --device-write-iops,限制写某个设备的iops

下面的示例是限制容器写/dev/sda 的速率为5 MB/s。

[root@localhost ~]# docker run -it --device-write-bps /dev/sda:5MB centos:stress /bin/bash [root@7fc31cd1514b /]# dd if=/dev/zero of=test bs=1M count=100 oflag=direct

100+0 records in

100+0 records out

104857600 bytes (105 MB) copied, 20.0051 s, 5.2 MB/s

通过dd 测试在容器中写磁盘的速度。因为容器的文件系统是在host /dev/sda 上的,在容器中写文件相当于对宿主机/dev/sda 进行写操作。另外,oflag=direct 指定用direct

IO 方式写文件,这样--device-write-bps 才能生效。

结果表明,bps 5.2 MB/s 在限速5MB/s 左右。作为对比测试,如果不限速,结果如下:

[root@localhost ~]# docker run -it centos:stress /bin/bash

[root@9128099a8947 /]# dd if=/dev/zero of=test bs=1M count=100

100+0 records in

100+0 records out

104857600 bytes (105 MB) copied, 0.384372 s, 273 MB/s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/73800.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

赛车游戏——【极品飞车】(内含源码inscode在线运行)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ 解决算法&#xff0c;一个专栏就够了★ ★ 架…

【excel常用文本函数大全上】

目录索引 LEFT&#xff1a;公式&#xff1a;举例&#xff1a; RIGHT&#xff1a;公式&#xff1a;举例&#xff1a; MID&#xff1a;公式&#xff1a;举例&#xff1a; FIND&#xff1a;公式&#xff1a;举例&#xff1a; LEN&#xff1a;公式&#xff1a;举例&#xff1a; LEN…

Hive/Spark/Yarn: User Not Found 错误和 Kerberos / AD / OpenLDAP 之间的关系与解释

有时候,当你向Spark或Hive提交作业时,可能会遇到如下的错误: 提交作业使用的用户是example-user-1,但是Yarn返回的错误信息是:该用户不存在。类似的问题大多发生在启动了Kerberos的Hadoop集群上,或者集群集成了Windows AD或OpenLDAP后。本文,我们把这个问题梳理清楚并给…

【力扣】206. 反转链表 <链表指针>

【力扣】206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3 输入&#xff1a…

寄存器详解

目录 前言&#xff1a; 通用寄存器 示例&#xff1a; 通用寄存器的划分 汇编指令 cpu物理地址的形成 地址加法器运算示例&#xff1a; 1. 相关部件提供段地址和偏移地址 2. 段地址和偏移地址送入地址加法器 3. 段地址*16 4. 求出物理地址 5. 输出物理地址 段的概念 Deb…

git 常用命令有哪些

Git 是我们开发工作中使用频率极高的工具&#xff0c;下面总结下他的基本指令有哪些&#xff0c;顺便温习一下。 前言 一般项目中长存2个分支&#xff1a; 主分支&#xff08;master&#xff09; 和开发分支&#xff08;develp&#xff09; 项目存在三种短期分支 &#xff1a…

数据可视化(4)散点图及面积图

1.简单散点图 #散点图 #scatter(x,y) x数据&#xff0c;y数据 x[i for i in range(10)] y[random.randint(1,10) for i in range(10)] plt.scatter(x,y) plt.show()2.散点图分析 #分析广告支出与销售收入相关性 dfcarpd.read_excel(广告支出.xlsx) dfdatapd.read_excel(销售…

【vue】 vue2 监听滚动条滚动事件

代码 直接上代码&#xff0c;vue单文件 index.vue <template><div class"content" scroll"onScroll"><p>内容</p><p>内容</p><p>内容</p><p>内容</p><p>内容</p><p>内容…

vue 3.0 + element-ui MessageBox弹出框的 让文本框显示文字 placeholder

inputPlaceholder:请填写理由, 方法实现如下: this.$prompt(, 是否确认&#xff1f;, { confirmButtonText: 确定, cancelButtonText: 取消, inputPlaceholder:请填写理由, }).then(({ value }) > { if(value null || value ""){ Message({message: 请填…

Modbus tcp转ETHERCAT在Modbus软件中的配置方法

Modbus tcp和ETHERCAT是两种不同的协议&#xff0c;这给工业生产带来了很大的麻烦&#xff0c;因为这两种设备之间无法通讯。但是&#xff0c;捷米JM-ECT-TCP网关的出现&#xff0c;却为这个难题提供了解决方案。 JM-ECT-TCP网关能够连接到Modbus tcp总线和ETHERCAT总线中&…

新概念英语的网盘资源

新版新概念英语1-4册全部视频和课本_免费高速下载|百度网盘-分享无限制百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/18wyeA#l…

EXCEL里数值列如何显示序号?如何重新排序? 怎么取得排序后的序号?

目录 1 EXCEL里如何显示序号&#xff1f; 2 如何重新排序&#xff1f; 3 怎么取得排序后的序号&#xff1f; 3.1 rank() 的序号可能不连续 3.2 方法2&#xff1a;SUMPRODUCT((C7>C$7:C$12)/COUNTIF(C$7:C$12,C$7:C$12))1 EXCEL里如何显示序号&#xff1f;如何重新排序…

Vue模版语法

目录 接下来学习click 例题&#xff1a;修改背景颜色 例题&#xff1a;反复点击button按钮&#xff0c;可以不断切换背景颜色 先看以下例题是回顾vue的用法 <body><div id"box">{{myname}} - {{myage}}</div><script>var vm new Vue({el…

Spring之事务实现方式及原理

目录 Spring事务简介 Spring支持事务管理的两种方式 编程式事务控制 声明式事务管理 Spring事务角色 未开启事务之前 开启Spring的事务管理后 事务配置 事务传播行为 事务传播行为的可选值 Spring事务简介 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功…

求分享如何批量压缩视频的容量的方法

视频内存过大&#xff0c;不但特别占内存&#xff0c;而且还会使手机电脑出现卡顿的现象&#xff0c;除此之外&#xff0c;如果我们想发送这些视频文件可能还会因为内存太大无法发送。因此&#xff0c;我们可以批量地压缩视频文件的内存大小&#xff0c;今天小编要来分享一招&a…

二进制链表转整数

给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例 1&#xff1a; 输入&#xff1a;head [1,0,1] 输出&#xff1a;5 解释&#xff1a;二进制数 (101) 转化为十进…

获取淘宝商品详情数据的几种方法(商品标题、商品价格、商品销量、详情图片、商品主图

淘宝作为中国最大的电商平台之一&#xff0c;拥有海量的商品信息和用户数据。对于电商从业人员和数据分析师来说&#xff0c;了解淘宝商品详情数据是非常重要的。本文将介绍几种获取淘宝商品详情数据的高效方法&#xff0c;并详细探讨每种方法的优缺点。 一、淘宝 API 淘宝开放…

Flink - souce算子

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 目录 1. 从Java的集合中读取数据 2. 从本地文件中读取数据 3. 从HDFS中读取数据 4. 从Socket中读取数据 5. 从Kafka中读取数据 6. 自定义Source 官方文档 - Flink1.13 1. 从Java的集合中读取数据 …

【话题】感觉和身边其他人有差距怎么办?也许自我调整很重要

每个人能力有限&#xff0c;水平高低不同&#xff0c;我们身在大环境里&#xff0c;虽然在同一个起跑线上&#xff0c;但是时间久了&#xff0c;你会发现&#xff0c;并越来越感觉到和身边其他人有了差距&#xff0c;慢慢的会有一定的落差感&#xff0c;怎么办呢&#xff01;通…

接口相似数据结构复用率高?Apipost这招搞定!

在API设计和开发过程中&#xff0c;存在许多瓶颈&#xff0c;其中一个主要问题是在遇到相似数据结构的API时会产生重复性较多的工作&#xff1a;在每个API中都编写相同的数据&#xff0c;这不仅浪费时间和精力&#xff0c;还容易出错并降低API的可维护性。 为了解决这个问题&a…