Docker資源管理方式
一、docker資源控制
Docker通過Cgroup 來控制容器使用的資源配額,包括CPU、內(nèi)存、磁盤三大方面,基本覆蓋了常見的資源配額和使用量控制。
Caroup 是ControlGroups的縮寫,是Linux 內(nèi)核提供的一種可以限制、記錄、隔離進程組所使用的物理資源(如 cpu、內(nèi)存、磁盤,io等等)的機制,被LXC、docker等很多項目用于實現(xiàn)進程資源控制。
Cgroup本身是提供將進程進行分組化管理的功能和接口的基礎(chǔ)結(jié)構(gòu),I/O或內(nèi)存的分配控制等具體的資源管理是通過該功能來實現(xiàn)的。
- 資源限制:可以對任務使用的資源總額進行限制。
- 優(yōu)先級分配:通過分配的cpu時間片數(shù)量以及磁盤IO帶寬大小,實際上相當于控制了任務運行優(yōu)先級。
- 資源統(tǒng)計:可以統(tǒng)計系統(tǒng)的資源使用量,如cpu時長,內(nèi)存用量等。
- 任務控制: cgroup可以對任務 執(zhí)行掛起、恢復等操作。
二、docker占用宿主機cpu的限制
2.1 cpu的使用率上限
Linux通過CFS (Completely Fair Scheduler,完全公平調(diào)度器)來調(diào)度各個進程對ceu的使用。CFS默認的調(diào)度周期是100ms 。我們可以設(shè)置每個容器進程的調(diào)度周期,以及在這個周期內(nèi)各個容器最多能使用多少CPU時間。
使用--cpu-period 即可設(shè)置調(diào)度周期,使用--cpu-quota即可設(shè)置在每個周期內(nèi)容器能使用的CPU時間。兩者可以配合使用。CFS周期的有效范圍是 1ms~1s,對應的--cpu-period 的數(shù)值范圍是1000~1000000。而容器的CPU配額必須不小于1ms,即--cpu-quota的值必須>= 1000。而容器的CPU配額必須不小于1ms,即--cpu-quota的值必須>= 1000。
docker run -itd --name test5 centos:7 /bin/bash docker ps -a cd/sys/fs/cgroup/cpu/docker/9d415515c01e61a335bdc841e19b60a1ce54dd3cbaefeab7844fdcf785cd5aa4/ cd /sys/fs/cgroup/cpu/docker/ -1 cat cpu.cfs_period_us 100000 #cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默認為100000。 #cpu.cfs_quota_us:表示該cgroups限制占用的時間(微秒),默認為-1,表示不限制。 如果設(shè)為50000,表示占用50000/100000=50%的CPU。
進行CPU壓力測試
docker exec -it test5 bash vi /cpu.sh #!/bin/bash i=0 while true do let i++ done chmod +x /cpu.sh ./cpu.sh top #可以看到這個腳本占了很多的cpu資源
設(shè)置50%的比例分配CPU使用時間上限
docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash #可以重新創(chuàng)建一個容器并設(shè)置限額 或者 cd/sys/fs/cgroup/cpu/docker/9d415515c01e61a335bdc841e19b60a1ce54dd3cbaefeab7844fdcf785cd5aa4/ echo 50000 > cpu.cfs_quota_us docker exec -it 3ed82355f811 /bin/bash ./cpu.sh top #可以看到cpu占用率接近50%,cgroups對cpu的控制起了效果 #在多核情況下,如果允許容器進程完全占用兩個 CPU, 則可以將 cpu-period 設(shè)置為 100000( 即 0.1 秒), cpu-quota設(shè)置為 200000(0.2 秒)。
2.2 設(shè)置CPU資源占用比(設(shè)置多個容器時才有效)
注意:該方式需要設(shè)置多個容器時才會生效
創(chuàng)建容器時可以使用選項 --cpu-shares 數(shù)值(該數(shù)值要為1024的倍數(shù),1024代表一份,當個容器占用cpu的份額由自身分配的份數(shù)除于所有容器占用cpu的份數(shù),就為該容器所占用cpu資源的百分比)
[root@localhost ~]#docker run -id --name b1 --cpu-shares 2048 centos:7 [root@localhost ~]#docker run -id --name b2 --cpu-shares 1024 centos:7 [root@localhost ~]#docker run -id --name b3 --cpu-shares 1024 centos:7
創(chuàng)建三個容器為 b1 和 b2 和 b3,設(shè)置容器的權(quán)重,使得b1和b2和b3的CPU資源占比為1/2和1/4和1/4。
開啟三個終端,啟動容器壓測:
#三個容器均為以下壓測操作 #下載壓測工具依賴環(huán)境 yum install -y epel-release #下載壓測工具 yum install -y stress #進行四個線程壓測 stress -c 2 #再開啟一個終端查看測試結(jié)果 docker stats
查看容器運行狀態(tài)(動態(tài)更新)
由測試結(jié)果, 可以看到在cPU進行時間片分配的時候,容器b1比容器b2和b3多一倍的機會獲得cpu的時間片。但分配的結(jié)果取決于當時主機和其他容器的運行狀態(tài),實際上也無法保證容器 b2和b3一定能獲得cpu時間片
比如容器b2和b3的進程一直是空閑的,那么容器b1是可以獲取比容器b2和b3更多的cpu時間片的。極端情況下,例如主機上只運行了一個容器,即使它的cpu份額只有50,它也可以獨占整個主機的cpu資源。
Cgroups 只在容器分配的資源緊缺時,即在需要對容器使用的資源進行限制時,才會生效。因此,無法單純根據(jù)某個容器的cpu 份額來確定有多少cpu資源分配給它,資源分配結(jié)果取決于同時運行的其他容器的CPU分配和容器中進程運行情況。
2.3 設(shè)置容器綁定指定的cpu
查看主機中的cpu編號
top 按數(shù)字“1”
進行綁核創(chuàng)建容器
[root@localhost ~]#docker run -id --name b4 --cpuset-cpus 1 centos:7
壓力測試:
yum install -y epel-release yum install -y stress stress -c 1
三、內(nèi)存使用的限制
3.1 限制容器可以使用的最大內(nèi)存
m (或--memory=)選項用于限制容器可以使用的最大內(nèi)存
docker run -itd --name d1 -m 512m centos:7 /bin/bash docker stats
3.2 限制容器可用的swap 大小
#限制可用的swap 大小,--memory-swap
- 強調(diào)一下, --memory-swap是必須要與 --memory(或-m)一起使用的。
- 正常情況下, --memory-swap 的值包含容器可用內(nèi)存和可用swap 。
- 所以 -m 300m --memory-swap=1g 的含義為:容器可以使用300M 的物理內(nèi)存,并且可以使用700M (1G - 300M)的swap。 ? 設(shè)置為0或者不設(shè)置,則容器可以使用的 swap 大小為 -m 值的兩倍。 如果 --memory-swap 的值和 -m 值相同,則容器不能使用swap。 如果 --memory-swap 值為 -1,它表示容器程序使用的內(nèi)存受限,而可以使用的swap空間使用不受限制(宿主機有多少swap 容器就可以使用多少)。
#--memory-swap 的值包含容器可用內(nèi)存和可用swap,減去-m的值才是可用swap的值。 #表示容器可以使用512M的物理內(nèi)存,并且可以使用512M的swap。因為1g減去512m的物理內(nèi)存,剩余值才是可用swap。 docker run -itd --name d2 -m 512m --memory-swap=1g centos:7 bash ? ? #--memoryswap值和 -m 的值相同,表示容器無法使用swap docker run -itd --name d3 -m 512m --memory-swap=512m centos:7 bash ? ? # --memory-swap 的值設(shè)置為0或者不設(shè)置,則容器可以使用的 swap 大小為 -m 值的兩倍。 docker run -itd --name d4 -m 512m centos:7 bash ? ? # --memory-swap 值為 -1,它表示容器程序使用的內(nèi)存受限,但可以使用的swap空間使用不受限制(宿主機有多少swap 容器就可以使用多少)。 docker run -itd --name d5 -m 512m --memory-swap=-1 centos:7 bash
四、對磁盤IO的配置控制(blkio)的限制
- -device-read-bps:限制某個設(shè)備上的讀速度bps ( 數(shù)據(jù)量),單位可以是kb、mb (M)或者gb。
- --device-write-bps : 限制某個設(shè)備上的寫速度bps ( 數(shù)據(jù)量),單位可以是kb、mb (M)或者gb。
該速度是指每秒鐘進行讀寫操作1M,1G或者是1kb
- --device-read-iops :限制讀某個設(shè)備的iops (次數(shù))
- --device-write-iops :限制寫入某個設(shè)備的iops ( 次數(shù))
4.1 默認情況下容器的寫速度
[root@localhost ~]#docker run -id --name e1 centos:7 [root@localhost ~]#docker exec -it e1 bash [root@8657384cb483 /]# dd if=dev/zero of=/mnt/test.txt bs=10M count=10 oflag=direct ## oflag=direct 規(guī)避文件讀寫系統(tǒng)中所帶來的緩存,避免影響測試結(jié)果
4.2 進行寫速度限制的容器創(chuàng)建
docker run -it --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash dd if=dev/zero of=/mnt/test.txt bs=10M count=10 oflag=direct
五、清除docker占用的磁盤空間
docker system prune -a 可用于清理磁盤,刪除關(guān)閉的容器、無用的數(shù)據(jù)卷和網(wǎng)絡(luò)。
docker system prune -a
總結(jié)
對cpu的限制參數(shù)
設(shè)置單個容器進程能夠使用的CPU使用率上限 針對新建的容器: docker run --cpu-period 單個CPU調(diào)度周期時間(1000~1000000) --cpu-quota 容器進程能夠使用的最大CPU時間(>=1000) 針對已存在的容器: 修改 /sys/fs/cgroup/cpu/docker/容器ID/ 目錄下的 cpu.cfs_period_us(單個CPU調(diào)度周期時間) cpu.cfs_quota_us(容器進程能夠使用的最大CPU時間) 文件的值 設(shè)置多個容器的CPU占用份額(只能在多個容器同時運行且CPU資源緊張時生效) docker run --cpu-shares 容器進程最大占用CPU的份額(值為1024的倍數(shù)) 設(shè)置容器綁定指定的CPU docker run --cpuset-cpus CPUID1[,CPUID2,....]
對內(nèi)存的限制
設(shè)置容器能夠使用的內(nèi)存和swap的值 docker run -m 內(nèi)存值 --memory-swap 內(nèi)存和swap的總值 設(shè)置 0 或 不設(shè)置,表示swap為內(nèi)存的2倍 設(shè)置 -1,表示不限制swap的值,宿主機有多少容器即可使用多少 設(shè)置 與 -m 一樣的值,表示不使用swap
對磁盤IO的限制
docker run --device-read-bps 磁盤設(shè)備文件路徑:速率 #限制容器在某個磁盤上讀的速度 --device-write-bps 磁盤設(shè)備文件路徑:速率 #限制容器在某個磁盤上寫的速度 --device-read-iops 磁盤設(shè)備文件路徑:次數(shù) #限制容器在某個磁盤上讀的次數(shù) --device-write-iops 磁盤設(shè)備文件路徑:次數(shù) #限制容器在某個磁盤上寫的速度
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker容器環(huán)境安裝及鏡像基礎(chǔ)操作
容器是一種輕量級虛擬化技術(shù),能夠快速構(gòu)建業(yè)務環(huán)境并便于業(yè)務遷移,解決兼容性問題,這篇文章主要介紹了docker容器環(huán)境安裝及鏡像基礎(chǔ)操作,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-09-09docker?Desktop安裝WSL?--update報錯問題成功解決辦法
這篇文章主要介紹了如何在Windows?11上設(shè)置WSL2為默認版本,解決WSL2安裝和卸載過程中遇到的問題,包括強制中斷命令、wsl--uninstall命令無效以及手動刪除Linux發(fā)行版的方法,需要的朋友可以參考下2025-02-02docker-compose統(tǒng)一管理多個容器使用詳解
這篇文章主要為大家介紹了docker-compose統(tǒng)一管理多個容器使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02