在 Docker 中,vcpu(虚拟 CPU)通常指的是 逻辑 CPU 的数量,即操作系统可见的 CPU 线程数(包括物理核心和超线程生成的逻辑核心)。具体行为取决于底层配置和 Docker 的运行环境:
关键点解析
-
默认情况下:
- 当通过
--cpus参数限制容器使用的 CPU 资源时(例如--cpus=2),Docker 限制的是容器可用的 CPU 时间片,而非物理核心或线程数。这里的数值是逻辑 CPU 的抽象,与线程数更相关。 - 如果直接指定 CPU 亲和性(如
--cpuset-cpus="0-3"),则明确绑定到特定的逻辑 CPU(超线程算作独立的逻辑 CPU)。
- 当通过
-
与宿主机的关系:
- 在 Linux 系统中,Docker 通过 Cgroups 和内核调度器管理 CPU 资源。逻辑 CPU 的编号包括所有物理核心和超线程线程(例如:4 核 8 线程的 CPU 会显示 8 个逻辑 CPU)。
- 工具如
lscpu或nproc可查看宿主机总逻辑 CPU 数,Docker 的参数(如--cpuset-cpus)基于此编号。
-
虚拟化环境的影响:
- 在虚拟机或云平台中,
vcpu通常对应虚拟化层暴露的逻辑 CPU(可能是宿主机线程的子集)。Docker 会继承虚拟机的 CPU 视图。
- 在虚拟机或云平台中,
示例场景
-
物理机:4 核 8 线程的 CPU,
lscpu显示 8 个逻辑 CPU。--cpus=2:允许容器使用最多 2 个逻辑 CPU 的算力(可能是 1 物理核 + 1 超线程,或 2 物理核)。--cpuset-cpus="0,1":强制容器仅使用逻辑 CPU 0 和 1(可能是同一物理核的两个超线程)。
-
云主机:分配 2 vCPU 的虚拟机,实际可能是 2 个宿主机线程。
- Docker 容器看到的
vcpu即这 2 个逻辑 CPU。
- Docker 容器看到的
总结
Docker 的 vcpu 概念更贴近 线程数目(逻辑 CPU),而非物理核心数。实际限制取决于:
--cpus:按比例分配 CPU 时间片。--cpuset-cpus:明确绑定到逻辑 CPU(含超线程)。
建议通过 docker stats 或容器内 nproc 验证实际可用的逻辑 CPU 数量。
云服务器