1. 程式人生 > >Docker 容器CPU設置

Docker 容器CPU設置

complete 運行程序 ems ats 統一 通過 數值 多個 機器

CPU使用率其實就是你運行的程序占用的CPU資源,表示你的機器在某個時間點的運行程序的情況。
使用率越高,說明你的機器在這個時間上運行了很多程序,反之較少。
CPU使用率的高低與你的CPU強弱有直接關系。

Docker CPU 限制;
Docker 的資源限制和隔離完全基於 Linux cgroups。
對 CPU 資源的限制方式也和 cgroups 相同。
Docker 提供的 CPU 資源限制選項可以在多核系統上限制容器能利用哪些 vCPU。
而對容器最多能使用的 CPU 時間有兩種限制方式:
一是有多個 CPU 密集型的容器競爭 CPU 時,設置各個容器能使用的 CPU 時間相對比例。
二是以絕對的方式設置容器在每個調度周期內最多能使用的 CPU 時間。

--cpuset-cpus=""    # 允許使用的 CPU 集合
-c,--cpu-shares=0    # CPU 共享權值(相對權重)
cpu-period=0      # 限制 CPU CFS 的周期,範圍從 100ms~1s,即[1000, 1000000]
--cpu-quota=0    # 限制 CPU CFS 配額,必須不小於1ms,即 >= 1000
--cpuset-mems=""    # 允許在上執行的內存節點(MEMs),只對 NUMA 架構有效

NUMA
非統一內存訪問(NUMA)是一種用於多處理器的電腦記憶體設計,內存訪問時間取決於處理器的內存位置。 在NUMA下,處理器訪問它自己的本地存儲器的速度比非本地存儲器(存儲器的地方到另一個處理器之間共享的處理器或存儲器)快一些。

CPU 查看在 cat /proc/cpuinfo

docker run -d -it --cpuset-cpus="0,6" --name Centos-3 centos /bin/bash

我們可以設置容器可以在哪些 CPU 核上運行。

例如:
docker run -it --cpuset-cpus="0,6" --name Centos centos /bin/bash
設置容器中的進程可以在 cpu 0 和 cpu 6上執行。

docker run -it --cpuset-cpus="0-5" --name Centos centos /bin/bash
設置容器中的進程可以在 cpu0 - cpu5 上執行。

在 NUMA CPU 架構上,我們可以設置容器可以使用的內存節點。
docker run -it --cpuset-mems="1,5" --name Centos centos /bin/bash
設置容器中的進程只能使用節點 1 和 5 上的內存。

docker run -it --cpuset-mems="0-3" --name Centos centos /bin/bash
設置容器中的進程只能使用節點 0、1、2、3 上的內存。

CPU 資源的相對限制

默認情況下,所有的容器得到同等比例的 CPU 周期。在有多個容器競爭 CPU 時我們可以設置每個容器能使用的 CPU 時間比例。這個比例叫作共享權值,通過-c或--cpu-shares設置。Docker 默認每個容器的權值為 1024。不設置或將其設置為 0,都將使用這個默認值。系統會根據每個容器的共享權值和所有容器共享權值和比例來給容器分配 CPU 時間。


CPU 資源的絕對限制
Linux 通過 CFS(Completely Fair Scheduler,完全公平調度器)來調度各個進程對 CPU 的使用。
CFS 默認的調度周期是 100ms。
設置每個容器進程的調度周期,以及在這個周期內各個容器最多能使用多少 CPU 時間。

--cpu-period 設置調度周期,
--cpu-quota 設置在每個周期內容器能使用的 CPU 時間。

例如:
docker run -it --cpu-period=50000 --cpu-quota=25000 Centos centos /bin/bash
將 CFS 調度的周期設為 50000,將容器在每個周期內的 CPU 配額設置為 25000,表示該容器每 50ms 可以得到 50% 的 CPU 運行時間。

docker run -it --cpu-period=10000 --cpu-quota=20000 Centos centos /bin/bash
將容器的 CPU 配額設置為 CFS 周期的兩倍,CPU 使用時間怎麽會比周期大呢?其實很好解釋,給容器分配兩個 vCPU 就可以了。該配置表示容器可以在每個周期內使用兩個 vCPU 的 100% 時間。

CFS 周期的有效範圍是 1ms~1s,對應的--cpu-period的數值範圍是 1000~1000000。
而容器的 CPU 配額必須不小於 1ms,即--cpu-quota的值必須 >= 1000。可以看出這兩個選項的單位都是 us。

正確的理解 "絕對"

--cpu-quota 設置容器在一個調度周期內能使用的 CPU 時間時實際上設置的是一個上限。
並不是說容器一定會使用這麽長的 CPU 時間。

啟動一個容器,將其綁定到 cpu 1 上執行。給其 --cpu-quota 和--cpu-period 都設置為 50000。

docker run -d --name mongo1 --cpuset-cpus 1 --cpu-quota=50000 --cpu-period=50000 docker.io/mongo
調度周期為 50000,容器在每個周期內最多能使用 50000 cpu 時間。

技術分享圖片

docker run -d --name mongo2 --cpuset-cpus 1 --cpu-quota=50000 --cpu-period=50000 docker.io/mongo

再docker stats mongo-1 mongo-2可以觀察到這兩個容器,
每個容器對 cpu 的使用率在 50% 左右。說明容器並沒有在每個周期內使用 50000 的 cpu 時間。

技術分享圖片

使用docker stop mongo2命令結束第二個容器,再加一個參數-c 2048 啟動它:

docker run -d --name mongo2 --cpuset-cpus 1 --cpu-quota=50000 --cpu-period=50000 -c 2048 docker.io/mongo

再用docker stats mongo-1命令可以觀察到第一個容器的 CPU 使用率在 33% 左右,第二個容器的 CPU 使用率在 66% 左右。因為第二個容器的共享值是 2048,第一個容器的默認共享值是 1024,所以第二個容器在每個周期內能使用的 CPU 時間是第一個容器的兩倍。

技術分享圖片

Docker 容器CPU設置