docker vcpu 指的是核心还是线程数目?

云计算

Docker vCPU 指的是逻辑处理器(线程)数目,而非物理核心数目

核心结论

  • Docker vCPU 默认对应的是宿主机的逻辑处理器(线程)数量,而非物理核心数量。
  • 在大多数现代 CPU(尤其是支持超线程/SMT 的处理器)中,1 个物理核心 = 2 个逻辑线程,因此 Docker 的 vCPU 限制是基于线程数计算的。

详细解析

1. vCPU 的本质

  • vCPU(虚拟 CPU) 是 Docker 或虚拟机(VM)中抽象的计算资源单位。
  • 在 Linux 内核(Docker 的底层依赖)中,CPU 调度和管理的最小单位是逻辑 CPU(即 /proc/cpuinfo 中的条目),而逻辑 CPU 的数量通常等于 线程数 = 核心数 × 每个核心的线程数

2. Docker 如何计算 vCPU

  • Docker 默认使用 CFS(Completely Fair Scheduler) 进行 CPU 资源分配,其限制参数(如 --cpus--cpu-shares基于宿主机的逻辑 CPU 数量
    • 例如,在 4 核 8 线程 的 CPU 上,Docker 看到的可用 vCPU 数量是 8,而不是 4。
    • 通过 docker run --cpus=2 限制容器时,实际限制的是 2 个逻辑线程的计算能力

3. 如何验证 vCPU 对应线程还是核心?

  • 方法 1:查看 /proc/cpuinfo
    grep -c "processor" /proc/cpuinfo  # 返回逻辑 CPU(线程)数量
  • 方法 2:使用 lscpu 命令
    lscpu | grep -E "CPU(s)|Thread(s) per core"
    • 输出示例:
      CPU(s):                8          # 逻辑 CPU 总数
      Thread(s) per core:    2          # 每个核心的线程数
      Core(s) per socket:    4          # 物理核心数
    • 结论:Docker 的 --cpus 参数限制的是 CPU(s)(逻辑线程),而非 Core(s)(物理核心)。

4. 特殊情况:禁用超线程(HT/SMT)

  • 如果宿主机 禁用超线程(如 BIOS 中关闭 HT/SMT),则:
    • 逻辑 CPU 数量 = 物理核心数量
    • 此时,Docker vCPU 的限制等同于物理核心数量。

5. 如何显式绑定物理核心?

  • 如果需要让 Docker 容器 仅使用物理核心(避免超线程影响性能),可以使用 --cpuset-cpus
    docker run --cpuset-cpus="0-3" ...  # 绑定前 4 个物理核心(假设 4C8T)
    • 这样容器只会使用 4 个物理核心,而不会占用超线程的额外逻辑 CPU。

最终结论

  • Docker vCPU 默认对应宿主机的逻辑 CPU(线程)数量,而非物理核心数。
  • 在超线程(HT/SMT)开启的 CPU 上,1 个物理核心 = 2 个 vCPU
  • 如需精确控制物理核心,需使用 --cpuset-cpus 参数手动绑定。

关键点:
vCPU = 逻辑线程(默认)
物理核心绑定需显式指定(--cpuset-cpus

未经允许不得转载:CLOUD云枢 » docker vcpu 指的是核心还是线程数目?