Blog.080 Docker 資源控制管理
阿新 • • 發佈:2021-10-13
本章目錄
1. CPU 控制
1.1 設定 CPU 使用率上限
1.2 設定 CPU 資源佔用比(設定多個容器時有效)
1.3 設定容器繫結指定的 CPU
2. 對記憶體使用進行限制
2.1 建立指定為實體記憶體的容器
2.2 建立指定實體記憶體和 swap 的容器
2.3 對磁碟 IO 配額控制(blkio)的限制
2.4 清理 docker 佔用的磁碟空間
cgroups,是一個非常強大的 linux 核心工具,他不僅可以限制被 namespace 隔離起來的資源,
還可以為資源設定權重、計算使用量、操控程序啟停等等。
所以 cgroups (Control groups) 實現了對資源的配額和度量 。
cgroups有四大功能:
- 資源限制:可以對任務使用的資源總額進行限制;
- 優先順序分配:通過分配的cpu時間片數量以及磁碟I0頻寬大小,實際上相當於控制了任務執行優先順序;
- 資源統計:可以統計系統的資源使用量,如cpu時長, 記憶體用量等;
- 任務控制:cgroup可以對任務執行掛起、恢復等操作。
Linux 通過 CFS ( Completely Fair Scheduler,完全公平排程器)來排程各個程序對 CPU 的使用。CFS 預設的排程週期是 100ms。
可以設定每個容器程序的排程週期,以及在這個週期內各個容器最多能使用多少 CPU 時間。
使用 --cpu-period 即可設定排程週期,使用 --cpu-quota 即可設定在每個週期內容器能使用的CPU時間。兩者可以配合使用。
CFS 週期的有效範圍是1ms~1s, 對應的 --cpu-period 的數值範圍是 1000~1000000。
容器的 CPU 配額必須不小於1ms,即 --cpu-quota 的值必須 >= 1000。
(1)檢視 CPU 使用率
1 docker run -itd --name test5 centos:7 /bin/bash 2 3 docker ps -a 4 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES5 85c7a6860f72 centos:7 "/bin/bash" 4 seconds ago Up 4 seconds test5 6 7 cd /sys/fs/cgroup/cpu/docker/85c7a6860f72d66e36c924977891c170c111fb86a6f9b263c2bce36b0415e61c/ 8 9 cat cpu.cfs_period_us cpu.cfs_quota_us 10 100000 11 -1
- cpu.cfs_period_us:CPU 分配的週期(微秒,在檔名中用 us 表示),預設為100000。
- cpu.cfs_quota_us:表示該 control group 限制佔用的時間(微秒),預設為 -1,表示不限制。如果設為 50000,表示佔用 50000/100000=50% 的 CPU。
(2)進行 CPU 壓力測試
1 docker exec -it 3ed82355f811 /bin/bash 2 vim /cpu.sh 3 #!/bin/bash 4 i=0 5 while true 6 do 7 let i++ 8 done 9 10 chmod +x /cpu.sh 11 ./cpu.sh 12 exit 13 14 top #可以看到這個指令碼佔了很多的cpu資源
(3)設定 CPU 使用率
1 #設定50%的比例分配CPU使用時間上限 2 docker run -itd --name test2 --cpu-quota 50000 centos:7 /bin/bash #可以重新建立一個容器並設定限額 3 或者 4 cd /sys/fs/cgroup/cpu/docker/3ed82355f81151c4568aaa6e7bc60ba6984201c119125360924bf7dfd6eaa42b/ 5 echo 50000 > cpu.cfs_quota_us 6 docker exec -it 3ed82355f811 /bin/bash 7 ./cpu.sh 8 exit 9 10 top #可以看到cpu佔用率接近50%,cgroups對cpu的控制起了效果
Docker 通過--cpu-shares 指定 CPU 份額,預設值為1024,值為1024的倍數。
1 docker run -itd --name test1 --cpu-shares 1024 centos:7 2 docker run -itd --name test2 --cpu-shares 512 centos:7 3 4 #分別進入容器,進行壓力測試 5 docker exec -it 2e71bd7f3c4c bash 6 yum install -y epel-release 7 yum install stress -y 8 stress -c 4 #產生四個程序,每個程序都反覆不停的計算隨機數的平方根 9 10 #檢視容器的執行狀態(動態更新) 11 docker stats 12 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 13 2e71bd7f3c4c test2 32.96% 1.562MiB / 976.3MiB 0.16% 25.5MB / 137kB 179MB / 25.2MB 1 14 ffbdd0ef2781 test1 65.86% 12.2MiB / 976.3MiB 1.25% 25.5MB / 102kB 122MB / 25.2MB 1
1 #先分配虛擬機器4個CPU核數 2 docker run -itd --name test2 --cpuset-cpus 1,3 centos:7 /bin/bash 3 4 #進入容器,進行壓力測試 5 yum install -y epel-release 6 yum install stress -y 7 stress -c 4 8 exit 9 10 #退出容器,執行 top 命令再按 1 檢視CPU使用情況。
2. 對記憶體使用進行限制
2.1 建立指定為實體記憶體的容器
1 -m(--memory=)選項用於限制容器可以使用的最大記憶體 2 docker run -itd --name gxd6 -m 512m centos:7 /bin/bash 3 4 docker stats
1 docker run -itd --name gxd7 -m 512m --memory-swap 1g centos:7 /bin/bash 2 3 強調一下,--memory-swap是必須要與--memory一起使用的 4 5 正常情況下,--memory-swap的值包含容器可用記憶體和可用swap 6 所以-m 300m --memory-swap=1g 的含義為:容器可以使用300M 的實體記憶體,並且可以使用700M (1G - 300M)的swap 7 8 如果--memory-swap設定為0或者不設定,則容器可以使用的swap大小為-m值的兩倍 9 如果--memory-swap的值和-m值相同,則容器不能使用swap 10 如果--memory-Swap值為-1,它表示容器程式使用的記憶體受限,而可以使用的swap空間使用不受限制(宿主機有多少,swap容器就可以使用多少)
- 設定限制項
1 --device-read-bps:限制某個裝置上的讀速度bps(資料量),單位可以是kb、mb(M)或者gb。 2 例:docker run -itd --name gxd8 --device-read-bps /dev/sda:1M centos:7 /bin/bash 3 4 --device-write-bps : 限制某個裝置上的寫速度bps(資料量),單位可以是kb、mb(M)或者gb。 5 例:docker run -itd --name gxd9 --device-write-bps /dev/sda:1mb centos:7 /bin/bash 6 7 --device-read-iops :限制讀某個裝置的iops(次數) 8 9 --device-write-iops :限制寫入某個裝置的iops(次數)
- 建立容器,並限制寫速度
- 通過 dd 來驗證寫速度
1 docker exec -it cfa60bfee91c bash #進入容器 2 dd if=/dev/zero of=test.out bs=1M count=50 oflag=direct #新增oflag引數以規避掉檔案系統cache
1 docker system prune -a #可以用於清理磁碟,刪除關閉的容器、無用的資料卷和網路
-