Docker 容器 CPU 核心绑定 (cpuset) 和 CPU 份额 (cpu-shares)
以下是对 Docker 容器 CPU 核心绑定 (cpuset
) 和 CPU 份额 (cpu-shares
) 结合使用的详细总结与实验解析:
1. 什么是 cpuset
和 cpu-shares
?
-
cpuset
:- 用于限制容器运行在哪些 CPU 核心上。
- 通过
--cpuset-cpus
参数指定 CPU 核心编号,例如0,1
表示绑定到 CPU 0 和 CPU 1。 - 适用于 NUMA 拓扑结构的多核服务器,确保高性能容器运行在指定核心上,避免资源争抢。
-
cpu-shares
:- 用于设置容器使用 CPU 的时间片权重,决定容器在资源竞争时的优先级。
- 默认值为
1024
,值越高,容器获得 CPU 时间片的比例越大。
2. cpuset
和 cpu-shares
的主要区别
参数 | 功能 | 适用场景 |
---|---|---|
cpuset |
限定容器运行在指定的 CPU 核心上 | 性能隔离、高性能计算 |
cpu-shares |
设置容器 CPU 时间片的权重,优先级分配 | 多容器竞争同一 CPU 资源时,分配优先级 |
3. 混合使用 cpuset
和 cpu-shares
的场景
通过混合使用 --cpuset-cpus
和 --cpu-shares
,可以在特定 CPU 核心上对容器进行资源竞争控制。
-
场景:
- 两个容器运行在同一 CPU 核心上,设置不同的 CPU 时间片权重。
- CPU 使用率会根据权重比例进行分配。
-
预期结果:
- 容器的 CPU 使用率按权重比例分配。例如,容器 A 的权重是 512,容器 B 的权重是 1024,则 B 的 CPU 使用率是 A 的两倍。
4. 实验:验证 cpuset
和 cpu-shares
的效果
4.1 环境准备
-
确保主机是多核 CPU(至少 2 核)。
- 使用
top
查看 CPU 核心:
按top 1
键展开 CPU 核心信息,比如 CPU 0、CPU 1。
- 使用
-
安装压测工具
stress
:- 安装
EPEL
源:yum install -y epel-release - 安装
stress
:yum install -y stress
- 安装
4.2 创建 Docker 容器
4.2.1 启动容器 docker10
- 将容器绑定到 CPU 0 和 CPU 1,设置 CPU 份额为
512
:docker run -itd --name docker10 --cpuset-cpus="0,1" --cpu-shares=512 ubuntu
4.2.2 启动容器 docker20
- 同样绑定到 CPU 0 和 CPU 1,设置 CPU 份额为
1024
(是docker10
的 2 倍):docker run -itd --name docker20 --cpuset-cpus="0,1" --cpu-shares=1024 ubuntu
4.3 压测实验
4.3.1 在容器 docker10
中运行压力测试
-
进入
docker10
容器:docker exec -it docker10 bash -
安装压测工具
stress
:Ubuntu中安装此类工具命令如下: apt install -y stress-ng 或者 apt install -y stress -
使用
stress
工具运行 CPU 压测:stress -c 2 --timeout 600 -c 2
:产生两个 CPU 进程。--timeout 600
:压测持续 600 秒。
4.3.2 在容器 docker20
中运行压力测试
-
进入
docker20
容器:docker exec -it docker20 bash -
安装压测工具
stress
:Ubuntu中安装此类工具命令如下: apt install -y stress-ng 或者 apt install -y stress -
使用
stress
工具运行 CPU 压测:stress -c 2 --timeout 600
4.4 观察 CPU 使用率
-
在宿主机上运行
top
命令,并按1
键展开 CPU 核心信息。top -
观察 CPU 0 和 CPU 1 的使用情况:
- 容器
docker10
和docker20
应争抢 CPU 0 和 CPU 1 的资源。 - 根据
cpu-shares
设置,docker20
的 CPU 使用率应是docker10
的两倍。
- 容器
4.5 验证结果
-
CPU 使用情况:
- 在
top
输出中,docker10
和docker20
的进程会显示在 CPU 0 和 CPU 1 上。 docker10
的 CPU 使用率约为 20%。docker20
的 CPU 使用率约为 40%。
- 在
-
结论:
- 由于
docker20
的--cpu-shares=1024
是docker10
的 2 倍,因此分配的 CPU 时间片比例是 2:1。
- 由于
5. 注意事项
-
虚拟机实验环境要求:
- 实验需要至少 2 核 CPU。如果虚拟机 CPU 核心不足,压测可能导致系统卡顿或崩溃。
-
cpuset
不会超出分配的 CPU 核心:- 即使 CPU 0 和 CPU 1 被占满,容器也不会使用其他核心,限制效果完全生效。
-
资源分配的动态性:
- 如果
docker10
或docker20
中的任务为空闲,其余的 CPU 时间片可以被其他容器利用。
- 如果
6. 总结
-
cpuset
:- 用于绑定容器到特定的 CPU 核心,实现性能隔离。
-
cpu-shares
:- 设置容器 CPU 使用的权重,控制多容器竞争时的优先级。
-
实验结果:
- 容器的 CPU 使用率按权重比例分配,验证了
cpuset
和cpu-shares
的结合使用效果。
- 容器的 CPU 使用率按权重比例分配,验证了
-
实践建议:
- 在高性能计算场景下,可使用
cpuset
限定容器运行在指定核心上,确保关键任务性能。 - 在资源有限的环境中,使用
cpu-shares
提高资源分配的灵活性。
- 在高性能计算场景下,可使用
迷茫的人生,需要不断努力,才能看清远方模糊的志向!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?