当前位置: 首页 > news >正文

docker容器的资源限制

什么是cgroup?

cgroups其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组(如CPU、内存、磁盘输入输出等)。

什么是Docker资源限制

默认情况下,Docker容器是没有资源限制的,它会尽可能地使用宿主机能够分配给它的资源。如果不对容器资源进行限制,容器之间就会相互影响,一些占用硬件资源较高的容器会吞噬掉所有的硬件资源,从而导致其它容器无硬件资源可用,发生停服状态。 Docker提供了限制内存,CPU或磁盘IO的方法, 可以对容器所占用的硬件资源大小以及多少进行限制,我们在使用docker create创建一个容器或者docker run运行一个容器的时候就可以来对此容器的硬件资源做限制。

Docker 通过 cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。

限制CPU

默认设置下,所有容器可以平等地使用宿主机的CPU资源并且没有限制。

设置CPU资源的选项如下

-c 或 --cpu-shares: 在有多个容器竞争 CPU 时我们可以设置每个容器能使用的 CPU 时间比例。这个比例叫作共享权值。共享式CPU资源,是按比例切分CPU资源;Docker 默认每个容器的权值为 1024。如果不指定或将其设置为0,都将使用默认值。 比如,当前系统上一共运行了两个容器,第一个容器上权重是1024,第二个容器权重是512, 第二个容器启动之后没有运行任何进程,自己身上的512都没有用完,而第一台容器的进程有很多,这个时候它完全可以占用容器二的CPU空闲资源,这就是共享式CPU资源;如果容器二也跑了进程,那么就会把自己的512给要回来,按照正常权重1024:512划分,为自己的进程提供CPU资源。如果容器二不用CPU资源,那容器一就能够把容器二的CPU资源所占用,如果容器二也需要CPU资源,那么就按照比例划分。那么第一个容器会从原来使用整个宿主机的CPU变为使用整个宿主机的CPU的2/3;这就是CPU共享式,也证明了CPU为可压缩性资源。
--cpus: 限制容器运行的核数;从docker1.13版本之后,docker提供了--cpus参数可以限定容器能使用的CPU核数。这个功能可以让我们更精确地设置容器CPU使用量,是一种更容易理解也常用的手段。
--cpuset-cpus: 限制容器运行在指定的CPU核心; 运行容器运行在哪个CPU核心上,例如主机有4个CPU核心,CPU核心标识为0-3,我启动一台容器,只想让这台容器运行在标识0和3的两个CPU核心上,可以使用cpuset来指定。与内存限额不同,通过-c设置的cpu share 并不是CPU资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的CPU资源取决于它的cpu share占所有容器cpu share总和的比例。换句话说,通过cpu share可以设置容器使用CPU的优先级
# containerA的cpu share 1024, 是containerB 的两倍。
# 当两个容器都需要CPU资源时,containerA可以得到的CPU是containerB 的两倍。
# 需要特别注意的是,这种按权重分配CPU只会发生在CPU资源紧张的情况下。
# 如果containerA处于空闲状态,这时,为了充分利用CPU资源,containerB 也可以分配到全部可用的CPU。
docker run --name "cont_A" -c 1024 ubuntu 
docker run --name "cont_B" -c 512 ubuntu# 容器最多可以使用主机上两个CPU ,除此之外,还可以指定如 1.5 之类的小数。
docker run -it --rm --cpus=2 centos /bin/bash# 表示容器中的进程可以在 CPU-1 和 CPU-3 上执行。
docker run -it --cpuset-cpus="1,3" ubuntu:14.04 /bin/bash# 表示容器中的进程可以在 CPU-0、CPU-1 及 CPU-2 上执行。
docker run -it --cpuset-cpus="0-2" ubuntu:14.04 /bin/bash

通过-c 或 --cpu-shares是对CPU的资源进行相对限制。同样,我们可以进行CPU资源的绝对限制。

限制内存

与操作系统类似,容器可以使用的内存包括两部分:物理内存和Swap。

Docker通过下面两组参数来控制容器内存的使用量。

-m 或 --memory:设置内存的使用限额,例如:100MB,2GB。
--memory-swap:设置内存+swap的使用限额

默认情况下,上面两组参数为-1,即对容器内存和swap的使用没有限制。如果在启动容器时,只指定-m而不指定–memory-swap, 那么–memory-swap默认为-m的两倍。

# 允许该容器最多使用200MB的内存和100MB 的swap。
docker run -m 200M --memory-swap=100M ubuntu# 容器最多使用200M的内存
docker run -it -m 200M ubuntu

限制磁盘

Block IO 是另一种可以限制容器使用的资源。Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽

注:目前 Block IO 限额只对 direct IO(不使用文件缓存)有效。

Block IO的限制

默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight 参数来改变容器 block IO 的优先级,–blkio-weight 与 --cpu-shares类似,设置的是相对权重值,默认为 500。在下面的例子中,container_A 读写磁盘的带宽是 container_B 的两倍。

docker run -it --name container_A --blkio-weight 600 ubuntu
docker run -it --name container_B --blkio-weight 300 ubuntu

bps和iops的限制

bps 是 byte per second,表示每秒读写的数据量。

iops 是 io per second,表示每秒的输入输出量(或读写次数)。

--device-read-bps,限制读某个设备的 bps。
--device-write-bps,限制写某个设备的 bps。
--device-read-iops,限制读某个设备的 iops。
--device-write-iops,限制写某个设备的 iops。
docker run -it --device-write-bps /dev/sda:30MB centos:latest
http://www.sczhlp.com/news/13329/

相关文章:

  • dockerfile详解
  • docker-compose部署与使用详解
  • The 2022 ICPC Asia Hangzhou Regional Contest - K - 字典树
  • 生成函数
  • 第三十七天(8.12) STATIC 继承
  • 天山固网杯2025-职工组-web3-add_file
  • JAVA学习(8月16号)
  • DP优化之WQS二分
  • docker的5种网络类型
  • docker的重启策略
  • docker数据卷
  • P1072 [NOIP 2009 提高组] Hankson 的趣味题
  • 详细介绍:考研复习-计算机组成原理-第五章-CPU
  • 二十二条天
  • 20250816 OI 总结
  • 20250814 - 最小生成树 总结
  • docker各个目录的作用
  • 依赖注入
  • docker镜像的分层
  • docker端口映射
  • 昆工通信复试水?22-25年血战报告:最高1/3当场抬走
  • ️ 你的程序用了 DevExpress,别人电脑没装能运行吗?一文讲清楚!
  • python基础
  • 仿函数
  • 算法的泛化过程
  • docker容器常用命令
  • P1029 [NOIP 2001 普及组] 最大公约数和最小公倍数问题
  • docker安装(yum方式+二进制方式)
  • docker镜像常用命令
  • 8月16日随笔