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

本文主要是介绍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的学习道路上共同进步,共创辉煌!!!

这篇关于Docker容器资源限制与优化全攻略:CPU、内存、磁盘IO一网打尽的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/768574

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

LeetCode11. 盛最多水的容器题解

LeetCode11. 盛最多水的容器题解 题目链接: https://leetcode.cn/problems/container-with-most-water 示例 思路 暴力解法 定住一个柱子不动,然后用其他柱子与其围住面积,取最大值。 代码如下: public int maxArea1(int[] height) {int n = height.length;int

Ubuntu20.04离线安装Docker

1.下载3个docker离线安装包,下载网址: https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/ 2.把3个离线安装包拷贝到ubuntu本地执行以下命令 sudo dpkg -i containerd.io_1.4.6-1_amd64.deb sudo dpkg -i docker-ce-c

加载资源文件失败

背景         自己以前装了一个海康的深度学习算法平台,试用期是一个月,过了一个月之后,因为没有有效注册码或者加密狗的支持了导致无法使用,于是打算卸载掉,在卸载一个软件的时候,无论是使用控制面板还是软件自带的卸载功能,总是卸载不掉,提示“加载资源文件失败”。该软体主要包括以下两部分: 用自带卸载功能卸载的时候分别提示如下:     用控制面板卸载的时候反应很慢,最后也是提示这个

亮相WOT全球技术创新大会,揭秘火山引擎边缘容器技术在泛CDN场景的应用与实践

2024年6月21日-22日,51CTO“WOT全球技术创新大会2024”在北京举办。火山引擎边缘计算架构师李志明受邀参与,以“边缘容器技术在泛CDN场景的应用和实践”为主题,与多位行业资深专家,共同探讨泛CDN行业技术架构以及云原生与边缘计算的发展和展望。 火山引擎边缘计算架构师李志明表示:为更好地解决传统泛CDN类业务运行中的问题,火山引擎边缘容器团队参考行业做法,结合实践经验,打造火山

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

利用Frp实现内网穿透(docker实现)

文章目录 1、WSL子系统配置2、腾讯云服务器安装frps2.1、创建配置文件2.2 、创建frps容器 3、WSL2子系统Centos服务器安装frpc服务3.1、安装docker3.2、创建配置文件3.3 、创建frpc容器 4、WSL2子系统Centos服务器安装nginx服务 环境配置:一台公网服务器(腾讯云)、一台笔记本电脑、WSL子系统涉及知识:docker、Frp