Docker 如何在主机 CPU 之间分配工作?

Docker 如何在主机 CPU 之间分配工作?

如果我有一个具有 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 的示例。

相关内容