在 Docker 的语境下,vcpu(通常通过 --cpus 或 --cpuset-cpus 参数指定)指的是 逻辑核心(Logical Cores) 的数量,也就是操作系统视角下的 线程数目,而不是物理核心的数量。
为了更清晰地理解这个概念,我们需要区分硬件层面的两个关键指标:
- 物理核心 (Physical Cores):CPU 芯片上实际独立的计算单元。
- 逻辑核心/线程 (Logical Cores / Threads):通过超线程技术(Hyper-Threading),一个物理核心可以模拟出两个逻辑核心,让操作系统认为它有两个独立的 CPU 来处理任务。
Docker 的具体行为
当你使用 docker run --cpus=4 时,Docker 会向容器内的进程分配 4 个逻辑 CPU 时间片。
- 如果 CPU 开启了超线程:假设你的服务器有 8 个物理核心,但开启了超线程,系统会显示 16 个逻辑核心(即
nproc命令输出为 16)。此时,如果你设置--cpus=4,容器将占用这 16 个逻辑核心中的任意 4 个。 - 如果 CPU 未开启超线程:物理核心数等于逻辑核心数。此时
--cpus=4直接对应 4 个物理核心。
为什么是“逻辑核心”?
Docker 底层依赖 Linux 的 Cgroups(控制组)机制来限制资源。Cgroups 中的 CPU 配额(quota)和允许运行的 CPU 掩码(cpuset)都是基于操作系统看到的 逻辑处理器(logical processors) 进行管理的。操作系统无法感知底层的物理拓扑结构,它只看到一堆编号的逻辑核心(0, 1, 2… N)。因此,Docker 只能按照操作系统提供的逻辑核心列表来分配资源。
总结与示例
| 场景 | 物理核心数 | 逻辑核心数 (nproc) | --cpus=2 的含义 |
|---|---|---|---|
| 普通单路 CPU | 4 | 4 | 占用 2 个物理核心 |
| 开启超线程 | 4 | 8 | 占用 2 个逻辑核心(相当于 1 个物理核心 + 部分超线程能力) |
结论:
Docker 的 vcpu 指的是 逻辑核心(线程)数目。如果你在配置容器时希望严格限制其占用的物理核心数(例如避免超线程带来的干扰),你需要结合 --cpuset-cpus 参数,手动指定具体的物理核心 ID 范围,但这需要你对宿主机的 CPU 拓扑结构非常熟悉。通常情况下,直接使用 --cpus 即可满足绝大多数需求。
CLOUD云知道