Docker容器资源限制与优化全攻略:CPU、内存、磁盘IO一网打尽

🐇明明跟你说过:个人主页

🏅个人专栏:《Docker入门到精通》 《k8s入门到实战》🏅

🔖行路有良友,便是天堂🔖

目录

一、引言

1、docker容器技术概述

2、资源限制与优化的重要性

二、容器资源限制

1、CPU限制

1.1 CPU配额权重

1.2 CPU core核心限制

1.3、实践案例,如何为CPU设置资源限制 

 2、内存限制

2.1 内存限制选项

 2.2 容器内存限制设置

3、磁盘IO限制

三、Docker容器资源限制与优化的挑战与前景


一、引言

1、docker容器技术概述

Docker容器技术是一种开源的应用容器引擎,它可以让开发者将应用程序及其依赖项打包到一个可移植的容器中,并在任何安装了Docker引擎的服务器上运行。这种技术基于Go语言开发,并遵循Apache2.0协议开源。

Docker容器技术的核心思想是实现“Build, Ship, Run”的流程,即构建、运输和运行。它采用了Linux内核的一些特性,如cgroups(控制组)和namespaces(命名空间),来实现进程隔离和资源限制,从而确保每个容器都拥有独立的运行环境。

与传统的虚拟机相比,Docker容器具有更高的性能和更低的资源消耗。因为容器是直接运行在宿主机上的,不需要像虚拟机那样模拟整个操作系统。此外,Docker还提供了丰富的工具和API,方便开发者进行容器的创建、管理、监控和调度等操作。

2、资源限制与优化的重要性

  • 资源隔离和公平性:在一台主机上可能运行着数百个Docker容器,这些容器虽然相互隔离,但它们共享底层的CPU、内存和磁盘资源。如果没有适当的资源限制,容器之间可能会相互竞争资源,导致资源使用不公平,甚至可能耗尽整个主机或集群的资源,导致服务不可用。因此,通过为容器设置合理的资源限制,可以确保每个容器都有机会公平地使用资源。
  • 提高系统稳定性:资源限制可以帮助我们预防潜在的资源争夺问题,从而提高整个系统的稳定性。通过限制CPU、内存、磁盘和网络等资源的使用,可以避免容器之间的资源冲突,减少因资源竞争而引发的系统崩溃或性能下降的风险。

  • 优化性能:合理的资源限制和优化可以提高Docker容器的性能。例如,通过调整内核参数、优化内存管理、加速网络传输等方法,可以提高容器的运行速度和响应能力,从而提升应用程序的性能和用户体验。
  • 增强安全性:资源限制也可以作为一种安全措施。通过设置严格的资源限制,可以防止恶意攻击者利用容器进行资源消耗攻击,从而保护系统的安全性。

二、容器资源限制

1、CPU限制

1.1 CPU配额权重

在Docker中,cpu-shares(CPU份额)是一个相对权重的概念,用于在有多个容器同时运行并竞争CPU资源时,决定它们之间如何分配可用的CPU时间。它不是一个硬性的限制,而是一个优先级指示器。

cpu-shares的原理基于Linux内核的CFS(完全公平调度器)调度算法。CFS算法试图在所有可运行的进程之间公平地分配CPU时间。在Docker中,每个容器都被视为一个进程组,并由cgroups进行管理。

当为Docker容器设置cpu-shares时,实际上是在告诉Docker:“这个容器相对于其他容器应该获得更多的CPU时间。”默认值通常为1024,但这并不意味着容器将获得1024%的CPU时间;它只是一个相对权重。

例如,如果有两个容器,一个的cpu-shares设置为1000,另一个的设置为500,那么当它们同时运行并都需要CPU时,第一个容器将获得比第二个容器多两倍的CPU时间。

需要注意的是,cpu-shares只在CPU资源受限时才起作用。如果主机上有足够的CPU资源供所有容器使用,那么所有容器都将根据需要使用尽可能多的CPU。此外,cpu-shares本身并不能保证容器获得特定数量的CPU时间;它只是一个指示器,告诉调度器在资源受限时如何分配时间。

 下面是一个示例 Docker 命令,设置了一个容器的 CPU shares 为 512:

docker run --cpu-shares=512 your_image

注意事项: 

  • CPU shares 仅在 CPU 资源有限时起作用,当主机上有足够的 CPU 资源时,它不会对容器的 CPU 使用产生影响。
  • CPU shares 主要用于控制 CPU 资源的分配,但它并不是严格的限制。实际的 CPU 时间分配取决于系统的负载和其他因素。

1.2 CPU core核心限制

1. 使用--cpus参数
这个参数允许指定容器可以使用的最大CPU核数。例如,如果有一个具有4核的CPU,可以限制某个容器只能使用2核。但如果主机的CPU核心数少于指定的--cpus值,Docker将返回一个错误。

用法:

--cpus=1:限制容器最多使用一个 CPU 核心。
--cpus=2:限制容器最多使用两个 CPU 核心。
--cpus=0.5:限制容器最多使用宿主机一半的 CPU 核心。
--cpus=2.5:限制容器最多使用宿主机上 2.5 个 CPU 核心的资源。

2. 使用--cpuset-cpus参数
这个参数允许指定容器可以运行在哪些CPU核心上。这对于需要将容器绑定到特定CPU核心的场景非常有用,例如,当想避免某些核心上的高负载或硬件故障时。0和第1核心上运行。需要注意的是,--cpuset-cpus的参数值应该是一个逗号分隔的CPU编号列表,或者是一个范围(如"0-3"表示第0、1、2和3核心)。

用法:

--cpuset-cpus="0":将容器绑定到 CPU 核心 0 上。
--cpuset-cpus="0-2":将容器绑定到 CPU 核心 0、1、2 上。
--cpuset-cpus="0,2":将容器绑定到 CPU 核心 0 和 2 上。

1.3、实践案例,如何为CPU设置资源限制 

配置容器使用CPU份额:

启动一个容器,分配512权重的使用份额

[root@node1 ~]# docker run -it --cpu-shares 512 centos:latest /bin/bash

--cpu-shares 512 表示将容器的 CPU 分配权重设置为 512。默认情况下,容器的 CPU 分配权重是 1024。因此,512 表示容器获得的 CPU 时间优先级较低。 

查看结果

[root@110f8bc7c096 /]# cat /sys/fs/cgroup/cpu/cpu.shares 
512

将容器绑定到指定的CPU核心上:

使用 --cpuset-cpus 参数,将容器绑定到 CPU 核心 0 上

[root@node1 ~]# docker run -itd --cpuset-cpus="0" centos:latest

 2、内存限制

在Docker中,对内存的资源限制是非常重要的,它可以帮助防止容器消耗过多的内存资源,从而影响宿主机的性能或其他容器的运行。关于内存的限制,Docker提供了多种选项和参数来进行配置。

2.1 内存限制选项

--memory 或 -m:

这个参数用于设置容器的最大内存使用量。例如,--memory=2g 表示容器可以使用最多2GB的内存。如果容器尝试使用超过这个限制的内存,它会被操作系统杀死。

--memory-swap:

这个参数用于同时设置容器的内存和交换空间(swap)的使用量。交换空间是当物理内存不足时,操作系统用于存储内存数据的磁盘空间。例如,--memory-swap=3g 表示容器可以使用最多3GB的内存和交换空间总量。如果不设置这个参数,默认情况下,交换空间的使用量是无限的。

 --memory-swappiness:

这个参数用于控制容器使用交换空间的倾向性。其值范围在0到100之间,其中0表示尽可能不使用交换空间,而100表示积极使用交换空间。默认情况下,该值为60。

--oom-kill-disable:

默认情况下,当容器消耗的内存超过其限制时,操作系统会杀死该容器。使用--oom-kill-disable参数可以禁用这个功能,即当容器发生内存溢出(Out of Memory, OOM)时,它不会被立即杀死。但这并不意味着容器可以无限制地使用内存,因为操作系统仍然会尝试回收内存,并可能最终杀死容器。

--oom-score-adj:

这个参数用于调整容器在OOM(内存溢出)情况下的杀死优先级。其值范围在-1000到1000之间,值越低表示容器的优先级越高,越不容易被杀死。默认情况下,该值为0。

 2.2 容器内存限制设置

设置容器允许使用的内存上限为128M

[root@node1 ~]# docker run -itd -m 128m centos

设置容器允许使用最大内存1G,最大交换分区2G

[root@node1 ~]# docker run -itd -m 1g --memory-swap=2g  centos

3、磁盘IO限制

在 Docker 中对容器进行磁盘 I/O 配额限制的主要目的是确保容器之间和宿主机之间的磁盘资源得到合理分配和利用,并且防止某个容器过度占用磁盘 I/O 资源导致整个系统性能下降或其他容器无法正常工作的情况发生。

用法:

docker run -itd --storage-opt size=10G ubuntu:latest

size=10G 表示为容器设置了 10GB 的磁盘空间限制。

docker run -it  -v /var/www/html/:/var/www/html --device /dev/sda:/dev/sda --device-write-bps /dev/sda:2mb centos

限制容器实例对硬盘的最高写入速度设定为 2MB/s。

三、Docker容器资源限制与优化的挑战与前景

挑战:

  1. 资源隔离与限制:确保容器之间资源的有效隔离,并限制特定容器的资源使用,是一个重要但复杂的挑战。这要求有精确的资源监控和管理机制。
  2. 性能监控与调优:容器化应用程序的性能监控和调优是一个持续的过程。由于容器共享主机资源,因此需要有效的工具来监控和识别潜在的性能瓶颈。
  3. 安全性:随着容器技术的普及,安全问题也日益凸显。如何确保容器的安全性,防止资源滥用和潜在的安全漏洞,是一个需要持续关注的挑战。
  4. 多租户环境:在多租户环境中,如何公平、有效地分配和管理资源,确保每个租户都能获得所需的资源,同时避免资源争用,是另一个挑战。

前景:

  1. 更精细的资源管理:随着技术的发展,我们可以期待更精细、更智能的资源管理策略。例如,基于机器学习的预测性资源管理,可以根据历史数据和实时信息预测未来的资源需求,并进行相应的资源分配。
  2. 更完善的性能监控与调优工具:随着容器技术的成熟,我们可以期待更多、更完善的性能监控和调优工具出现。这些工具将帮助我们更有效地管理和优化容器资源。
  3. 增强的安全性:随着安全问题的日益突出,容器技术的安全性将得到更多的关注。我们可以期待更强大的安全机制和技术来保护容器和容器化应用程序的安全。
  4. 更广泛的应用场景:随着容器技术的不断完善和优化,其应用场景也将得到进一步的扩展。无论是云计算、边缘计算,还是物联网等领域,容器技术都将发挥更大的作用。

综上所述,Docker容器资源限制与优化既面临挑战,也充满前景。随着技术的不断发展和进步,我们相信,这些挑战将被逐一克服,而前景将更加广阔。

🎗️🎗️🎗️以上仅是我对Docker资源限制的个人观点与见解,如果您有任何不同的看法或建议,我非常欢迎在评论区与我分享和讨论。

🚩🚩🚩对于希望深入了解Docker技术的朋友们,我诚挚地邀请您关注我的Docker专栏Docker从零到精通:实战指南。我会定期更新和分享Docker领域的最新知识、技术动态和前沿实践,希望能为您的Docker学习之旅提供有价值的参考和指导。

❤️❤️❤️最后,请允许我衷心感谢您的阅读和对本专栏的支持!您的鼓励是我持续创作的最大动力。希望我们能在Docker的学习道路上共同进步,共创辉煌!!!

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

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

相关文章

C++设计模式_创建型模式_工厂方法模式

目录 C设计模式_创建型模式_工厂方法模式 一、简单工厂模式 1.1 简单工厂模式引入 1.2 简单工厂模式 1.3 简单工厂模式利弊分析 1.4 简单工厂模式的UML图 二、工厂方法模式 2.1 工厂模式和简单工厂模式比较 2.2 工厂模式代码实现 2.3 工厂模式UML 三、抽象工厂模式 3.1 战斗场景…

IDEA的安装教程

1、下载软件安装包 官网下载:https://www.jetbrains.com/idea/ 2、开始安装IDEA软件 解压安装包,找到对应的idea可执行文件,右键选择以管理员身份运行,执行安装操作 3、运行之后,点击NEXT,进入下一步 4、…

RISC-V特权架构 - 特权模式与指令

RV32/64 特权架构 - 特权模式与指令 1 特权模式2 特权指令2.1 mret(从机器模式返回到先前的模式)2.2 sret(从监管模式返回到先前的模式)2.3 wfi(等待中断)2.4 sfence.vma(内存屏障) …

官宣 | 凯琦供应链成为亚马逊SPN物流服务商!

再播一条喜讯!在亚马逊官方平台的筛选考核下,凯琦供应链近日正式入驻亚马逊SPN服务商平台,成为亚马逊SPN第三方承运商。 这也标志着凯琦9年来在FBA物流领域的服务质量得到了客户、官方及行业的广泛认可,未来凯琦将继续为亚马逊卖家…

【LeetCode题解】2182. 构造限制重复的字符串+82. 删除排序链表中的重复元素 II+83. 删除排序链表中的重复元素

文章目录 [2182. 构造限制重复的字符串](https://leetcode.cn/problems/construct-string-with-repeat-limit/)思路: [82. 删除排序链表中的重复元素 II](https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/)[83. 删除排序链表中的重复元素](htt…

swoole

php是单线程。php是靠多进程来处理任务,任何后端语言都可以采用多进程处理方式。如我们常用的php-fpm进程管理器。线程与协程,大小的关系是进程>线程>协程,而我们所说的swoole让php实现了多线程,其实在这里来说,就是好比让php创建了多个进程,每个进程执行一条…

前端学习第六天-css浮动和定位

达标要求 了解浮动的意义 掌握浮动的样式属性 熟练应用清除浮动 熟练掌握定位的三种方式 能够说出网页布局的不同方式的意义 1. 浮动(float) 1.1 CSS 布局的三种机制 网页布局的核心——就是用 CSS 来摆放盒子。CSS 提供了 3 种机制来设置盒子的摆放位置,分…

基于原子变量的内存模型优化

概述 线程间同步通常的实现方法通常为互斥锁,但互斥锁对性能造成了影响,C11引入了内存模型,定义了STD::memory_order枚举,结合原子性操作,实现无锁线程数据同步。 关于memory_order memory_order_relaxed&#xff1…

前端打包部署(黑马学习笔记)

我们的前端工程开发好了,但是我们需要发布,那么如何发布呢?主要分为2步: 1.前端工程打包 2.通过nginx服务器发布前端工程 前端工程打包 接下来我们先来对前端工程进行打包 我们直接通过VS Code的NPM脚本中提供的build按钮来完…

逻辑漏洞(pikachu)

#水平,垂直越权,未授权访问 通过个更换某个id之类的身份标识,从而使A账号获取(修改、删除)B账号数据 使用低权限身份的账号,发送高权限账号才能有的请求,获得其高权限操作 通过删除请求中的认…

Linux查看进程和线程

根据PID查看进程 查找到进程的PID,以查看端口占用为例 lsof -i:8080 根据PID查看进程信息 lsof -p 5807或ll /proc/5807/ /proc/5807/目录下部分子目录说明 cwd 进程运行目录 exe 执行程序的绝对路径 cmdline 程序运行时输入的命令行命令 environ 记录了进程运行…

chromedriver,Chrome驱动的实时更新

发现自己的selenium项目跑不起来了 效验驱动版本 下载链接(可能需要魔法) https://registry.npmmirror.com/binary.html?pathchromedriver/ https://googlechromelabs.github.io/chrome-for-testing/ 找到驱动位置 1. 默认安装路径:Chrome驱动通常会默认安装在系…