Docker中如何限制容器可用的 CPU

news2025/1/21 6:32:23

默认情况下容器可以使用的主机 CPU 资源是不受限制的。和内存资源的使用一样,如果不对容器可以使用的 CPU 资源进行限制,一旦发生容器内程序异常使用 CPU 的情况,很可能把整个主机的 CPU 资源耗尽,从而导致更大的灾难。本文将介绍如何限制容器可以使用的 CPU 资源。
本文的 demo 中会继续使用《Docker: 限制容器可用的内存》一文中创建的 docker 镜像 u-stress 进行压力测试,文中就不再过多的解释了。

1. 限制可用的 CPU 个数

在 docker 1.13 及更高的版本上,能够很容易的限制容器可以使用的主机 CPU 个数。只需要通过 --cpus 选项指定容器可以使用的 CPU 个数就可以了,并且还可以指定如 1.5 之类的小数。接下来我们在一台有四个 CPU 且负载很低的主机上进行 demo 演示:

在这里插入图片描述
通过下面的命令创建容器,–cpus=2 表示容器最多可以使用主机上两个 CPU:

docker run -it --rm --cpus=2 u-stress:latest /bin/bash

然后由 stress 命令创建四个繁忙的进程消耗 CPU 资源:

stress -c 4

我们先来看看 docker stats 命令的输出:
在这里插入图片描述
容器 CPU 的负载为 200%,它的含义为单个 CPU 负载的两倍。我们也可以把它理解为有两颗 CPU 在 100% 的为它工作。再让我们通过 top 命令看看主机 CPU 的真实负载情况:
在这里插入图片描述哈哈,有点大跌眼镜!实际的情况并不是两个 CPU 负载 100%,而另外两个负载 0%。四个 CPU 的负载都是 50%,加起来容器消耗的 CPU 总量就是两个 CPU 100% 的负载。

看来对于进程来说是没有 CPU 个数这一概念的,内核只能通过进程消耗的 CPU 时间片来统计出进程占用 CPU 的百分比。这也是我们看到的各种工具中都使用百分比来说明 CPU 使用率的原因。
严谨起见,我们看看 docker 的官方文档中是如何解释 –cpus 选项的:
Specify how much of the available CPU resources a container can use.

果然,人家用的是 “how much”,不可数的!并且 --cpus 选项支持设为小数也从侧面说明了对 CPU 的计量只能是百分比。
看来笔者在本文中写的 “CPU 个数” 都是不准确的。既然不准确,为什么还要用?当然是为了容易理解。况且笔者认为在 --cpus 选项的上下文中理解为 “CPU 个数” 并没有问题(有兴趣的同学可以读读 –cpus 选项的由来,人家的初衷也是要表示 CPU 个数的)。

虽然 --cpus 选项用起来很爽,但它毕竟是 1.13 才开始支持的。对于更早的版本完成同样的功能我们需要配合使用两个选项:–cpu-period 和 --cpu-quota(1.13 及之后的版本仍然支持这两个选项)。下面的命令实现相同的结果:

docker run -it --rm --cpu-period=100000 --cpu-quota=200000 u-stress:latest /bin/bash

这样的配置选项是不是让人很傻眼呀!100000 是什么?200000 又是什么? 它们的单位是微秒,100000 表示 100 毫秒,200000 表示 200 毫秒。它们在这里的含义是:在每 100 毫秒的时间里,运行进程使用的 CPU 时间最多为 200 毫秒(需要两个 CPU 各执行 100 毫秒)。要想彻底搞明白这两个选项的同学可以参考:CFS BandWith Control。我们要知道这两个选项才是事实的真相,但是真相往往很残忍!还好 --cpus 选项成功的解救了我们,其实它就是包装了 --cpu-period--cpu-quota

2. 指定固定的 CPU

通过 --cpus 选项我们无法让容器始终在一个或某几个 CPU 上运行,但是通过 --cpuset-cpus 选项却可以做到!这是非常有意义的,因为现在的多核系统中每个核心都有自己的缓存,如果频繁的调度进程在不同的核心上执行势必会带来缓存失效等开销。下面我们就演示如何设置容器使用固定的 CPU,下面的命令为容器设置了 --cpuset-cpus 选项,指定运行容器的 CPU 编号为 1:

docker run -it --rm --cpuset-cpus="1" u-stress:latest /bin/bash

再启动压力测试命令:

stress -c 4

然后查看主机 CPU 的负载情况:
在这里插入图片描述这次只有 Cpu1 达到了 100%,其它的 CPU 并未被容器使用。我们还可以反复的执行 stress -c 4 命令,但是始终都是 Cpu1 在干活。
再看看容器的 CPU 负载,也是只有 100%:

在这里插入图片描述--cpuset-cpus 选项还可以一次指定多个 CPU:

docker run -it --rm --cpuset-cpus="1,3" u-stress:latest /bin/bash

这次我们指定了 1,3 两个 CPU,运行 stress -c 4 命令,然后检查主机的 CPU 负载:
在这里插入图片描述Cpu1 和 Cpu3 的负载都达到了 100%。
容器的 CPU 负载也达到了 200%:
在这里插入图片描述--cpuset-cpus 选项的一个缺点是必须指定 CPU 在操作系统中的编号,这对于动态调度的环境(无法预测容器会在哪些主机上运行,只能通过程序动态的检测系统中的 CPU 编号,并生成 docker run 命令)会带来一些不便。

3. 设置使用 CPU 的权重

当 CPU 资源充足时,设置 CPU 的权重是没有意义的。只有在容器争用 CPU 资源的情况下, CPU 的权重才能让不同的容器分到不同的 CPU 用量。--cpu-shares 选项用来设置 CPU 权重,它的默认值为 1024。我们可以把它设置为 2 表示很低的权重,但是设置为 0 表示使用默认值 1024。
下面我们分别运行两个容器,指定它们都使用 Cpu0,并分别设置 --cpu-shares 为 512 和 1024:

docker run -it --rm --cpuset-cpus="0" --cpu-shares=512 u-stress:latest /bin/bash
docker run -it --rm --cpuset-cpus="0" --cpu-shares=1024 u-stress:latest /bin/bash

在两个容器中都运行 stress -c 4 命令。

此时主机 Cpu0 的负载为 100%:

在这里插入图片描述
容器中 CPU 的负载为:
在这里插入图片描述

两个容器分享一个 CPU,所以总量应该是 100%。具体每个容器分得的负载则取决于 --cpu-shares 选项的设置!我们的设置分别是 512 和 1024,则它们分得的比例为 1:2。在本例中如果想让两个容器各占 50%,只要把 --cpu-shares 选项设为相同的值就可以了。

总结

相比限制容器用的内存,限制 CPU 的选项要简洁很多。但是简洁绝对不是简单,大多数把复杂东西整简单的过程都会丢失细节或是模糊一些概念,比如从 --cpu-period--cpu-quota 选项到 --cpus 选项的进化。对于使用者来说这当然是好事,可以减缓我们的学习曲线,快速入手。

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

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

相关文章

FileInputFormat的实现类

FileINputFormat的切片机制 FileInputFormat是MapReduce中用于处理文件输入的基类,它定义了输入文件的切片规则,并提供了默认的切片实现。具体来说,FileInputFormat会根据输入文件的大小和块大小等因素计算出每个切片的起始位置和长度&#…

【机器学习】多元线性回归详解和特征压缩

注意⚠️阅读本文前,你应该需要掌握:机器学习线性回归模型、高等数学微积分部分内容、线性代数矩阵部分内容 前情提要:https://blog.csdn.net/weixin_45434953/article/details/130593910 一、多元线性回归的假设函数 首先我们考虑以下的例…

linux Ubuntu Python 3.10 环境报错与解决方案集合

环境配置参考文章:使用Alpaca-Lora基于LLaMA(7B)二十分钟完成微调 1.报错.nvidia/cublas/lib/libcublas.so.11: undefined symbol: cublasLtHSHMatmulAlgoInit, version libcublasLt.so.11 解决方法: pip uninstall nvidia_cublas_cu112.CUDA版本对应…

Guitar Pro8优秀的自动扒谱软件

对于一些技术娴熟的音乐人来说,不仅需要演奏已有的乐谱,有时还需要从听到的其他音乐中将谱子扒下来。扒谱时可以借助扒谱软件,比如Guitar Pro,就是一款优秀的扒谱软件。下面就和大家分享一下guitar pro能自动扒谱吗,gu…

基于Java+SpringBoot+Vue餐厅点餐管理系统设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

spring boot与asp.net core区别联系

之前一直使用C#编写网站,最近也在了解学习java,根据目前我了解的和学习到的做一个总结分析,写的不好,大家见谅。 联系 名称javac#DIspringasp.net core、Autofac、UnityAOPspringasp.net coreORMmubatis、HibernateEntityFramew…

【MySQL】MySQL索引之最左前缀优化

文章目录 一、联合索引联合索引执行示例 二、索引的 order by优化MySQL中的排序方式数据准备无索引有索引where子句索引字段顺序不一致order by索引字段顺序不一致索引字段升降序不一致 三、总结 一、联合索引 对主键建立的索引叫做聚簇索引, 对普通字段建立的索引叫做二级索引…

Linux实操篇---常用的基本命令1(跟文件操作相关的命令)

一、常用的基本命令 1.常用的shell命令 Shell可以看作是一个命令解释器,为我们提供了交互式的文本控制台界面。 目前的发行版本:在bin/sh 最早的版本Unix:Bourne shell—>Bourne Again Shell 取了 B A Sh。因此目前Linux的发行版大多数…

PieCloudDB Database 与多家基础架构软件厂商完成产品兼容性认证

数据库作为数字经济建设的重要基础,扮演着产业数字化和数据价值释放的基石角色。然而,数据库的发展不能仅仅依赖于自身的技术和创新,也需要建立一个良好的生态系统,与各方合作共同推进数据库技术的进步与创新。 拓数派&#xff08…

港联证券|受两大消息刺激,美最大太阳能公司股价创十年最大日涨幅

因两大利好消息,美国第一太阳能公司(FirstSolar,下称第一太阳能)股价大涨。 5月12日,第一太阳能宣布,拟最高支付8000万美元收购瑞典钙钛矿企业Evolar AB。其中包括交易完成时支付3800万美元,以及…

SpringSecurity-从入门到精通学习笔记

SpringSecurity从入门到精通 课程介绍 0. 简介 ​ Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 ​ 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。…

基于qt5的应用程序在windows和linux环境下修改图标及制定后缀关联

基于qt5的应用程序在windows和linux环境下修改图标及制定后缀关联 1、windows 1.1 修改应用程序图标 方式一: 使用qmake来生成makefile文件,只需要在.pro中添加: RC_ICONS logo.ico 然后,重新生成makefile文件和应用程序&…

MySQL学习---15、流程控制、游标

1、流程控制 解决复杂问题不可能是通过一个SQL语句完成,我们需要执行多个SQL操作。流程控制语句的作用就是控制存储过程中SQL语句的执行顺序,是我们完成复杂操作必不可少的一部分。只要是执行的程序,流程就分为三大类: 1、顺序结…

MMM(Master-Master replication manager for MySQL)

MMM(Master-Master replication manager for MySQL,MySQL主主复制管理器) 是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发,主要用来监控和管理 MySQL Master-Master (双主)复制&…

【计算机视觉】CLIP:连接文本和图像(关于CLIP的一些补充说明)

文章目录 一、前言二、背景及相关工作三、方法3.1 Costly datasets3.2 Narrow3.3 Poor real-world performance 四、要点4.1 CLIP is highly efficient4.2 CLIP is flexible and general 五、限制六、更广泛的影响七、结论 一、前言 我们推出了一个名为CLIP的神经网络&#xf…

原神服务端搭建架设教程win系统(附客户端+服务端+环境配置)

原神服务端搭建架设教程win系统(附客户端服务端环境配置) 大家好,我是艾西原神一款开放世界冒险3D游戏以七种元素(分别为风、雷、岩、火、水、草、冰)交汇的幻想世界“提瓦特”创造的游戏世界,以角色扮演的RPG游戏还是有非常多的玩…

Prompt工程师指南[应用篇]:Prompt应用、ChatGPT|Midjouney Prompt Engineering

Prompt工程师指南[应用篇]:Prompt应用、ChatGPT|Midjouney Prompt Engineering 1.ChatGPT Prompt Engineering 主题: 与 ChatGPT 对话 Python 笔记本 Topics: ChatGPT介绍审查对话任务与ChatGPT对话Python笔记本 ChatGPT介绍 ChatGPT是OpenAI训练的…

(数字图像处理MATLAB+Python)第七章图像锐化-第三节:高斯滤波与边缘检测

文章目录 一:高斯函数(1)定义(2)特点 二:LOG算子(1)定义(2)程序 三:Canny算子(1)最优边缘检测(2)C…

前端开发推荐vscode安装什么插件?

前言 可以参考一下下面我推荐的插件,注意:插件的目的是用于提高开发的效率,节约开发的时间,像类似检查一些bug、拼写错误等这些可以使用插件快速的识别,避免在查找错误上浪费过多的时间,但切记不要过度依赖…

高速电路设计阻抗匹配的几种方法

为什么要阻抗匹配? 在高速数字电路系统中,电路数据传输线上阻抗如果不匹配会引起数据信号反射,造成过冲、下冲和振铃等信号畸变,当然信号沿传输线传播过程当中,如果传输线上各处具有一致的信号传播速度,并且单位长度…