目錄
一、對CPU使用率的控制
1.1?CPU 資源控制
1.2?cgroups有四大功能?
1.3 設置cpu使用率上限
查看周期限制和cpu配額限制
進行cpu壓力測試然后修改每個周期的使用cpu的時間,查看cpu使用率?
1.4 設置cpu資源占用比(設置多個容器時才有效)
創建兩個容器設置比例然后壓測
分別進入到c1和c2容器中,進行壓測
1.5 設置容器綁定指定的cpu
二、內存資源控制
三、磁盤IO配額控制
3.1、限制Block IO
3.2、限制bps和iops進行限制
一、對CPU使用率的控制
1.1?CPU 資源控制
- cgroups,是一個非常強大的linux內核工具,他不僅可以限制被 namespace 隔離起來的資源, 還可以為資源設置權重、計算使用量、操控進程啟停等等。 所以 cgroups(Control groups)實現了對資源的配額和度量。
1.2?cgroups有四大功能?
- 資源限制:可以對任務使用的資源總額進行限制
- 優先級分配:通過分配的cpu時間片數量以及磁盤IO帶寬大小,實際上相當于控制了任務運行優先級
- 資源統計:可以統計系統的資源使用量,如cpu時長,內存用量等
- 任務控制:cgroup可以對任務執行掛起、恢復等操作
1.3 設置cpu使用率上限
Linux通過CFS(completely fair scheduler,完全公平調度器)來調度各個進程對cpu的使用
- 我們可以設置每個容器進程的調度周期,以及在這個周期內各個容器最多能使用多少cpu時間
- 使用--cpu-period即可設置調度周期,默認100ms,設置范圍為:1ms-1s,對應的--cpu-period的數值范圍是1000~10000000
- 使用--cpu-quota即可設置在每個周期內容器能使用cpu時間,默認無限制,設置的要求不能小于1ms,也就是--cpu-quota的值必須>=1000
查看周期限制和cpu配額限制
Linux通過CFS(Completely Fair Scheduler,完全公平調度器)來調度各個進程對CPU的使用。CFS默認的調度周期是100ms。
我們可以設置每個容器進程的調度周期,以及在這個周期內各個容器最多能使用多少 CPU 時間。使用 --cpu-period 即可設置調度周期,使用 --cpu-quota 即可設置在每個周期內容器能使用的CPU時間。兩者可以配合使用。
CFS 周期的有效范圍是 1ms~1s,對應的 --cpu-period 的數值范圍是 1000~1000000。 周期100毫秒
而容器的 CPU 配額必須不小于 1ms,即 --cpu-quota 的值必須 >= 100
docker run -itd --name test1 centos:7 /bin/bash
#啟動一個centos:7鏡像容器docker ps -a
#查看是否啟動成功,并查看pid號cd /sys/fs/cgroup/cpu/docker/容器PID號
#進入到該容器的限制目錄中cat cpu.cfs_quota_us
#查看每個周期的cpu最大限制時間cat cpu.cfs_period_us
#查看調度周期是多久//cpu.cfg_period_us: cpu 分配的周期(微秒,所以文件名中用us表示),默認為100000
//cpu.cfg_quota_us: 表示該cgroups限制占用的時間(微秒),默認為-1,表示為不限制,如果設為50000,表示占用50000/100000=50%的cpu
cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默認為100000。
- cpu.cfs_quota_us:表示該cgroups限制占用的時間(微秒),默認為-1,表示不限制。 如果設為50000,表示占用50000/100000=50%的CPU。?
進行cpu壓力測試然后修改每個周期的使用cpu的時間,查看cpu使用率?
docker run -itd --name test1 --cpu-quota 50000 centos:7 /bin/bash
#可以直接創建一個容器并設置每個周期cpu執行的時間
或者
docker run -itd --name test1 centos:7 /bin/bash
cd /sys/fs/cgroup/cpu/docker/【容器pid】
echo 50000 > cpu.cfs_quota_us
#也可以先創建一個容器,然后進入到文件中直接修改cpu執行的實際的文件名稱docker exec -it 【容器id】 /bin/bash
#進入容器vim /cpu.sh
#!bin/bash
i=0
while true
do
let i++
done
#創建死循環腳本,為了進行cpu壓力測試chmod +x /cpu.sh
./cpu.sh
#執行腳本
top
#查看這個容器中腳本占的多少的cpu資源
?
1.4 設置cpu資源占用比(設置多個容器時才有效)
Docker通過-cpu-share指定cpu份額,默認為1024,值為1024的倍數
- 在有多個容器競爭CPU時,我們可以設置每個容器能會用的CPU時間比例,這個比例叫做共享權值
- 共享式CPU資源,是按比例切分CPU資源,Docker默認每個容器的權值為1024.如果不指定或將其設置為0,都將使用默認值
- 通過--cpu-share并不是cpu資源的絕對數量,而是一個相對的權重值,某個容器最終能分配到的cpu資源取決于它的cpu share占用所有容器cpu share綜合的比例。換句話說,通過cpu share可以設置容器使用cpu的優先級
? ? ?
? 比如,當前系統上一共運行了兩個容器,第一個容器上權重是1024,第二個容器權重是512, 第二個容器啟動之后沒有運行任何進程,自己身上的512都沒有用完,而第一臺容器的進程有很多,這個時候它完全可以占用容器二的CPU空閑資源,這就是共享式CPU資源;如果容器二也跑了進程,那么就會把自己的512給要回來,按照正常權重1024:512劃分,為自己的進程提供CPU資源。如果容器二不用CPU資源,那容器一就能夠把容器二的CPU資源所占用,如果容器二也需要CPU資源,那么就按照比例劃分。那么第一個容器會從原來使用整個宿主機的CPU變為使用整個宿主機的CPU的2/3;這就是CPU共享式,也證明了CPU為可壓縮性資源。
創建兩個容器設置比例然后壓測
docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-shares 1024 centos:7
#創建兩個容器為c1和c2,若只有這兩個容器,設置容器的權重,使得c1和c2的cpu資源占比為1/3和2/3
?
分別進入到c1和c2容器中,進行壓測
分別進入容器,進行壓力測試
yum install -y epel-release
yum install -y stress
stress -c 4 #產生四個進程,每個進程都反復不停的計算隨機數的平方根
再開一個終端查看? docker stats?
?
1.5 設置容器綁定指定的cpu
–cpuset-cpus 是限制容器運行在指定的cpu核心
運行容器運行在哪個CPU核心上,例如主機有4個核心,cpu核心標識為0-3,我們一啟動容器,只想讓這臺容器運行在標識0和3的兩個CPU核心上,可以使用cpuset來指定。
docker run -itd --name c3 --cpuset-cpus 1,3 centos:7 /bin/bash
#啟動一個容器,讓它只使用內核1和內核3的資源docker exec -it 【容器id】 /bin/bash
#進入容器yum -y install epel-release
yum -y install stress
stress -c 8
#下載壓力測試工具,并測試8個核
?
?
?
另一個終端top查看?
?
?
二、內存資源控制
與操作系統類似,容器可以使用的內存包括兩部分:物理內存和Swap
Docker通過下面兩組參數來控制容器內存的使用量
- -m 或 --memory : 設置內存的使用限額, 例如:100MB,2GB
- –memory-swap : 設置內存+swap 的使用限額 (這個必須要和–memory一起使用)
正常情況下,–memory-swap 的值包含容器可用內存和可用swap。所以 -m 300m --memory-swap=1g 的含義為:容器可用使用300M的物理內存,并且可以使用700M(1G-300)的swap。
- 如果–memory-swap 設置為0 或者不設置,則容器可以使用的swap大小為-m值的兩倍。
- 如果 --memory-swap 的值和-m 值相同,則容器不能使用swap
- 如果 --memory-swap值為-1。它表示容器程序使用的內存受限,而可以使用的swap空間不受限制(宿主機有多少swap空間該容器就可以使用多少)
?
?
docker run -itd --name m1 -m 200m --memory-swap=300M centos:7 /bin/bash
#允許該容器使用物理內存200M,swap空間為100mdocker stats
#查看容器使用資源情況
?
?
三、磁盤IO配額控制
Block IO 是另一種可以限制容器使用的資源,Block IO 指的是磁盤的讀寫,docker可通過設置權重,限制bps和iops的方式控制容器讀寫磁盤的帶寬。
3.1、限制Block IO
默認情況下,所有容器能平等地讀寫磁盤,可以通過設置 --blkio-weight 參數來改變容器bliock IO 的優先級。–blkio-weight 與 --cpu-share類似,設置的是相對權重值,默認為500。
docker run -it --name b1 --blkio-weight 600 /bin/bashdocker run -it --name b2 --blkio-weight 300 /bin/bash#上面兩條中,b1容器讀寫磁盤的帶寬是b2容器的兩倍
?
3.2、限制bps和iops進行限制
- bps 是 byte per second ,表示每秒讀寫的數據量。
- iops 是 io per second ,表示每秒的輸入輸出量(或讀寫次數)
可以通過以下參數控制容器的bps和iops
- –device-read-bps,限制讀某個設備的bps(數據量)
- –device-write-bps,限制寫某個設備的bps(數據量)
- –device-read-iops,限制讀某個設備的iops(次數)
- –device-write-iops,限制寫某個設備的iops(次數)
對寫bps進行限制的測試
docker run -it --name b1 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
#創建容器,限制寫的數數據量為1mb/sdd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
#測試是否是寫入的1MB/S?
清理docker占用的磁盤空間
docker system prune -a#可以用于清理磁盤,刪除關閉的容器、無用的數據卷和網絡
?