当前位置: 首页 > 资讯 > 足球资讯

docker 内存 cpu 限制 简介

直播信号

docker 内存 cpu 限制 简介

目录

一、Docker资源管理接口概览

二、Docker资源管理原理——Cgroups子系统介绍

1. memory -- 用来限制cgroup中的任务所能使用的内存上限

读取内存对应的cgroups文件

读取交换内存对应的cgroups文件

2. 使用stress镜像学习如何为容器分配内存   

centos-stress-source:1.0.2镜像创建

分配的内存比指定的内存和交换内存小时,执行正常,不断释放与分配

分配的内存比指定的内存和交换内存大时

不指定swap-memory时,默认swap的值确认

3. cpu子系统

设置cpu权重,容器竞争cpu资源时是才起作用,但容器情况下可以使用到全部的容器资源

4. Block IO

磁盘的读写权重

BLKIO限额具有竞争资源的情况,与 cpu 配额一样

随着Docker技术被越来越多的个人、企业所接受,其用途也越来越广泛。Docker资源管理包含对CPU、内存、IO等资源的限制,但大部分Docker使用者在使用资源管理接口时往往还比较模糊。

  本文将尝试介绍Docker资源管理背后的Cgroups机制,并且列举主要的资源管理接口对应的Cgroups接口,让Docker使用者对资源管理更加清晰。

格式

描述 -m, --memory=" <数字>[<单位>]"内存使用限制。 数字需要使用整数,对应的单位是b, k, m, g中的一个。最小取值是4M。--memory-swap="<数字>[<单位>]"总内存使用限制 (物理内存 + 交换分区,数字需要使用整数,对应的单位是b, k, m, g中的一个。--memory-reservation="<数字>[<单位>]"内存软限制。 数字需要使用正整数,对应的单位是b, k, m, g中的一个。--kernel-memory="<数字>[<单位>]"内核内存限制。 数字需要使用正整数,对应的单位是b, k, m, g中的一个。最小取值是4M。--oom-kill-disable=false内存耗尽时是否杀掉容器--memory-swappiness=""调节容器内存使用交换分区的选项,取值为0和100之间的整数(含0和100)。-c, --cpu-shares=0CPU份额 (相对权重)--cpu-period=0完全公平算法中的period值--cpu-quota=0完全公平算法中的quota值--cpuset-cpus="<数字>"限制容器使用的cpu核(0-3, 0,1)--cpuset-mems=""限制容器使用的内存节点,该限制仅仅在NUMA系统中生效。--blkio-weight=0块设备IO相对权重,取值在10值1000之间的整数(包含10和1000)--blkio-weight-device="设备名称:权重值"指定的块设备的IO相对权重--device-read-bps="<设备路径>:<数字>[<单位>]"限制对某个设备的读取速率 ,数字需要使用正整数,单位是kb, mb, or gb中的一个。--device-write-bps="<设备路径>:<数字>[<单位>]"限制对某个设备的写速率 ,数字需要使用正整数,单位是kb, mb, or gb中的一个。--device-read-iops="<设备路径>:<数字>"限制对某个设备每秒IO的读取速率,数字需要使用正整数。--device-write-iops="<设备路径>:<数字>"限制对某个设备每秒IO的写速率,数字需要使用正整数。

  Cgroups是control groups的缩写,最初由google的工程师提出,后来被整合进Linux内核。Cgroups是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:CPU、内存、IO等)的机制。Cgroups由7个子系统组成:分别是cpuset、cpu、cpuacct、blkio、devices、freezer、memory。不同类型资源的分配和管理是由各个cgroup子系统负责完成的。

  在 /sys/fs/cgroup/子系统名称/docker 目录中为每个容器创建一个 cgroup 目录,并且以容器长ID命名,如下 cpu 资源系统,目录中包含所有与 cpu 相关的 cgroup 配置:

 

子系统常用cgroups接口

描述

对应的docker接口 cgroup/memory/memory.limit_in_bytes

 设定内存上限,单位是字节,也可以使用k/K、m/M或者g/G表示要设置数值的单位。-m, --memory=""cgroup/memory/memory.memsw.limit_in_bytes

 设定内存加上交换分区的使用总量。通过设置这个值,可以防止进程把交换分区用光。--memory-swap=""cgroup/memory/memory.soft_limit_in_bytes

 设定内存限制,但这个限制并不会阻止进程使用超过限额的内存,只是在系统内存不足时,会优先回收超过限额的进程占用的内存,使之向限定值靠拢。--memory-reservation=""cgroup/memory/memory.kmem.limit_in_bytes

 设定内核内存上限。--kernel-memory=""cgroup/memory/memory.oom_control

 如果设置为0,那么在内存使用量超过上限时,系统不会杀死进程,而是阻塞进程直到有内存被释放可供使用时,另一方面,系统会向用户态发送事件通知,用户态的监控程序可以根据该事件来做相应的处理,例如提高内存上限等。--oom-kill-disable=""cgroup/memory/memory.swappiness

 控制内核使用交换分区的倾向。取值范围是0至100之间的整数(包含0和100)。值越小,越倾向使用物理内存。--memory-swappiness=

 

读取内存对应的cgroups文件

当内存限制在200M时,cgoups的文件数值为 209715200,单位为字节,刚好等于200M。其中,--rm 表示退出之后删除创建的容器。

读取交换内存对应的cgroups文件

当内存限制在300M时,cgoups的文件数值为 314572800,单位为字节,刚好等于300M。

其余的,以此类推。

centos-stress-source:1.0.2镜像创建

1.创建Dockerfile目录

2.根据Dockerfile生成创建一个stress镜像

3.查看镜像 

4.测试是否可用

分配的内存比指定的内存和交换内存小时,执行正常,不断释放与分配

分配的内存比指定的内存和交换内存大时

分配的内存试图超过300M时,stress线程报错,容器强行退出。 

不指定swap-memory时,默认swap的值确认

1、指定 -m 内存值为100M

可以看到上述情况,在不指定 memory-swap 大小的情况下,默认取memory的两倍值, 即 200M。

2、当一方的指定值为-1时,表示无限大

可以看到,memory-swap为 无限大。 奇才赛事预测

3、memory 和 memory-swap的关系

所以,当memory-swap值小于memory设定值的时候,会报错如下

子系统常用cgroups接口

描述

对应的docker接口 cgroup/cpu/cpu.shares

 负责CPU比重分配的接口。假设我们在cgroupfs的根目录下创建了两个cgroup(C1和C2),并且将cpu.shares分别配置为512和1024,那么当C1和C2争用CPU时,C2将会比C1得到多一倍的CPU占用率。要注意的是,只有当它们争用CPU时CPU share才会起作用,如果C2是空闲的,那么C1可以得到全部的CPU资源。-c, --cpu-shares=""cgroup/cpu/cpu.cfs_period_us

 负责CPU带宽限制,需要与cpu.cfs_quota_us搭配使用。我们可以将period设置为1秒,将quota设置为0.5秒,那么cgroup中的进程在1秒内最多只能运行0.5秒,然后就会被强制睡眠,直到下一个1秒才能继续运行。--cpu-period=""cgroup/cpu/cpu.cfs_quota_us

 负责CPU带宽限制,需要与cpu.cfs_period_us搭配使用。--cpu-quota=""

设置cpu权重,容器竞争cpu资源时是才起作用,但容器情况下可以使用到全部的容器资源

启动容器 container_a,设置 cpu share = 1024

启动容器 container_b,设置 cpu share = 512

在host中执行 top 查看 cpu 的使用情况

以上,可以看到 container_a 占用的 cpu 资源是 container_b 的两倍。

暂停container_a 可以发现数据如下

可以看到,当 在container_a空闲的时候,container_b 能够用满整个 cpu。

PS. 需要退出当前测试时,需要直接ctrl+c,或者 直接执行 docker stop ,执行过 docker pause 的,只能执行stop退出。

子系统常用cgroups接口

描述

对应的docker接口 cgroup/blkio/blkio.weight

 设置权重值,取值范围是10至1000之间的整数(包含10和1000)。这跟cpu.shares类似,是比重分配,而不是绝对带宽的限制,因此只有当不同的cgroup在争用同一个块设备的带宽时,才会起作用。--blkio-weight=""cgroup/blkio/blkio.weight_device

 对具体的设备设置权重值,这个值会覆盖上述的blkio.weight。--blkio-weight-device=""cgroup/blkio/blkio.throttle.read_bps_device

 对具体的设备,设置每秒读块设备的带宽上限。--device-read-bps=""cgroup/blkio/blkio.throttle.write_bps_device

 设置每秒写块设备的带宽上限。同样需要指定设备。--device-write-bps=""cgroup/blkio/blkio.throttle.read_iops_device

 设置每秒读块设备的IO次数的上限。同样需要指定设备。--device-read-iops=""cgroup/blkio/blkio.throttle.write_iops_device

 设置每秒写块设备的IO次数的上限。同样需要指定设备。--device-write-iops=""

磁盘的读写权重

docker 可通过设置权重、限制 bps (每秒读写的数据量)和 iops(每秒 IO 的次数) 的方式控制容器读写磁盘的带宽。

1、限制读写 IO 为50M/s,则最终的读写速度会在50M左右。

2、不限制 IO

PS.注意oflag=direct,需要指定IO方式,目前BLKIO限额只对direct(不使用文件缓存)生效。因为容器的文件系统在 host /dev/sda 上,所以在容器中写文件,相当于对 host /dev/sda 进行写操作

BLKIO限额具有竞争资源的情况,与 cpu 配额一样

1、是 container_b 的BLKIO 优先级是 container_a 的两倍

 设置 container_a 的 --blkio-weight 300

设置 container_b 的 --blkio-weight 600

ps. 由于收到执行命令没有办法做到同时IO,所以读写速度上的比例并没有严格的1:2。

 

 

标签:  
录像推荐
英超德甲法甲西甲意甲NBA
热门标签

首页

足球

蓝球

录像

新闻