【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
    

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统使用Docker部署Portainer结合内网穿透实现远程管理容器和镜像

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

PMO活动︱2024第十三届中国PMO大会将于5月在京召开

PMO站在企业高度进行组织级项目管理,工作虽然千头万绪但首当其冲的无疑是在企业中建立统一的、标准化的项目管理方法体系,“无规矩不成方圆”,根据项目管理行业标准结合企业实际情况制定一整套适合本企业的项目管理规范制度,这是P…

如何使用Excel创建一个物品采购表

在企业的日常运营中,物品采购是一个常见且重要的活动。有效的采购管理不仅可以确保企业及时获得所需物资,还可以控制成本、提高效率。Microsoft Excel是一个功能强大的工具,它可以帮助我们创建和管理物品采购表。本文将详细介绍如何使用Excel…

如何制定公平、客观的考核标准,避免主观偏见和人情因素的影响?

在企业管理中,考核标准的制定是确保员工绩效评价公正、客观的关键环节。然而,由于主观偏见和人情因素的影响,很多企业在考核过程中往往难以做到公平、公正。本文将探讨如何制定公平、客观的考核标准,以最大程度地减少主观偏见和人…

【Frida】【Android】04_Objection安装和使用

🛫 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

在点集的新知识面前百年集论不堪一击

黄小宁 与x∈R相异(等)的实数均可表为yxδ(增量δ可0也可≠0),因各实数的绝对值都可是表示长度的数故各实数都可是数轴上点的坐标,于是x∈R变换为实数yxδ的几何意义可是:一维空间“管道”g内R…

ICP Hacker House 邀你共赴 IC 生态项目开发新风口

为了更好地探索区块链技术前沿,体验作为全面智能合约云平台的互联网计算机(Internet Computer Protocol),将数据、内容、计算和用户体验全部托管于链上,IC 生态致力于推动去中心化互联网的深度发展,并将更安…

为何云安全产品需区分四层与七层协议攻击:深入理解与应对策略

引言 随着云计算技术的发展和广泛应用,云安全产品的精细化与智能化需求日益凸显。其中,针对网络攻击的防御措施往往基于对传输协议层面的理解和处理,特别是四层(传输层)和七层(应用层)协议攻击…

1、动态数组

1、动态数组 一、什么是数据结构❓1、线性结构2、树形结构3、图形结构 二、线性表三、数组(Array)四、动态数组(Dynamic Array)1、接口设计2、动态数组的设计3、查(1) size、isEmpty(2) indexOf、contains(3) get、checkIndex 4、…

实力上榜 | 创新微MinewSemi再获“物联之星”年度企业投资价值50强

近日,由深圳市物联传媒有限公司、AIoT星图研究院、IOTE组委会、深圳市物联网产业协会主办的“物联之星”2023中国物联网行业年度榜单评选结果正式公布。经过层层筛选,创新微MinewSemi获评2023年度“中国物联网企业投资价值50强”,连续两年实力…

应急响应实战笔记04Windows实战篇(1)

第1篇:FTP暴力破解 0x00 前言 ​ FTP是一个文件传输协议,用户通过FTP可从客户机程序向远程主机上传或下载文件,常用于网站代码维护、日常源码备份等。如果攻击者通过FTP匿名访问或者弱口令获取FTP权限,可直接上传webshell&#…

Redis 不再“开源”:中国面临的挑战与策略应对

Redis 不再“开源”,使用双许可证 3 月 20 号,Redis 的 CEO Rowan Trollope 在官网上宣布了《Redis 采用双源许可证》的消息。他表示,今后 Redis 的所有新版本都将使用开源代码可用的许可证,不再使用 BSD 协议,而是采用…

WPF自定义Panel:让拖拽变得更简单

在 WPF 应用程序中,拖放操作是实现用户交互的重要组成部分。通过拖放操作,用户可以轻松地将数据从一个位置移动到另一个位置,或者将控件从一个容器移动到另一个容器。然而,WPF 中默认的拖放操作可能并不是那么好用。为了解决这个问…

http接口测试—自动化测试框架设计(超详细)

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、测试需求描述 对服务后台一系列的http接口功能测试。 …

【Git篇】复习git

文章目录 🍔什么是git⭐git和svn的区别 🍔搭建本地仓库🍔克隆远程仓库🛸git常用命令 🍔什么是git Git是一种分布式版本控制系统,它可以追踪文件的变化、协调多人在同一个项目上的工作、恢复文件的旧版本等…

微信开发者工具创建一个小程序

创建项目 对于上面这个AppID可以自行选择是注册还是测试号,我是使用的测试号,之后再下面选择模板,我这里选择了JS-基础模板。 进入项目后在模拟器中可看到如下页面: 添加提交按钮进行页面跳转 添加需要跳转的文件夹,…

更新时间后OpenStack neutron 401 Unauthorized解决办法

发现时间跟现实时间有偏差,用 ntpdate cn.pool.ntp.org 更新时间后再用neutron 发现报错 401-{uerror: {umessage: uThe request you have made requires authentication., ucode: 401, utitle: uUnauthorized}} 而且用的是账号密码的认证,还是无法正…

跑通飞浆平台的MTMCT 跨镜跟踪示例

想跑通飞浆平台的MTMCT跨镜跟踪示例,真的是难上加难啊! 改了几处代码,可以顺利跑通了,特此记录: 第一处:不要拉主线的代码,改成 !git clone https://gitee.com/paddlepaddle/PaddleDetection…

Wagtail-基于Python Django的内容管理系统CMS实现公网访问

目录 ⛳️推荐 前言 1. 安装并运行Wagtail 1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具 3. 实现Wagtail公网访问 4. 固定Wagtail公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给…

【vue3学习笔记(一)】vue3简介;使用vue-cli创建工程;使用vite创建工程;分析工程结构;安装开发者工具

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 对应课程136-140节 课程 P136节 《vue3简介》笔记 课程 P137节 《使用vue-cli创建工程》笔记 官方文档: https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create官方文档地址 查看vue-cli版本&#x…