Docker容器CPU限制選項測試

Docker容器CPU限制選項測試

Docker Version: 19.03.5bash

😄 Written by Zak Zhu

參考

  • Breeze老師的docker培訓
  • 馬哥docker視頻

實驗環境

HOST CPUs
VM 4


--cpu-shares選項

--cpu-shares intless

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 :this

    容器A:code

    • --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%), 結果見下圖ci

      5

  • TEST ll : 資源

    容器A:string

    • --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核

相關文章
相關標籤/搜索