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

【Docker】Docker资源(创建容器)CPU/内存/磁盘IO/GPU限制与分配教程

Docker资源创建容器CPU/内存/磁盘IO/GPU限制与分配

      • 一、关键概念解释
      • 二、Docker分配CPU资源限制
      • 三、Docker分配内存资源限制
      • 四、Docker容器中对磁盘IO进行限制
      • 五、Docker对GPU资源限制管理

一、关键概念解释

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

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

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

二、Docker分配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(逻辑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

CPU资源的绝对限制:
        Linux 通过 CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对 CPU 的使用。CFS 默认的调度周期是 100ms。

我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。

  • –cpu-period 设置每个容器进程的调度周期
  • –cpu-quota 设置在每个周期内容器能使用的 CPU 时间
docker run -it --cpu-period=50000 --cpu-quota=25000 Centos centos /bin/bash

表示将 CFS 调度的周期设为 50000,将容器在每个周期内的 CPU 配额设置为 25000,表示该容器每 50ms 可以得到 50% 的 CPU 运行时间。

docker run -it --cpu-period=10000 --cpu-quota=20000 Centos centos /bin/bash

表示将容器的 CPU 配额设置为 CFS 周期的两倍,CPU 使用时间怎么会比周期大呢?其实很好解释,给容器分配两个 CPU 就可以了。该配置表示容器可以在每个周期内使用两个 CPU 的 100% 时间。

CFS 周期的有效范围是 1ms~1s,对应的–cpu-period的数值范围是 1000~1000000。

而容器的 CPU 配额必须不小于 1ms,即–cpu-quota的值必须 >= 1000。可以看出这两个选项的单位都是 us。

参数总结

  • CPU份额控制:-c或–cpu-shares
  • CPU核控制:–cpuset-cpus、–cpus
  • CPU周期控制:–cpu-period、–cpu-quota

三、Docker分配内存资源限制

容器可以使用的内存包括两部分:物理内存和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=300M ubuntu# 容器最多使用200M的内存和200M的Swap
docker run -it -m 200M ubuntu

四、Docker容器中对磁盘IO进行限制

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

注:目前 Block IO 限额只对 direct 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,表示每秒的输入输出量(或读写次数)。

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

  • –device-read-bps,限制读某个设备的 bps。
  • –device-write-bps,限制写某个设备的 bps。
  • –device-read-iops,限制读某个设备的 iops。
  • –device-write-iops,限制写某个设备的 iops。
# 限制容器写 /dev/sda 的速率为 30 MB/s
docker run -it --device-write-bps /dev/sda:30MB centos:latest# dd 测试在容器中写磁盘的速度
time dd if=/dev/zero of=test.out bs=1M count800 oflag=direct

dd测试参数:

  • if=file:输入文件名,缺省为标准输入
  • of=file:输出文件名,缺省为标准输出
  • ibs=bytes:一次读入bytes 个字节(即一个块大小为 bytes 个字节)
  • obs=bytes:一次写 bytes 个字节(即一个块大小为 bytes个字节)
  • bs=bytes:同时设置读写块的大小为 bytes ,可代替 ibs 和 obs
  • count=blocks:仅拷贝 blocks个块,每个块大小等于 ibs 指定的字节数

五、Docker对GPU资源限制管理

        如果Docker要使用GPU,需要docker支持GPU,在docker19以前都需要单独下载nvidia-docker1或nvidia-docker2来启动容器.
         但在docker19中后需要GPU的Docker只需要加个参数- -gpus即可(- -gpus all表示使用所有的gpu;要使用2个gpu:–-gpus 2即可;也可直接指定使用哪几个卡:–gpus ‘“device=1,2”’),Docker里面想读取nvidia显卡再也不需要额外的安装nvidia-docker了。

  1. 查看是否具备–gpus参数

    docker run --help | grep -i gpus
    
  2. 查看nvidia界面是否能够启动
    运行nvidia官网提供的镜像,并输入nvidia-smi命令,查看nvidia界面是否能够启动。

    docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
    

    Docker限制GPU使用:

    # 使用所有GPU
    docker run --gpus all ubuntu# 使用两个GPU
    docker run --gpus 2 ubuntu# 指定GPU运行
    docker run --gpus '"device=2"' ubuntu
    docker run --gpus '"device=1,2"' ubuntu
    docker run --gpus '"device=UUID-ABCDEF,1"' ubuntu
    

如有不足,欢迎私信交流!

相关文章:

  • IOS面试题编程机制 6-10
  • 【Java程序设计】【C00373】基于(JavaWeb)Springboot的社区疫情返乡管控系统(有论文)
  • 【阅读笔记】《一个聪明的投资者》
  • LODGE 学习笔记
  • volatile,synchronized,reentranlock,CAS详解
  • go env 命令详解
  • TouchGFX之Button
  • JavaEE企业级分布式高级架构师课程
  • python知识点总结(十)
  • Chrome 插件 storage API 解析
  • 类的定义与实例化
  • AI大模型学习:AI大模型在特定领域的应用
  • 华为OD七日集训第5期 - 按算法分类,由易到难,循序渐进,玩转OD
  • 工业无线网关在汽车制造企业的应用效果和价值-天拓四方
  • C# 多态 派生类 abstract virtual new
  • python3.6+scrapy+mysql 爬虫实战
  • 10个确保微服务与容器安全的最佳实践
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Apache Pulsar 2.1 重磅发布
  • co.js - 让异步代码同步化
  • crontab执行失败的多种原因
  • CSS相对定位
  • Go 语言编译器的 //go: 详解
  • HTTP--网络协议分层,http历史(二)
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • mockjs让前端开发独立于后端
  • php面试题 汇集2
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • SpiderData 2019年2月23日 DApp数据排行榜
  • uni-app项目数字滚动
  • Vue.js 移动端适配之 vw 解决方案
  • windows下如何用phpstorm同步测试服务器
  • zookeeper系列(七)实战分布式命名服务
  • 目录与文件属性:编写ls
  • 如何设计一个微型分布式架构?
  • 软件开发学习的5大技巧,你知道吗?
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 微信开放平台全网发布【失败】的几点排查方法
  • 原生Ajax
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #define用法
  • #Linux(make工具和makefile文件以及makefile语法)
  • (1)Nginx简介和安装教程
  • (BFS)hdoj2377-Bus Pass
  • (poj1.3.2)1791(构造法模拟)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .