Docker資源配置
簡介
Docker 通過 cgroup 來控制容器使用的資源配額,包括 CPU、內存、磁盤三大方面,基本覆蓋了常見的資源配額和使用量控制。
cgroup
cgroup 是 Control Groups 的縮寫,是 Linux 內核提供的一種可以限制、記錄、隔離進程組所使用的物理資源(如 cpu、memory、磁盤 IO 等等) 的機制,被 LXC、docker 等很多項目用於實現進程資源控制。cgroup 將任意進程進行分組化管理的 Linux 內核功能。cgroup 本身是提供將進程進行分組化管理的功能和接口的基礎結構,I/O 或內存的分配控制等具體的資源管理功能是通過這個功能來實現的。
資源分配的優點
- 不同的容器承擔不同的業務 根據業務的重要性分配不同的資源份額
- 通過更好的分配服務器資源 能高加高效穩定的保證容器運行
控制Docker執行任務CPU
配置容器權重
- 默認cpu份額都是1024 在同一個cpu容器運行多個
- cpu份額分配結果取決於容器運行時候的狀態 假如:容器A分配的份額為1024容器B分配的份額為512 此時容器A處於空閑狀態 那么容器B也會獨占整個cpu資源
- cgroups 只在多個容器同時爭搶同一個 cpu 資源時,cpu 配額才會生效
[root@SR ~]# docker run -it --cpu-shares 521 centos:7.6.1810 /bin/bash # 分配512的權重
[root@4a808316880a /]# cat /sys/fs/cgroup/cpu/cpu.shares # 查看權重
配置容器cpu的親和力
# 配置容器對cpu 0 1親和力
[root@SR ~]# docker run -it --name cpu_set --cpuset-cpus 0,1 centos:7.6.1810 /bin/bash
[root@10b7a20b1515 /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus
混合使用
# 使用stress進行壓測
# 創建兩個實例 權重分別為512和1024
[root@SR ~]# docker run --name docker10 -idt --cpuset-cpus 0,1 --cpu-shares 512 centos:7.6.1810 /bin/bash
[root@SR ~]# docker run --name docker20 -itd --cpuset-cpus 0,1 --cpu-shares 1024 centos:7.6.1810 /bin/bash
[root@557ca1c90049 /]# stress -c 2 -v -t 10m # 容器開啟壓測
[root@85715d5cac37 /]# stress -c 2 -v -t 10m # 容器開啟壓測
PS:此處只有cpu 0 1被調度 同時docker20的cpu使用率是docker10的2倍
周期控制
- --cpu-period 是用來指定容器對 CPU 的使用,要在多長時間內做一次重新分配。 指定周期
- --cpu-quota 是用來指定在這個周期內,最多可以有多少時間片斷用來跑這個容器。 指定在這個周
期中使用多少時間片 - 跟--cpu-shares 不同的,--cpu-period 和--cpu-quota 是指定一個絕對值,而且沒有彈性在里
面,容器對 CPU 資源的使用絕對不會超過配置的值
# 設置 docker 實例每 1 秒只能使用單個 CPU 的 0.2 秒時間,可以將 cpu-period 設置為1000000(即 1 秒),cpu-quota 設置為 200000(0.2 秒)
[root@SR ~]# docker run -it --cpu-period 1000000 --cpu-quota 2000000 centos /bin/bash
[root@7150d481dbf1 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us # 查看周期
[root@7150d481dbf1 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us # 查看周期內時間片
釋放容器實例
當容器運行命令結束后 自動刪除容器 釋放資源
[root@SR ~]# docker run -it --rm --name test_rm centos:7.6.1810 sleep 5 # 使用rm進行刪除
[root@SR ~]# docker ps | grep test_rm
控制容器的內存
Docker 提供參數-m, --memory=""限制容器的內存使用量
# 允許容器使用的內存上限為 125M
[root@SR ~]# docker run -it -m 125m centos:7.6.1810
[root@e05e5e6a881c /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes # 查看內存
控制容器的I/O
防止容器吃光物理機磁盤
[root@SR ~]# docker run -it -v /var/www/html/:/var/www/html --devic/dev/sda:/dev/sda --device-write-bps /dev/sda:1mb centos /bin/bash
[root@bd79042dbdc9 /]# time dd if=/dev/sda of=/var/www/html/test.out bs=1M count=50 oflag=direct,nonblock
dd參數解釋
direct:讀寫數據采用直接 IO 方式,不走緩存。直接從內存寫硬盤上
nonblock:讀寫數據采用非阻塞 IO 方式,優先寫 dd 命令的數據
Docker數據映射
- Docker存儲屬於弱項 需要通過外掛進行實現
- 通過映射此時docker損壞 數據存在
物理機與容器數據映射
# 通過-v 進行數據映射
[root@SR ~]# echo "測試Docker的數據映射" /var/www/html/test.html
[root@SR ~]# docker run -it --name test_web -v /var/www/html/:/var/www/html centos /bin/bash # 數據映射
[root@da7eb360b3f4 /]# ls /var/www/html/ # 查看映射目錄
[root@da7eb360b3f4 /]# cat /var/www/html/test.html # 查看內容
容器與物理機進行數據映射
[root@da7eb360b3f4 html]# vim test.html
test
[root@SR ~]# cat /var/www/html/test.html