Docker容器CPU限制选项测试

Docker容器CPU限制选项测试

Docker Version: 19.03.5

😄 Written by Zak Zhu

参考

  • Breeze老师的docker培训
  • 马哥docker视频

实验环境

HOST CPUs
VM 4


--cpu-shares选项

--cpu-shares int

Set this flag to a value greater or less than the default of 1024 to increase or reduce the container's weight, and give it access to a greater or lesser proportion of the host machine's CPU cycles. This is only enforced when CPU cycles are constrained. When plenty of CPU cycles are available, all containers use as much CPU as they need. In that way, this is a soft limit. It prioritizes container CPU resources for the available CPU cycles. It does not guarantee or reserve any specific CPU access.

测试

  • TEST l :

    容器A:

    • --cpu-shares 1024设置容器使用CPU的权重为1024
    • 压测8核, 容器CPU满负载情况
    docker container run \
    	--name "container_A" --cpu-shares 1024 \
    	--detach --rm \
    	progrium/stress --cpu 8
    

    发现:

    • 容器A使用了宿主机全部CPU资源(大约400%), 结果见下图

      5

  • TEST ll :

    容器A:

    • --cpu-shares 512 设置容器使用CPU的权重为512
    • 压测8核, 容器CPU满负载情况

    容器B:

    • --cpu-shares 1536设置容器使用CPU的权重为1536 (=3*512)
    • 压测8核, 容器CPU满负载情况
    ## 容器A:
    docker container run \
    	--name "container_A" --cpu-shares 512 \
    	--detach --rm \
    	progrium/stress --cpu 8
    	
    ## 容器B:
    docker container run \
    	--name "container_B" --cpu-shares 1536 \
    	--detach --rm \
    	progrium/stress --cpu 8
    

    发现:

    • 容器A使用了宿主机大约100%的CPU资源, 结果见下图

      6

    • 容器B使用了宿主机大约300%的CPU资源, 结果见下图

      7

  • TEST lll :

    容器A:

    • --cpu-shares 1024 设置容器使用CPU的权重为1024
    • 压测8核, 容器CPU满负载情况

    容器B:

    • --cpu-shares 1024 设置容器使用CPU的权重为1024
    • 压测8核, 容器CPU满负载情况

    容器C:

    • --cpu-shares 1024 设置容器使用CPU的权重为1024
    • 执行sleep 3600命令, 容器CPU空闲情况

    容器D:

    • --cpu-shares 1024 设置容器使用CPU的权重为1024
    • 执行sleep 3600命令, 容器CPU空闲情况
    ## 容器A:
    docker container run \
    	--name "container_A" --cpu-shares 1024 \
    	--detach --rm \
    	progrium/stress --cpu 8
    	
    ## 容器B:
    docker container run \
    	--name "container_B" --cpu-shares 1024 \
    	--detach --rm \
    	progrium/stress --cpu 8
    
    ## 容器C:
    docker container run \
    	--name "container_C" --cpu-shares 1024 \
    	--detach --rm \
    	busybox sleep 3600
    	
    ## 容器D:
    docker container run \
    	--name "container_D" --cpu-shares 1024 \
    	--detach --rm \
    	busybox sleep 3600
    

    发现:

    • 容器A使用了宿主机大约200%的CPU资源, 结果见下图

      8

    • 容器B使用了宿主机大约200%的CPU资源, 结果见下图

      9

    • 容器C没有使用宿主机的CPU资源(0%), 结果见下图

      10

    • 容器D没有使用宿主机的CPU资源(0%), 结果见下图

      11

  • TEST IV :

    容器A:

    • --cpu-shares 5120 设置容器使用CPU的权重为5120 (=5*1024)
    • 压测8核, 容器CPU满负载情况

    容器B:

    • --cpu-shares 4096 设置容器使用CPU的权重为4096 (=4*1024)
    • 压测8核, 容器CPU满负载情况

    容器C:

    • --cpu-shares 1024 设置容器使用CPU的权重为1024
    • 压测8核, 容器CPU满负载情况

    容器D:

    • --cpu-shares 8192 设置容器使用CPU的权重为8192 (=8*1024)
    • 执行sleep 3600命令, 容器CPU空闲情况
    ## 容器A:
    docker container run \
    	--name "container_A" --cpu-shares 5120 \
    	--detach --rm \
    	progrium/stress --cpu 8
    	
    ## 容器B:
    docker container run \
    	--name "container_B" --cpu-shares 4096 \
    	--detach --rm \
    	progrium/stress --cpu 8
    ## 容器C:
    docker container run \
    	--name "container_C" --cpu-shares 1024 \
    	--detach --rm \
    	progrium/stress --cpu 8
    	
    ## 容器D:
    docker container run \
    	--name "container_D" --cpu-shares 8192 \
    	--detach --rm \
    	busybox sleep 3600
    

    发现:

    • 容器A使用了宿主机大约200%的CPU资源, 结果见下图

      12

    • 容器B使用了宿主机大约160%的CPU资源, 结果见下图

      13

    • 容器C使用了宿主机大约40%的CPU资源, 结果见下图

      14

    • 容器D没有使用宿主机的CPU资源(0%), 结果见下图

      15

结论

  • --cpu-shares选项可以设置容器使用宿主机CPU资源的权重

  • --cpu-shares选项只有当容器CPU紧张时生效, CPU紧张的容器按它们的权重比例分配宿主机CPU资源, 并且充分利用宿主机CPU资源, 不计算CPU空闲的容器权重

    当只有一个容器CPU紧张时, 该容器可以分配到宿主机全部CPU资源



--cpus选项

--cpus decimal

Specify how much of the available CPU resources a container can use. For instance, if the host machine has two CPUs and you set --cpus 1.5, the container is guaranteed at most one and a half of the CPUs.

测试

  • TEST l :

    容器A:

    • --cpus 2限制容器最多使用2个CPU核
    • 压测8核, 容器CPU满负载情况
    docker container run \
    	--name "container_A" --cpus 2 \
    	--interactive --tty --rm \
    	progrium/stress --cpu 8
    

    发现:

    • 容器A使用了宿主机大约200%的CPU资源, 结果见下图

      3

  • TEST ll :

    容器A:

    • --cpus 0.5限制容器最多使用0.5个CPU核
    • 压测8核, 容器CPU满负载情况
    docker container run \
    	--name "container_A" --cpus 0.5 \
    	--interactive --tty --rm \
    	progrium/stress --cpu 8
    

    发现:

    • 容器A使用了宿主机大约50%的CPU资源, 结果见下图

      4

结论

--cpus选项可以限制容器使用宿主机的最多CPU核数



--cpuset-cpus选项

--cpuset-cpus string

Limit the specific CPUs or cores a container can use. A comma-separated list or hyphen-separated range of CPUs a container can use, if you have more than one CPU. The first CPU is numbered 0. A valid value might be "0-3" (to use the first, second, third, and fourth CPU) or "1,3" (to use the second and fourth CPU).

测试

  • TEST l :

    容器A:

    • --cpuset-cpus "0-2"限制容器使用第1个, 第2个, 第3个CPU核
    • 压测8核, 容器CPU满负载情况
    docker container run \
    	--name "container_A" --cpuset-cpus "0-2" \ 
    	--interactive --tty --rm \
    	progrium/stress --cpu 8
    

    发现:

    • 容器A仅使用了宿主机的Cpu0, Cpu1和Cpu2, 结果见下图

      1

  • TEST ll :

    容器A:

    • --cpuset-cpus "1,3"限制容器使用第1个, 第3个CPU核
    • 压测8核, 容器CPU满负债情况
    docker container run \
    	--name "container_A" --cpuset-cpus "1,3" \
    	--interactive --tty --rm \
    	progrium/stress --cpu 8
    

    发现:

    • 容器A仅使用了宿主机Cpu1和Cpu3, 结果见下图

      2

结论

--cpuset-cpus选项可以限制容器使用宿主机的哪个或哪几个CPU核

posted @ 2020-01-13 01:19  ZakZhu  阅读(1352)  评论(0编辑  收藏  举报