Docker 的 Memory 與 CPU 資源管理

Docker 資源管理可以設定 CPU, Memory, IO 等機制,在啟用容器後也可即時的查看 container 資源使用情況。

如果沒有限制 Docker 的 Memory 與 CPU ,Docker 將會使用系統所有的資源。

在 Linux 的核心有針對資源管理的功能 - cgroup ,以下是 cgroup 資源管理的參數

  • blkio - 外接裝置io設定(disk, usb…)
  • cpu - 設定 CPU 訪問
  • cpuset - 針對多核心 CPU 分配資源
  • devices - 設定裝置訪問權限
  • freezer - 暫停/啟用 cgroup 任務
  • memory - 設定 cgroup 記憶體資源
  • net_cls - 網路封包標記
  • ns - 子系統空間命名
  • perf_event - group 監控及追蹤。

Docker 主要使用了 cgroup 部分功能,可用來管理 Memory 與 CPU。

Docker 運行之後,可以透過 stats 查看目前啟用容器資源使用情況:

docker stats [docker_image]

記憶體配置

Docker 記憶體配置可以從 memory 和 swap 來進行設置。關於記憶體的使用,難免會遇到 OOM (Out Of Memory)情況,當 Linux 核心發現OOM情況時,會觸發 OOM Killer 殺掉一些 process,盡可能在多數的情況,配置足夠的記憶體,才是比較恰當的做法。

關於配置設定,可查看 docker help

docker run --help |egrep 'memory|oom'  

記憶體分配可透過 --memory

CVT2HUGO: 來設定最大個記憶體使用上限,單位可用 k, g, m,設定完成後,會自動分配同樣大小的 swap。另外,```memory-snappiness```
docker run --memory 256m  --memory-swap=512m -d [docker_image]

CVT2HUGO: 可以用來設定 swap 分槽的機率,值為 0-100,0表示盡量不使用 swap ,100表示盡量使用 swap 分割槽。–memory-swap

CPU 設置

CPU分配

可以透過 --cpus CVT2HUGO: 則是設定記憶體與 swap 總和,通常都要大於 --memory,若設定 CVT2HUGO: 來分配 CPU,例如在 2 CPUs 的情況,可以透過 cpus="1.0" CVT2HUGO: -1 表示 swap 不限量,如果設定值小於 --memory CVT2HUGO: 來分配一個 CPU

CVT2HUGO: 則會自動套用預設值,即 ``` memory-swap ``` 的兩倍。
docker run -it --cpus="1.0" ubuntu

CPU加權配置

在多個 Container 同時運行時,可以進行加權設定,預設為 1024,指定哪些 container 可以分配較多的 CPU 用量。

在單一 container 運行的情況下,使用加權是沒有意義的。

可以透過 --cpu-shares

CVT2HUGO: 來設定加權
docker run -cpu-shares 100 -d [docker_image]

加權只有在 CPU 資源開始緊縮時,才會針對權限配置來分配CPU。

CPU使用週期

設置 CPU 分配時間,可以透過 --cpu-period--cpu-period CVT2HUGO: 與 --cpu-quota CVT2HUGO: 主要可設定CPU重新分配週期,多久時間重新分配 CPU,單位為微秒 (μs),預設為 0.1 秒 (1^5),--cpu-quota CVT2HUGO: 來設定 CPU 分配

CVT2HUGO: 可設定在可使用的週期時間內,CPU 被分配的時間,預設為 -1 ,表示不限制。
docker run --cpu-period=1000000 --cpu-quota=500000  -d [docker_image]

例如,上面設定為 cpu-period 為 1 秒,cpu-quota 設定為 0.5 秒,表示在每秒可分配CPU時間為 0.5秒。

如果是多核心 CPU,例如雙核心 CPU,若要完全佔用 CPU,則可設定 cpu-period 為 0.1秒,cpu-quota 為 0.2秒。

Docker-compose 資源設定

在 docker-compose version 3 之後,就不支援 memory 及 cpu 的設定,需透過 ```docker

如果有需要進行資源設定,可以透過 deploy.resource 來設定資源

CVT2HUGO: swarm```才能進行配置。
version: "3.4"

services:
  nginx:
    image: "nginx"
    deploy:
      resources:
        limits:
          cpus: "0.50"  #表示為 NanoCpu = 1000000000 * 0.5
          memory: "256M"

接著要使用兼容 API V2 的參數 --compatibility

docker-compose --compatibility up

運行後,可以查看 CPU 設置

docker inspect nginx | grep Cpu