当前位置: 首页 > news >正文

docker 运行容器限制 CPU

一、docker cpu限制

Docker 通过 Linux 内核的 cgroup(控制组)功能来实现容器的资源配额和限制。cgroup 可以
对容器中运行的进程进行分组,并为每个分组分配特定的资源配额和限制。

cgroup(控制组)是 Linux 内核提供的一种机制,可以对一组进程或线程进行资源限制、优先级
控制、账户分配等操作。通过 cgroup,可以对 CPU、内存、磁盘 IO、网络带宽等资源进行限制
和管理。例如,可以将一组进程或线程归为一个 cgroup,并对该 cgroup 中的进程或线程设置
CPU 配额、内存限制等,从而实现对系统资源的精细控制。cgroup 还可以进行账户分配,允许不
同的用户或组使用系统资源的不同份额。

在 Docker 中,CPU 份额是一种 CPU 资源管理机制,可以用于控制 Docker 容器可以使用的
CPU 资源数量。它允许你将 CPU 资源按比例分配给不同的容器,以确保在共享主机的情况下,每个容器都可以获得足够的 CPU 时间。Docker 使用 Linux 内核提供的 cgroups(control groups)来管理 CPU 资源。在 cgroups 中,可以使用 cpu.shares 参数来分配 CPU 资源份额。该参数的值是一个相对权重,它定义了一个容器与其他容器之间分配 CPU 时间的相对比例。

例如,如果将一个容器的 cpu.shares 参数设置为 1024,而将另一个容器的 cpu.shares 参数设
置为 512,这两个容器跑在一个 cpu,则第一个容器将获得比第二个容器更多的 CPU 时间。
可以在 Docker 中使用 --cpu-shares 参数来设置 CPU 资源份额。

例如,以下命令将创建一个名
为 my-nginx 的容器,并将其 CPU 资源份额设置为 512:
[root@xuegod63 ~]# docker run -it --cpu-shares 512 rockylinux:8.8 /bin/bash
[root@df176dd75bd4 /]# cat /sys/fs/cgroup/cpu/cpu.shares #查看结果:
512

总结:
默认每个 docker 容器的 cpu 份额值都是 1024。如果多个容器在同一个 CPU 上,容器的 cpu 份额
才能体现出来。
假设你的主机只有一个 CPU 核心,而且两个 Docker 容器需要运行。如果为这两个容器分配不同
的 CPU 份额值,将会有以下几种不同的情况:
1、容器 A 的 CPU 份额值是 512,容器 B 的 CPU 份额值是 256。这意味着容器 A 将获得主
机 CPU 时间片的 2/3,而容器 B 将获得 1/3。这种情况下,容器 A 可能会运行得更快,并且可能会比容器 B 更快地响应请求,因为它获得了更多的 CPU 时间片。
2、容器 A 的 CPU 份额值是 256,容器 B 的 CPU 份额值是 512。这意味着容器 A 将获得主
机 CPU 时间片的 1/3,而容器 B 将获得 2/3。这种情况下,容器 B 可能会运行得更快,并且可能会比容器 A 更快地响应请求,因为它获得了更多的 CPU 时间片。
容器 A 和容器 B 的 CPU 份额值都是 512。这意味着它们将平均获得主机 CPU 时间片的一半。
在这种情况下,两个容器的性能可能会非常相似,因为它们获得的 CPU 时间片相等。

二、限制 docker 运行在指定的 cpu 和内存节点上
参数:--cpuset-cpus 和 --cpuset-mems

Docker 可以使用 --cpuset-cpus 和 --cpuset-mems 参数来控制容器可以使用哪些 CPU 内核
和内存节点。这对于多核 CPU 的服务器特别有用,可以对需要高性能计算的容器进行性能最优的配置。
1、--cpuset-cpus: 它用于指定容器可以使用的 CPU 节点列表,以逗号分隔。例如,如果将其设
置为 --cpuset-cpus=0,1,则表示该容器可以在 CPU 节点 0 和 1 上运行。这有助于将容器限制在特定的 CPU 上运行,以获得更好的性能或避免与其他容器共享 CPU。
2、--cpuset-mems: 它用于指定容器可以使用的内存节点列表,以逗号分隔。例如,如果将其设置
为 --cpuset-mems=0,1,则表示该容器可以在内存节点 0 和 1 上运行。这有助于将容器限制在特定的内存节点上运行,以控制容器对系统内存的使用情况。
什么叫做多内存?如何实现的?
在 Linux 上,可以使用 NUMA(Non-Uniform Memory Access)架构来实现多个内存节点。
NUMA 是一种计算机架构,它将多个 CPU 和内存节点组合在一起,以提高系统的性能和可伸缩性。在NUMA 架构中,每个 CPU 可以访问本地内存节点和远程内存节点,而本地内存访问速度较快,远程内存访问速度较慢。
要设置多个内存节点,需要先检查系统是否支持 NUMA 架构。可以通过执行以下命令来检查:
[root@xuegod63 ~]# yum install lshw -y
[root@xuegod63 ~]#lshw -class memory |grep memory

lshw -class memory 命令输出结果中的 *-memory 一般表示系统的物理内存,如果 *-
memory 只出现了一次,那么说明该系统只有一块物理内存。表示系统不支持多内存,或者某些内存插槽未插入内存条。
lshw -class memory 命令可以列出系统中所有的内存相关信息,包括数量、型号、容量等等。如
果系统支持多内存,则 lshw -class memory 命令输出的结果应该包含多个 memory 节点,每个节点对应一块内存。

在上述示例中,可以看到有四个 *-memory 节点,每个节点对应一块大小为 64GiB 的内存。这就
表示系统支持多内存。
例 1:虚拟机一共有 4 个核心,创建的容器只能用 0、1、2 这三个核心。
[root@xuegod63 ~]# docker run -it --name cpu1 --cpuset-cpus 0-2 rockylinux:8.8 bash
[root@ad554956e989 /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus 
0-2 

三、cpu 参数混合使用

--cpuset-cpus 和--cpu-shares 一起使用,

运行两个容器实例:
#指定 docker10 只能在 cpu0 和 cpu1 上运行,而且 docker10 的使用 cpu 的份额 512
[root@xuegod63 ~]# docker run -itd --name docker10 --cpuset-cpus 0,1 --cpu-shares 
512 rockylinux:8.8 /bin/bash 

#指定 docker20 只能在 cpu0 和 cpu1 上运行,而且 docker20 的使用 cpu 的份额 1024,比
dcker10 多一倍
[root@xuegod63 ~]# docker run -itd --name docker20 --cpuset-cpus 0,1 --cpu-shares 
1024 rockylinux:8.8 /bin/bash

上面的命令中,--cpuset-cpus 指定了容器使用的 CPU,--cpu-shares 指定了容器 CPU 分配的权重。docker10 使用 CPU 0,1,权重为 512,docker20 使用 CPU 0,1,权重为 1024。
这样的话,当 CPU 资源不足时,Docker 将按照权重分配 CPU 时间片,第二个容器获得的 CPU 时间片应该比第一个容器多一些。响应速度也更快。

测试 1: 进入 docker10,使用 stress 测试进程是不是只在 cpu0,1 上运行:
[root@xuegod63]# docker cp /usr/bin/stress docker10:/usr/bin/
[root@xuegod63 ~]# docker exec -it docker10 /bin/bash
[root@d1a431815090 /]# stress -c 2 -v -t 10m 
备注,stress 参数说明:

-c 2:使用两个 CPU 核心进行压力测试。
-v:打印详细输出,包括运行时间、平均负载等信息。
-t 10m:运行时长为 10 分钟。

在物理机另外一个虚拟终端上运行 top 命令,按 1 快捷键,查看每个 cpu 使用情况

可看到正常。只在 cpu0,1 上运行

测试 2: 然后进入 docker20,使用 stress 测试进程是不是只在 cpu0,1 上运行,且 docker20 上
运行的 stress 使用 cpu 百分比是 docker10 的 2 倍
[root@xuegod63]# docker cp /usr/bin/stress docker20:/usr/bin/
[root@xuegod63 ~]# docker exec -it docker20 /bin/bash
[root@f24e75bca5c0 /]# stress -c 2 -v -t 10m

在另外一个虚拟终端上运行 top 命令,按 1 快捷键,查看每个 cpu 使用情况:

注:两个容器只在 cpu0,1 上运行,说明 cpu 绑定限制成功。而 docker20 是 docker10 使用 cpu
的 2 倍。说明--cpu-shares 限制资源成功。

docker 提供了--cpu-period、--cpu-quota 两个参数控制容器可以分配到的 CPU 时间。

• --cpu-period 参数定义 CPU 周期长度,单位为微秒。它指定了 CPU 资源在多长时间内
可以被容器使用。默认值为 0.1 秒,例如,设置--cpu-period=100000 意味着容器可以每
100 毫秒使用一次 CPU。

• --cpu-quota 参数定义 CPU 资源使用的时间配额,单位为微秒。它指定了容器可以在每
个 CPU 周期内使用 CPU 时间的最大量。例如,设置--cpu-quota=50000 意味着容器每 100
毫秒可以最多使用 50 毫秒的 CPU 时间。

cpu-period 和 cpu-quota 的单位为微秒(μs)。cpu-period 的最小值为 1000 微秒,最大值为 1
秒(10^6 μs),默认值为 0.1 秒(100000 μs)。cpu-quota 的值默认为-1,表示不做控制。
时间换算单位: 1 秒=1000 毫秒 ; 1 毫秒=1000 微秒
这两个参数的具体使用场景如下:
1、CPU 资源分配:当多个容器运行在同一台主机上时,--cpu-period 和--cpu-quota 参数可以用
于限制容器使用的 CPU 资源。这样可以确保每个容器都能够获得足够的 CPU 时间,并避免某个容器占用过多的 CPU 资源。
2、应用程序性能测试:--cpu-period 和--cpu-quota 参数可以用于测试应用程序在不同 CPU 限
制下的性能。例如,可以通过逐步减少--cpu-quota 参数的值,测试应用程序在不同 CPU 限制下的
响应时间和处理能力。需要注意的是,--cpu-period 和--cpu-quota 参数只对容器内的 CPU 资源使用进行限制,不会影响主机上其他进程的 CPU 资源使用。

docker stats 命令来查看容器的 CPU 使用情况。这个命令会显示容器的 CPU 使用率以及其他有用的统计信息。

例 1:设置 docker 实例每 1 秒只能使用单个 CPU 的 0.2 秒时间,可以将 cpu-period 设置为
1000000(即 1 秒),cpu-quota 设置为 200000(0.2 秒)。
演示 --cpu-period 和 --cpu-quota 参数的使用效果
首先,我们创建一个简单的 Python 程序,用来计算 1 到 1000000000000000001 的所有整数
的和。代码如下:
[root@xuegod63 py]# cat calculate_sum.py 
total = 0
for i in range(1, 1000000000000000001):
 total += i
print(f"The sum of all integers from 1 to 10000 is: {total}")
[root@xuegod63 py]# cat dockerfile 
FROM python:3.9-slim-buster
COPY calculate_sum.py /
CMD ["python", "/calculate_sum.py"]
[root@xuegod63 py]# docker build -t my-image

[root@xuegod63 ~]# docker run --name cal -it --cpuset-cpus 0 --cpu-period 1000000 
--cpu-quota 200000 my-image
然后我们可以使用 docker stats 命令来查看容器的 CPU 使用情况。这个命令会显示容器的 CPU 
使用率以及其他有用的统计信息。运行下面的命令:
[root@xuegod63 ~]# docker stats

这个命令是在 Docker 中运行一个 my-image 容器,计算大数字,并设置 CPU 周期为
1000000 微秒(即 1 秒), CPU 配额为 200000 微秒(即 0.2 秒)。这意味着该容器在任意 1
秒钟的时间内,只能够使用 0.2 秒的 CPU 时间。如果在一个单核 CPU 的系统上运行这个容器,
并将 CPU 配额设置为 0.2 秒,那么该容器的 CPU 使用率最大只能达到 20%。因为在一个单核
CPU 的系统上,一个 CPU 核心的最大使用率是 100%。如果容器只能使用 0.2 秒的 CPU 时
间,那么在一秒钟内,它的 CPU 使用率最大只能达到 20%。
备注:
Docker 运行容器如果制定了--cpu-period 或者--cpuset-cpus 怎么解除限制?
docker update --cpuset-cpus=0-3 my-container 

四、docker 容器实例运行结束后自动释放资源

[root@xuegod63 ~]# docker run --help | grep rm
--rm 参数: Automatically remove the container when it exits
作用:当容器命令运行结束后,自动删除容器,自动释放资源 
应用场景:在某些环境下,可能需要大量的新建 docker 实例,然后仅仅运行几秒钟或几分钟,然后
就彻底删除。 如运行单元测试或测试弹性云计算。
例:阿里云,要模拟双 11 的压力,需要快速创建 1 万 docker 实例,每个 docker 容器实例中都运
行 ab 命令,拼命访问 tmall.com 首页,运行 1 个小时,1 小时后自动删除。
例:
[root@xuegod63 ~]# docker run -it --rm --name mk rockylinux:8.8 sleep 10
物理上查看:
[root@xuegod63 ~]# docker ps -a | grep mk
6c75a9317a6b rockylinux:8.8 "sleep 5" 6 seconds ago Up 4 
seconds mk
等 10s 后,再查看:
[root@xuegod63 ~]# docker ps | grep mk #自动删除了

http://www.dtcms.com/a/494442.html

相关文章:

  • Python自动化从入门到实战(24)如何高效的备份mysql数据库,数据备份datadir目录直接复制可行吗?一篇给小白的完全指南
  • 个人可以备案网站的内容国外直播平台tiktok
  • C语言也能干大事网站开发pdf企业网站管理系统多站多语言版
  • 清理页面缓存
  • YD925输出5V,高性价比的非隔离电源方案详细介绍
  • 零基础新手小白快速了解掌握服务集群与自动化运维(十二)Python编程之常用模块
  • SQL注入完全攻略:从手工注入到自动化工具的渗透实战
  • 做网站的价格是多少临沂网站域名
  • 深入理解 HTML `<label>` 的 `for` 属性:提升表单可访问性与用户体验
  • 大型语言模型(LLM)文本中提取结构化信息:LangExtract(一)
  • Flask应用改用Waitress运行
  • html css js网页制作成品——HTML+CSS辣条俱乐部网页设计(5页)附源码
  • Spring Boot 3零基础教程,Spring Boot WEB 开发 自动配置原理,笔记24
  • 大数据Spark(六十九):Transformation转换算子intersection和subtract使用案例
  • 郑州做网站狼牙有关网站建设文章
  • 【前端高频面试题】深入浏览器渲染原理:从输入 URL 到页面绘制的完整流程解析
  • 宿州网站建设贰聚思诚信wordpress菜单不兼容
  • C语言——深入解析C语言指针:从基础到实践从入门到精通(四)
  • Cursor 科技感的登录页面提示词
  • Ubuntu 24.04环境下的挂起转休眠
  • 【从0开始学习Java | 第21篇】网络编程综合练习
  • OpenCL初级教程
  • 【Spring AI】基于 sse 实现 MCP Server
  • vue使用限制仅允许上传 Excel 文件
  • dataease开发环境搭建
  • 一个网站开发周期wordpress导航条
  • 湖南城乡建设厅网站夜蝶直播app
  • list,咕咕咕!
  • iOS 混淆实战,多工具组合完成 IPA 混淆与加固(源码 + 成品 + 运维一体化方案)
  • Vue + Element UI 实现 el-scroll 滚动与鼠标滚轮监听全攻略