Docker 容器 CPU 核心绑定 (cpuset) 和 CPU 份额 (cpu-shares)

以下是对 Docker 容器 CPU 核心绑定 (cpuset) 和 CPU 份额 (cpu-shares) 结合使用的详细总结与实验解析


1. 什么是 cpusetcpu-shares

  1. cpuset

    • 用于限制容器运行在哪些 CPU 核心上。
    • 通过 --cpuset-cpus 参数指定 CPU 核心编号,例如 0,1 表示绑定到 CPU 0 和 CPU 1。
    • 适用于 NUMA 拓扑结构的多核服务器,确保高性能容器运行在指定核心上,避免资源争抢。
  2. cpu-shares

    • 用于设置容器使用 CPU 的时间片权重,决定容器在资源竞争时的优先级。
    • 默认值为 1024,值越高,容器获得 CPU 时间片的比例越大。

2. cpusetcpu-shares 的主要区别

参数 功能 适用场景
cpuset 限定容器运行在指定的 CPU 核心上 性能隔离、高性能计算
cpu-shares 设置容器 CPU 时间片的权重,优先级分配 多容器竞争同一 CPU 资源时,分配优先级

3. 混合使用 cpusetcpu-shares 的场景

通过混合使用 --cpuset-cpus--cpu-shares,可以在特定 CPU 核心上对容器进行资源竞争控制。

  • 场景:

    • 两个容器运行在同一 CPU 核心上,设置不同的 CPU 时间片权重。
    • CPU 使用率会根据权重比例进行分配。
  • 预期结果:

    • 容器的 CPU 使用率按权重比例分配。例如,容器 A 的权重是 512,容器 B 的权重是 1024,则 B 的 CPU 使用率是 A 的两倍。

4. 实验:验证 cpusetcpu-shares 的效果

4.1 环境准备

  1. 确保主机是多核 CPU(至少 2 核)。

    • 使用 top 查看 CPU 核心:
      top
      1 键展开 CPU 核心信息,比如 CPU 0、CPU 1。
  2. 安装压测工具 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 中运行压力测试

  1. 进入 docker10 容器:

    docker exec -it docker10 bash
  2. 安装压测工具 stress

    Ubuntu中安装此类工具命令如下:
    apt install -y stress-ng
    或者
    apt install -y stress
  3. 使用 stress 工具运行 CPU 压测:

    stress -c 2 --timeout 600
    • -c 2:产生两个 CPU 进程。
    • --timeout 600:压测持续 600 秒。

4.3.2 在容器 docker20 中运行压力测试

  1. 进入 docker20 容器:

    docker exec -it docker20 bash
  2. 安装压测工具 stress

    Ubuntu中安装此类工具命令如下:
    apt install -y stress-ng
    或者
    apt install -y stress
  3. 使用 stress 工具运行 CPU 压测:

    stress -c 2 --timeout 600

4.4 观察 CPU 使用率

  1. 在宿主机上运行 top 命令,并按 1 键展开 CPU 核心信息。

    top
  2. 观察 CPU 0 和 CPU 1 的使用情况:

    • 容器 docker10docker20 应争抢 CPU 0 和 CPU 1 的资源。
    • 根据 cpu-shares 设置,docker20 的 CPU 使用率应是 docker10 的两倍。

4.5 验证结果

  1. CPU 使用情况:

    • top 输出中,docker10docker20 的进程会显示在 CPU 0 和 CPU 1 上。
    • docker10 的 CPU 使用率约为 20%。
    • docker20 的 CPU 使用率约为 40%。
  2. 结论:

    • 由于 docker20--cpu-shares=1024docker10 的 2 倍,因此分配的 CPU 时间片比例是 2:1。

5. 注意事项

  1. 虚拟机实验环境要求:

    • 实验需要至少 2 核 CPU。如果虚拟机 CPU 核心不足,压测可能导致系统卡顿或崩溃。
  2. cpuset 不会超出分配的 CPU 核心:

    • 即使 CPU 0 和 CPU 1 被占满,容器也不会使用其他核心,限制效果完全生效。
  3. 资源分配的动态性:

    • 如果 docker10docker20 中的任务为空闲,其余的 CPU 时间片可以被其他容器利用。

6. 总结

  1. cpuset

    • 用于绑定容器到特定的 CPU 核心,实现性能隔离。
  2. cpu-shares

    • 设置容器 CPU 使用的权重,控制多容器竞争时的优先级。
  3. 实验结果:

    • 容器的 CPU 使用率按权重比例分配,验证了 cpusetcpu-shares 的结合使用效果。
  4. 实践建议:

    • 在高性能计算场景下,可使用 cpuset 限定容器运行在指定核心上,确保关键任务性能。
    • 在资源有限的环境中,使用 cpu-shares 提高资源分配的灵活性。

posted @   皇帽讲绿帽带法技巧  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示