Docker之限制容器的资源使用

一、容器所用内存资源的限制

容器可使用的内存:物理内存交换空间(Swap)

1.1、用户内存限制

Docker默认没有设置内存限制。可以通过相关选项限制设置:

  • -m(--memory):设置容器可用的最大内存。该值最低为4MB。
  • --memory-swap:允许容器置入磁盘交换空间中的内存大小

Docker提供4种方式设置容器的用户内存使用:

  • 对容器内存使用无限制(两个选项都不使用)。

  • 设置内存限制并取消交换空间内存限制。

 #使用300内存和尽可能多的交换空间docker run -it -m 300M --memory-swap -1 ubuntu /bin/bash
  • 只设置内存限制。

 # 300MB的内存和300MB的交换空间(默认情况下虚拟内存总量将设置为内存大小的两倍,因此容器能使用300M的交换空间docker run –it -m 300M ubuntu /bin/bash
  • 同时设置内存和交换空间

 # 300MB的内存和700MB的交换空间docker run –it –m 300M --memory-swap 1G ubuntu/bin/bash

1.2、内核内存限制

内核内存不能交换到磁盘中,无法使用交换空间,消耗过多可能导致其阻塞系统服务。

 # 在500MB的内存中,可以使用最高50MB的内核内存docker run –it -m 500M --kemel-memory 50M ubuntu /bin/bash​# 只可以使用50MB的内核内存docker run –it --kernel-memory 50M ubuntu /bin/bash

1.3、设置内存预留实现软限制

使用--memory-reservation选项设置内存预留。它是一种内存软限制,允许更多的内存共享。设置后,Docker将检测内存争用或内存不足,并强制容器将其内存消耗限制为预留值。

内存预留值应当始终低于硬限制。作为一个软限制功能,内存预留并不能保证不会超过限制。

 # 限制内存为500MB,内存预留值(软限制)为200MB。# 当容器消耗内存大于200MB、小于500MB时,下一次系统内存回收将尝试将容器内存缩减到200MB以下。docker run –it –m 500M --memory-reservation 200M ubuntu /bin/bash​# 设置内存软限制为1GBdocker run –it —-memory-reservation 1G ubuntu /bin/bash

二、容器所用CPU资源的限制

默认情况为所有容器可以平等地使用主机CPU资源并且不受限制。

2.1、CPU份额限制

-c(--cpu-shares)选项将CPU份额权重设置为指定的值。默认值为1024,如果设置为0,系统将忽略该值并使用默认值1024。

2.2、CPU周期限制

--cpu-period选项(以μs为单位)设置CPU周期以限制容器CPU 资源的使用。默认的CFS(完全公平调度器)周期为100ms(100000μs)。通常将--cpu-period与--cpu-quota这两个选项配合使用:

 # 如果只有1个CPU,则容器可以每50ms(50000μs)获得50%(25000/50000)的CPU运行时间。docker run -it --cpu-period=50000 -~cpu-quota=25000 ubuntu /bin/bash

可用--cpus选项指定容器的可用 CPU 资源来达到同样的目的。--cpus 选项值是一个浮点数,默认值为 0.000,表示不受限制。

 # 上述可改为docker run -it --cpus=0.5 ubuntu /bin/bash

--cpu-period和--cpu-quota选项都是以1个CPU为基准。

2.3、CPU放置限制

--cpuset-cpus选项限制容器进程在指定的CPU上执行。

# 容器中的进程可以在cpu1和cpu3上执行docker run -it--cpuset-cpus="1, 3" ubuntu:14.04 /bin/bash​# 容器中的进程可以在cpu0、cpu1和cpu 2上执行docker run -it --cpuset-cpus="0-2" ubuntu:14.04 /bin/bash

2.4、CPU配额限制

--cpu-quota选项限制容器的CPU配额,默认值为0表示容器占用 100%的CPU资源个CPU)。

CFS用于处理进程执行的资源分配,是由内核使用的默认 Linux 调度程序。将此值设置50000意味着限制容器至多使用CPU资源的50%。对于多个CPU而言,调整--cpu-quota选项必要的。

三、容器所用块I/O带宽的限制

块I/O带宽(Block I/O Bandwidth,Blkio)是另一种可以限制容器使用的资源。块I/O指磁盘的写,Docker可通过设置权重、限制每秒字节数(B/s)和每秒I/O次数(IO/s)的方式控制容器读写盘的带宽。

3.1、设置块I/O权重

--blkio-weight选项更改比例(原默认为500),设置相对于所有其他正在运行的容器的块 I/O 带宽权重。

# 创建两个有不同块 I/O 带宽权重的容器。
docker run –it --name c1 --blkio-weight 300 ubuntu /bin/bash
docker run -it --name c2 --blkio-weight 600 ubuntu /bin/bash

3.2、限制设备读写速率

Docker 根据两类指标限制容器的设备读写速率:一类是每秒字节数,另一类是每秒I/O次数

  • 限制每秒字节数

--device-read-bps选项限制指定设备的读取速率,即每秒读取的字节数。

# 创建一个容器,并限制对/dev/sda设备的读取速率为每秒1MB
docker run -it --device-read-bps /dev/sda:1mb ubuntu

类似地,可使用--device-write-bps选项限制指定设备的写入速率。格式:

<设备>:<速率值>[单位]

  • 限制每秒I/O次数

--device-read-iops--device-write-iops选项制指定设备的读取和写入速率,用每秒I/O次数表示。

# 创建一个容器,限制它对1devsd3设备的读取速率为每秒1000次。
docker run -it --device-read-iops /dev/sda:1000 ubuntu

四、资源限制的实现机制

对容器使用的内存、CPU和块I/O带宽资源的限制具体是由控制组(Cgroup)的相应子系统来实现的

  • memory子系统设置控制组中的住务所使用的内存限制;

  • cpu子系统通过调度程序提供对CPU的控制组任务的访问;

  • blkio子系统为块设备(如磁盘、固态硬盘、USB等)设置输入和输出限制。

在docker run命令中使用--cpu-shares--memory--device-read-bps等选项实际上就是在配置控制组,相关的配置文件保存在/sys/fs/cgroup目录中。

五、示例

5.1、验证分析容器资源限制的实现机制

  • 启动一个容器,设置内存限额为300MB,CPU权重为512。

[root@docker ~]# docker run --rm -d -p 8080:80 -m 300M --cpu-shares=512 httpd
b8a03a3887f1f...
  • 查看/sys/fs/cgroup/cpu/docker目录,发现Linux为每个正在运行的容器创建一个Cgroup目录,以容器ID命名:

[root@docker ~]# ls -l /sys/fs/cgroup/cpu/docker/
total 0
drwxr-xr-x 2 root root 0 Apr 29 13:08 b8a03a3887f1f...
...
  • 进一步查看容器子目录,会发现每个容器的子目录中都包含所有与CPU相关的Cgroup配置:

[root@docker ~]# ls -l /sys/fs/cgroup/cpu/docker/b8a03a3887f1f...
total 0
...
-rw-r--r-- 1 root root 0 Apr 29 13:12 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Apr 29 13:08 cpu.shares
...
  • 查看其中cpu.shares文件的内容,发现它保存的就是--cpu-shares选项的配置(512):

[root@docker-2322030238 ~]# cat /sys/fs/cgroup/cpu/docker/b8a03a3887f1f.../cpu.shares 
512
  • 类似,查看/sys/fs/cgroup/memory/docker目录中的内存Cgroup配置,发现memory.limit_in_bytes文件保存的就是-m选项的配置,本例设300MB,用字节表示为314572800:

[root@docker ~]# cat /sys/fs/cgroup/memory/docker/b8a03a3887f1f.../memory.limit_in_bytes 
314572800

5.2、动态更改容器的资源限制

docker update命令可以动态地更新容器配置,其语法:

docker update [选项] 容器 [容器...]

启动一个限制资源的容器后,再修改其资源限制:

[root@docker ~]# docker run --rm -d -p 8080:80 -m 300M --cpu-shares=512 httpd
29d3cb1392b8e...
[root@docker ~]# docker update -m 500M --cpu-shares=10245 29d3
29d3

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

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

相关文章

AMEYA360:佰维存储推出工规级宽温LPDDR4X芯片,高可靠性赋能工业与汽车电子应用

近日&#xff0c;佰维存储发布了工规级宽温LPDDR4X嵌入式存储芯片&#xff0c;该产品传输速率高达4266Mbps&#xff0c;容量覆盖2GB~8GB&#xff0c;可适应-40℃~95℃宽温工作环境;采用BGA 200 Ball封装&#xff0c;尺寸小至10.0x14.5x1.0mm&#xff0c;满足数据通信、轨道交通…

内网端口转发与代理

思路&#xff1a;渗透的前提是双方能够建立通信。目前无法和win7建立通信&#xff0c;但是拿到了windows2003的权限&#xff0c;所以可以在Windows2003主机上面建立节点&#xff0c;作为跳板机去访问到内网。 目前状态&#xff1a;控制win2003&#xff08;IP&#xff1a;192.1…

活动回放 | 如何进行全增量一体的异构数据库实时同步

以 AI领域为代表的新技术不断涌现&#xff0c;新的应用风口也逐渐清晰。为了加紧跟上技术发展的步伐&#xff0c;越来越多的企业开始着手&#xff0c;对仍以传统关系型数据库为主的应用后端进行现代化升级。 这就涉及到如何在不影响并保持现有业务系统正常运转的前提下&#xf…

软件测试产品交付包括哪些内容?

软件测试产品交付通常会包括以下内容: 1. 测试计划:详细的测试方案、测试范围、测试资源与时间安排等内容。 2. 测试用例:包括功能测试用例、性能测试用例、安全测试用例等各类测试用例。 3. 测试环境:包括硬件环境、软件环境、网络环境、数据环境等测试所需要的各种环境。 4. …

LeetCode 面试题 17.14 —— 最小 k 个数

阅读目录 1. 题目2. 解题思路一3. 代码实现一4. 解题思路二5. 代码实现二 1. 题目 2. 解题思路一 第一种方法就是利用快速排序&#xff0c;第一次排序后&#xff0c;数组被划分为了左右两个区间 [ 0 , i ] , [ i 1 , a r r . s i z e ( ) − 1 ] [0, i], [i1, arr.size()-1]…

Docker入门指南:Docker容器的部署(一)

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 当今软件开发领域中&#xff0c;Docker 成为了一种流行的容器化技术。Docker 可以帮助开发者将应用程序及其依赖项打包到一个独立且可移植的容器中&#xf…

云服务器IDC机房网络无法访问github如何解决?

到站长之家查询一下github的IP地址。 https://tool.chinaz.com/ 然后&#xff0c;编辑服务器hots文件。 vi /etc/hosts 打开后&#xff0c;在文件最后一行添加 ​20.205.243.166 github.com

Hibernate 元数据模型(MetaModel)提示类没有找到错误

在进行一次编译的时候&#xff0c;提示下面的错误信息&#xff1a; java: java.lang.ClassNotFoundException: org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor 问题和解决 如果你对 Hibernate 的元数据还是不非常了解的话&#xff0c;请参考文章&#xff1a; JPA 的…

汽车 - 降档补油超车

降档补油这事可是开手动档最大的乐趣之一&#xff0c;甚至还是进阶技巧“跟趾”的基础&#xff0c;所以建议开手动档的朋友一定要熟练掌握。 首先我们要明白手动档降档的意义&#xff0c;简单来说&#xff0c;发动机在转速高的时候能获得更好的加速力。这点相信开手动档的朋友都…

2002-2021年各地区平均受教育年限数据(分性别)(含原始数据+计算过程+计算结果)

2002-2021年各地区平均受教育年限数据&#xff08;分性别&#xff09;&#xff08;含原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;2002-2021年 2、来源&#xff1a;国家统计局、统计年鉴、各省年鉴 3、指标&#xff1a;行政区划代码、地区、年份、人均受教育年…

C++11,{}初始化,initializer_list,decltype,右值引用,类和对象的补充

c98是C标准委员会成立第一年的C标准&#xff0c;C的第一次更新是C03&#xff0c;但由于C03基本上是对C98缺陷的修正&#xff0c;所以一般把C98与C03合并起来&#xff0c;叫做C98/03&#xff1b; 后来原本C委员会更新的速度预计是5年更新一次&#xff0c;但由于C标准委员会的进…

Linux环境下的事件驱动力量:探索Libevent的高性能I/O架构

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《Linux环境下的事件驱动力量&#xff1a;探索Libevent的高性能I/O架构》&#xff0c;在这篇文章中&#xff0c;你将会学习到Libevent的高性能I/O原理以及应用&#xff0c;并且我会给出源码…

一竞技MSI:淘汰赛抽签结果出炉 BLG和T1同半区,TES首轮交手TL!

北京时间5月6日&#xff0c;MSI在今天进入短暂的休赛&#xff0c;在昨天结束的入围赛之后&#xff0c;PSG战队作为外卡赛区唯一的队伍进入到正赛&#xff0c;另外欧洲赛区的FNC战队也是击败GAM战队拿到正赛的资格。在比赛结束之后&#xff0c;也是进行了淘汰赛的胜败分组赛的抽…

Llama3-Tutorial之LMDeploy高效部署Llama3实践

Llama3-Tutorial之LMDeploy高效部署Llama3实践 Llama 3 近期重磅发布&#xff0c;发布了 8B 和 70B 参数量的模型&#xff0c;lmdeploy团队对 Llama 3 部署进行了光速支持&#xff01;&#xff01;&#xff01; 书生浦语和机智流社区同学光速投稿了 LMDeploy 高效量化部署 Llam…

JS基础:8个算数运算符详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃 大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端基础路线”&#xff0c;可获取完整web基础…

按钮组实现切换时背景变化

需求&#xff1a; 按钮组之间切换时&#xff0c;选中的按钮背景变色&#xff0c;其他按钮显示原来的颜色 css代码&#xff1a; .btnClass{width: 120px;border: 1px solid #eeeeee;color: black;background-color: white;} .btnChoosedClass{color: white;background-color:…

秋招后端开发面试题 - MySQL基础

目录 MySQL基础前言面试题MySQL 基础篇Mysql 的基础架构&#xff1f;MySQL 的长连接和短连接长连接引起的异常重启问题&#xff1f;说一下 MySQL 执行一条查询语句的内部执行过程&#xff1f;MySQL 查询缓存的功能有何优缺点&#xff1f;MySQL 的常用引擎都有哪些&#xff1f;I…

OpenHarmony实战开发-上传文件

Web组件支持前端页面选择文件上传功能&#xff0c;应用开发者可以使用onShowFileSelector()接口来处理前端页面文件上传的请求。 下面的示例中&#xff0c;当用户在前端页面点击文件上传按钮&#xff0c;应用侧在onShowFileSelector()接口中收到文件上传请求&#xff0c;在此接…

详解xml-java语言

1.XML在线学习手册 XML 教程 2.XML可以做什么 1.给两个程序之间进行数据通信。现在用的最多的是JSON。 2.给服务器做配置文件。 3.存储复杂的数据关系。 4.还可以充当小型的数据库。 3.书写格式 <?xml version"1.0" encoding"UTF-8" ?> <…

使用Gitbook生成电子书

背景 《Google工程实践文档》相对原文Google’s Engineering Practices documentation &#xff0c;部分内容过时了。需要更新中文版&#xff0c;并使用Gitbook把Markdown文件转换成对应的PDF电子书。   上一次生成PDF电子书是5年前&#xff0c;当时生成电子书的环境早已不在…