Docker资源管理和分配指南

什么是cgroup?

cgroups其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组(如CPU、内存、磁盘输入输出等)。
什么是Docker资源限制?
默认情况下,Docker容器是没有资源限制的,它会尽可能地使用宿主机能够分配给它的资源。如果不对容器资源进行限制,容器之间就会相互影响,一些占用硬件资源较高的容器会吞噬掉所有的硬件资源,从而导致其它容器无硬件资源可用,发生停服状态。 Docker提供了限制内存,CPU或磁盘IO的方法, 可以对容器所占用的硬件资源大小以及多少进行限制,我们在使用docker create创建一个容器或者docker run运行一个容器的时候就可以来对此容器的硬件资源做限制。
Docker 通过 cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。
限制Docker使用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的优先级。
bash
复制代码# 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资源的绝对限制。
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-quota 设置容器在一个调度周期内能使用的 CPU 时间时实际上设置的是一个上限。 并不是说容器一定会使用这么长的 CPU 时间。
启动一个容器,将其绑定到 cpu 1 上执行,给其 --cpu-quota 和 --cpu-period 都设置为 50000。表示每个容器进程的调度周期为 50000,容器在每个周期内最多能使用 50000 CPU 时间。
css
复制代码docker run -d --name mongo1 --cpuset-cpus 1 --cpu-quota=50000 --cpu-period=50000 docker.io/mongo
再docker stats mongo-1 mongo-2可以观察到这两个容器,每个容器对 cpu 的使用率在 50% 左右。说明容器并没有在每个周期内使用 50000 的 cpu 时间。
使用docker stop mongo2命令结束第二个容器,再加一个参数-c 2048 启动它:
css
复制代码docker run -d --name mongo2 --cpuset-cpus 1 --cpu-quota=50000 --cpu-period=50000 -c 2048 docker.io/mongo
再用docker stats mongo-1 mongo-2命令可以观察到第一个容器的 CPU 使用率在 33% 左右,第二个容器的 CPU 使用率在 66% 左右。因为第二个容器的共享值是 2048,第一个容器的默认共享值是 1024,所以第二个容器在每个周期内能使用的 CPU 时间是第一个容器的两倍。
总结
● 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的两倍。
bash
复制代码# 允许该容器最多使用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(不使用文件缓存)有效。
如何进行Block IO的限制?
默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight 参数来改变容器 block IO 的优先级。 --blkio-weight 与 --cpu-shares 类似,设置的是相对权重值,默认为 500。在下面的例子中,container_A 读写磁盘的带宽是 container_B 的两倍。
css
复制代码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。
对写bps进行限制的测试
限制容器写 /dev/sda 的速率为 30 MB/s。
arduino
复制代码docker run -it --device-write-bps /dev/sda:30MB centos:latest
通过 dd 测试在容器中写磁盘的速度。因为容器的文件系统是在宿主机的 /dev/sda 上的,在容器中写文件相当于对宿主机 /dev/sda 进行写操作。另外,oflag=direct 指定用 direct IO 方式写文件,这样 --device-write-bps 才能生效。
bash
复制代码time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
参数说明如下:
● 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资源与CPU、内存和磁盘IO资源不同。如果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了。
查看是否具备–gpus参数
bash
复制代码docker run --help | grep -i gpus
查看nvidia界面是否能够启动
运行nvidia官网提供的镜像,并输入nvidia-smi命令,查看nvidia界面是否能够启动。
css
复制代码docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
在Docker容器中使用GPU
bash
复制代码# 使用所有GPU
docker run --gpus all nvidia/cuda:9.0-base nvidia-smi

使用两个GPU

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

指定GPU运行

docker run --gpus ‘“device=2”’ nvidia/cuda:9.0-base nvidia-smi
docker run --gpus ‘“device=1,2”’ nvidia/cuda:9.0-base nvidia-smi
docker run --gpus ‘“device=UUID-ABCDEF,1”’ nvidia/cuda:9.0-base nvidia-smi
总结
本文探索了Docker的资源限制相关知识,在日常开发中应该给容器设置一个合理的资源限制值,以防出现硬件资源不足的情况,从而导致Linux错杀进程。同时,也讲述了如何给Docker分配GPU。

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

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

相关文章

代码随想录阅读笔记-二叉树【合并二叉树】

题目 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节…

vue快速入门(四)v-html

注释很详细&#xff0c;直接上代码 上一篇 新增内容 使用v-html将文本以html的方式显示 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, …

《论文阅读》一种基于反事实推理的会话情绪检测无训练去偏框架 EMNLP 2023

《论文阅读》一种基于反事实推理的会话情绪检测无训练去偏框架 EMNLP 2023 前言简介相关工作模型构架Basic ClassificationBias ExtractionUnbiased Inference实验结果前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天…

WPS二次开发系列:WPS SDK初始化

作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 本文将详细介绍WPS SDK初始化&#xff0c;帮您能够更…

【web】nginx+php-fpm云导航项目部署-(简版)

一、yum安装nginx yum -y install nginx 二、php环境安装 2.1 php安装 yum -y install php 2.2 php-fpm安装 yum -y install php-fpm 注&#xff1a;PHP在 5.3.3 之后已经讲php-fpm写入php源码核心了。 2.3 项目依赖的php-xml和php-xmlrpc安装 yum -y install php-…

开源模型应用落地-chatglm3-6b模型小试-入门篇(一)

一、前言 刚开始接触AI时&#xff0c;您可能会感到困惑&#xff0c;因为面对众多开源模型的选择&#xff0c;不知道应该选择哪个模型&#xff0c;也不知道如何调用最基本的模型。但是不用担心&#xff0c;我将陪伴您一起逐步入门&#xff0c;解决这些问题。 在信息时代&#xf…

LeetCode 第391场周赛个人题解

目录 哈沙德数 原题链接 思路分析 AC代码 换水问题 II 原题链接 思路分析 AC代码 交替子数组计数 原题链接 思路分析 AC代码 最小化曼哈顿距离 原题链接 思路分析 AC代码 哈沙德数 原题链接 思路分析 签到题&#xff0c;不说了 AC代码 class Solution:def s…

Firefox 关键词高亮插件的简单实现

目录 1、配置 manifest.json 文件 2、编写侧边栏结构 3、查找关键词并高亮的方法 3-1&#xff09; 如果直接使用 innerHTML 进行替换 4、清除关键词高亮 5、页面脚本代码 6、参考 1、配置 manifest.json 文件 {"manifest_version": 2,"name": &quo…

ES6展开运算符

1.展开可迭代对象&#xff08;简单理解为数组和伪数组&#xff09;&#xff0c;如数组、 NodeList 、arguments。 可以通过展开运算符把一个伪数组转换为数组 const a [...document.body.children]; console.log(a); console.log(Array.isArray(a));2.实现数组的浅拷贝 cons…

金融出海机遇与挑战

全球化进程持续推进&#xff0c;在大环境的驱使下&#xff0c;金融科技公司逐渐将视野放到“海外”&#xff0c;本文将分析金融科技应用出海所面临的机遇与挑战。 一、金融科技出海机遇 政策支持 中关村互联网金融研究院和中关村金融科技产业发展联盟发布的《中国金融科技与数…

wireshark解析grpc/protobuf的方法

1&#xff0c;wireshark需要安装3.20以上 下载地址&#xff1a;https://www.wireshark.org/ 2&#xff0c;如果版本不对&#xff0c;需要卸载&#xff0c;卸载方法&#xff1a; sudo rm -rf /Applications/Wireshark.app sudo rm -rf $HOME/.config/wireshark sudo rm -rf /…

如何写一篇吸引人的软文(A5资源网原创)

写一篇吸引人的软文需要结合以下几个关键要素&#xff1a; 标题&#xff1a;一个吸引人的标题是吸引读者点击进入文章的第一步。标题要简洁明了&#xff0c;能够引起读者的兴趣&#xff0c;同时也要与文章内容相关。可以使用一些诱人的词汇&#xff0c;如”绝密揭露”、”独家…

Linux笔记之制作基于ubuntu20.4的最小OpenGL C++开发docker镜像

Linux笔记之制作基于ubuntu20.4的最小OpenGL C开发docker镜像 —— 2024-04-03 夜 code review! 文章目录 Linux笔记之制作基于ubuntu20.4的最小OpenGL C开发docker镜像1.这里把这本书的例程代码放在了Dockerfile所在的文件夹内以使镜像预装例程代码2.创建Dockerfile3.构建Do…

Educational Codeforces Round 133 (Rated for Div. 2) (C dp D前缀和优化倍数关系dp)

A&#xff1a;能用3肯定用三&#xff0c;然后分类讨论即可 #include<bits/stdc.h> using namespace std; const int N 2e510,M2*N,mod998244353; #define int long long typedef long long LL; typedef pair<int, int> PII; typedef unsigned long long ULL; usi…

开源项目生存现况:xz投毒事件引发的思考与GNU tar维护挑战

&#xff08;首发地址&#xff1a;学习日记 https://www.learndiary.com/2024/04/xz-tar/&#xff09; 嗨&#xff0c;大家好&#xff01;我是来自淘宝网“学习日记小店”的 learndiary&#xff0c;专注于 Linux 服务领域。今天我要和大家谈谈近期备受瞩目的 XZ 供应链投毒事件…

【前端面试3+1】10 npm run dev 发生了什么、vue的自定义指令如何实现、js的数据类型有哪些及其不同、【最长公共前缀】

一、npm run dev发生了什么 运行npm run dev时&#xff0c;通常是在一个基于Node.js的项目中&#xff0c;用来启动开发服务器或者执行一些开发环境相关的任务。下面是一般情况下npm run dev会执行的步骤&#xff1a; 1. 查找package.json中的scripts字段&#xff1a; npm会在项…

redis之主从复制、哨兵模式

一 redis群集有三种模式 主从复制&#xff1a; 主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。 主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简单的故障恢复。 缺陷&#xff1a; 故障恢复无法自动化&…

VSCode安装及Python、Jupyter插件安装使用

VSCode 介绍 Visual Studio Code&#xff08;简称VSCode&#xff09;是一个由微软开发的免费、开源的代码编辑器。VSCode是一个轻量级但是非常强大的代码编辑器&#xff0c;它支持多种编程语言&#xff08;如C,C#&#xff0c;Java&#xff0c;Python&#xff0c;PHP&#xff0…

Redis的值有5种数据结构,不同数据结构的使用场景是什么?

文章目录 字符串缓存计数共享Session限速 哈希缓存 列表消息队列文章列表栈队列有限集合 集合标签抽奖社交需求 有序集合排行榜系统 字符串 缓存 &#xff08;1&#xff09;使用原生字符类型缓存 优点&#xff1a;简单直观&#xff0c;每个属性都支持更新操作 缺点&#xff1…

如何在本地搭建集成大语言模型Llama 2的聊天机器人并实现无公网IP远程访问

文章目录 1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛&#xff0c;包括聊天机…