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 核心:
按top1键展开 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提高资源分配的灵活性。
- 在高性能计算场景下,可使用
迷茫的人生,需要不断努力,才能看清远方模糊的志向!

浙公网安备 33010602011771号