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
)