如果我有一个具有 8 个核心的主机和一个具有 1.0 CPU 的 Docker 容器,Docker 如何实现这一点?
这是否意味着全部 8可用 CPU同时占 1/8 的时间?
如果是这样,那么全速运行的单线程进程将无法利用所有可用的 CPU,对吗?当所有 8 个 CPU 都可用时,1 个将达到最大限度,其他 7 个将处于空闲状态。
或者它是否做了更接近循环的事情 - 每个 CPU 轮流使用 1/64 的时间?
答案1
这是通过设置 cgroup 上的 CFS 调度程序的周期和配额来配置的(总体上包括 cgroup 内的所有进程)。周期确定时间片的大小,配额表示可以使用片内的时间量。因此,如果您在 8 核机器上将其设置为 2.0,它可以以 100% 使用 2 个内核,以 25% 使用所有 8 个内核,或者以各种变化使用,只要不超过周期内的 CPU 时间配额即可。有关字段的详细描述,请参见这些文档。
显示这些设置的实际文件会随着 cgroups v2 而改变,因此其中一些文件对于您的环境可能看起来有所不同:
$ docker run -d --rm --cpus 1.5 --name test-cpu busybox tail -f /dev/null
$ docker inspect test-cpu | grep -i cpu
"Name": "/test-cpu",
"CpuShares": 0,
"NanoCpus": 1500000000,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"CpuCount": 0,
"CpuPercent": 0,
$ docker exec -it test-cpu /bin/sh
/ # cat /sys/fs/cgroup/cpu.max
150000 100000
看这个答案使用来自 cgroups v1 的示例。