Docker之限制容器的資源使用過(guò)程
一、容器所用內(nèi)存資源的限制
容器可使用的內(nèi)存:物理內(nèi)存和交換空間(Swap)。
1.1、用戶(hù)內(nèi)存限制
Docker默認(rèn)沒(méi)有設(shè)置內(nèi)存限制。
可以通過(guò)相關(guān)選項(xiàng)限制設(shè)置:
- -m(--memory):設(shè)置容器可用的最大內(nèi)存。該值最低為4MB。
- --memory-swap:允許容器置入磁盤(pán)交換空間中的內(nèi)存大小。
Docker提供4種方式設(shè)置容器的用戶(hù)內(nèi)存使用:
- 對(duì)容器內(nèi)存使用無(wú)限制(兩個(gè)選項(xiàng)都不使用)。
- 設(shè)置內(nèi)存限制并取消交換空間內(nèi)存限制。
#使用300內(nèi)存和盡可能多的交換空間 docker run -it -m 300M --memory-swap -1 ubuntu /bin/bash
- 只設(shè)置內(nèi)存限制。
# 300MB的內(nèi)存和300MB的交換空間(默認(rèn)情況下虛擬內(nèi)存總量將設(shè)置為內(nèi)存大小的兩倍,因此容器能使用300M的交換空間 docker run –it -m 300M ubuntu /bin/bash
- 同時(shí)設(shè)置內(nèi)存和交換空間
# 300MB的內(nèi)存和700MB的交換空間 docker run –it –m 300M --memory-swap 1G ubuntu/bin/bash
1.2、內(nèi)核內(nèi)存限制
內(nèi)核內(nèi)存不能交換到磁盤(pán)中,無(wú)法使用交換空間,消耗過(guò)多可能導(dǎo)致其阻塞系統(tǒng)服務(wù)。
# 在500MB的內(nèi)存中,可以使用最高50MB的內(nèi)核內(nèi)存 docker run –it -m 500M --kemel-memory 50M ubuntu /bin/bash ? # 只可以使用50MB的內(nèi)核內(nèi)存 docker run –it --kernel-memory 50M ubuntu /bin/bash
1.3、設(shè)置內(nèi)存預(yù)留實(shí)現(xiàn)軟限制
使用--memory-reservation選項(xiàng)設(shè)置內(nèi)存預(yù)留。
它是一種內(nèi)存軟限制,允許更多的內(nèi)存共享。設(shè)置后,Docker將檢測(cè)內(nèi)存爭(zhēng)用或內(nèi)存不足,并強(qiáng)制容器將其內(nèi)存消耗限制為預(yù)留值。
內(nèi)存預(yù)留值應(yīng)當(dāng)始終低于硬限制。作為一個(gè)軟限制功能,內(nèi)存預(yù)留并不能保證不會(huì)超過(guò)限制。
# 限制內(nèi)存為500MB,內(nèi)存預(yù)留值(軟限制)為200MB。 # 當(dāng)容器消耗內(nèi)存大于200MB、小于500MB時(shí),下一次系統(tǒng)內(nèi)存回收將嘗試將容器內(nèi)存縮減到200MB以下。 docker run –it –m 500M --memory-reservation 200M ubuntu /bin/bash ? # 設(shè)置內(nèi)存軟限制為1GB docker run –it —-memory-reservation 1G ubuntu /bin/bash
二、容器所用CPU資源的限制
默認(rèn)情況為所有容器可以平等地使用主機(jī)CPU資源并且不受限制。
2.1、CPU份額限制
-c(--cpu-shares)選項(xiàng)將CPU份額權(quán)重設(shè)置為指定的值。
默認(rèn)值為1024,如果設(shè)置為0,系統(tǒng)將忽略該值并使用默認(rèn)值1024。
2.2、CPU周期限制
--cpu-period選項(xiàng)(以μs為單位)設(shè)置CPU周期以限制容器CPU 資源的使用。
默認(rèn)的CFS(完全公平調(diào)度器)周期為100ms(100000μs)。
通常將--cpu-period與--cpu-quota這兩個(gè)選項(xiàng)配合使用:
# 如果只有1個(gè)CPU,則容器可以每50ms(50000μs)獲得50%(25000/50000)的CPU運(yùn)行時(shí)間。 docker run -it --cpu-period=50000 -~cpu-quota=25000 ubuntu /bin/bash
可用--cpus選項(xiàng)指定容器的可用 CPU 資源來(lái)達(dá)到同樣的目的。
--cpus 選項(xiàng)值是一個(gè)浮點(diǎn)數(shù),默認(rèn)值為 0.000,表示不受限制。
# 上述可改為 docker run -it --cpus=0.5 ubuntu /bin/bash
--cpu-period和--cpu-quota選項(xiàng)都是以1個(gè)CPU為基準(zhǔn)。
2.3、CPU放置限制
--cpuset-cpus選項(xiàng)限制容器進(jìn)程在指定的CPU上執(zhí)行。
# 容器中的進(jìn)程可以在cpu1和cpu3上執(zhí)行 docker run -it--cpuset-cpus="1, 3" ubuntu:14.04 /bin/bash ? # 容器中的進(jìn)程可以在cpu0、cpu1和cpu 2上執(zhí)行 docker run -it --cpuset-cpus="0-2" ubuntu:14.04 /bin/bash
2.4、CPU配額限制
--cpu-quota選項(xiàng)限制容器的CPU配額,默認(rèn)值為0表示容器占用 100%的CPU資源個(gè)CPU)。
CFS用于處理進(jìn)程執(zhí)行的資源分配,是由內(nèi)核使用的默認(rèn) Linux 調(diào)度程序。
將此值設(shè)置50000意味著限制容器至多使用CPU資源的50%。對(duì)于多個(gè)CPU而言,調(diào)整--cpu-quota選項(xiàng)必要的。
三、容器所用塊I/O帶寬的限制
塊I/O帶寬(Block I/O Bandwidth,Blkio)是另一種可以限制容器使用的資源。
塊I/O指磁盤(pán)的寫(xiě),Docker可通過(guò)設(shè)置權(quán)重、限制每秒字節(jié)數(shù)(B/s)和每秒I/O次數(shù)(IO/s)的方式控制容器讀寫(xiě)盤(pán)的帶寬。
3.1、設(shè)置塊I/O權(quán)重
--blkio-weight選項(xiàng)更改比例(原默認(rèn)為500),設(shè)置相對(duì)于所有其他正在運(yùn)行的容器的塊 I/O 帶寬權(quán)重。
# 創(chuàng)建兩個(gè)有不同塊 I/O 帶寬權(quán)重的容器。 docker run –it --name c1 --blkio-weight 300 ubuntu /bin/bash docker run -it --name c2 --blkio-weight 600 ubuntu /bin/bash
3.2、限制設(shè)備讀寫(xiě)速率
Docker 根據(jù)兩類(lèi)指標(biāo)限制容器的設(shè)備讀寫(xiě)速率:一類(lèi)是每秒字節(jié)數(shù),另一類(lèi)是每秒I/O次數(shù)。
- 限制每秒字節(jié)數(shù)
--device-read-bps選項(xiàng)限制指定設(shè)備的讀取速率,即每秒讀取的字節(jié)數(shù)。
# 創(chuàng)建一個(gè)容器,并限制對(duì)/dev/sda設(shè)備的讀取速率為每秒1MB docker run -it --device-read-bps /dev/sda:1mb ubuntu
類(lèi)似地,可使用--device-write-bps選項(xiàng)限制指定設(shè)備的寫(xiě)入速率。
格式:
<設(shè)備>:<速率值>[單位]
- 限制每秒I/O次數(shù)
--device-read-iops和--device-write-iops選項(xiàng)制指定設(shè)備的讀取和寫(xiě)入速率,用每秒I/O次數(shù)表示。
# 創(chuàng)建一個(gè)容器,限制它對(duì)1devsd3設(shè)備的讀取速率為每秒1000次。 docker run -it --device-read-iops /dev/sda:1000 ubuntu
四、資源限制的實(shí)現(xiàn)機(jī)制
對(duì)容器使用的內(nèi)存、CPU和塊I/O帶寬資源的限制具體是由控制組(Cgroup)的相應(yīng)子系統(tǒng)來(lái)實(shí)現(xiàn)的。
- memory子系統(tǒng)設(shè)置控制組中的住務(wù)所使用的內(nèi)存限制;
- cpu子系統(tǒng)通過(guò)調(diào)度程序提供對(duì)CPU的控制組任務(wù)的訪(fǎng)問(wèn);
- blkio子系統(tǒng)為塊設(shè)備(如磁盤(pán)、固態(tài)硬盤(pán)、USB等)設(shè)置輸入和輸出限制。
在docker run命令中使用--cpu-shares、--memory、--device-read-bps等選項(xiàng)實(shí)際上就是在配置控制組,相關(guān)的配置文件保存在/sys/fs/cgroup目錄中。
五、示例
5.1、驗(yàn)證分析容器資源限制的實(shí)現(xiàn)機(jī)制
- 啟動(dòng)一個(gè)容器,設(shè)置內(nèi)存限額為300MB,CPU權(quán)重為512。
[root@docker ~]# docker run --rm -d -p 8080:80 -m 300M --cpu-shares=512 httpd b8a03a3887f1f...
- 查看/sys/fs/cgroup/cpu/docker目錄,發(fā)現(xiàn)Linux為每個(gè)正在運(yùn)行的容器創(chuàng)建一個(gè)Cgroup目錄,以容器ID命名:
[root@docker ~]# ls -l /sys/fs/cgroup/cpu/docker/ total 0 drwxr-xr-x 2 root root 0 Apr 29 13:08 b8a03a3887f1f... ...
- 進(jìn)一步查看容器子目錄,會(huì)發(fā)現(xiàn)每個(gè)容器的子目錄中都包含所有與CPU相關(guān)的Cgroup配置:
[root@docker ~]# ls -l /sys/fs/cgroup/cpu/docker/b8a03a3887f1f... total 0 ... -rw-r--r-- 1 root root 0 Apr 29 13:12 cpu.rt_runtime_us -rw-r--r-- 1 root root 0 Apr 29 13:08 cpu.shares ...
- 查看其中cpu.shares文件的內(nèi)容,發(fā)現(xiàn)它保存的就是--cpu-shares選項(xiàng)的配置(512):
[root@docker-2322030238 ~]# cat /sys/fs/cgroup/cpu/docker/b8a03a3887f1f.../cpu.shares 512
- 類(lèi)似,查看/sys/fs/cgroup/memory/docker目錄中的內(nèi)存Cgroup配置,發(fā)現(xiàn)memory.limit_in_bytes文件保存的就是-m選項(xiàng)的配置,本例設(shè)300MB,用字節(jié)表示為314572800:
[root@docker ~]# cat /sys/fs/cgroup/memory/docker/b8a03a3887f1f.../memory.limit_in_bytes 314572800
5.2、動(dòng)態(tài)更改容器的資源限制
docker update命令可以動(dòng)態(tài)地更新容器配置,其語(yǔ)法:
docker update [選項(xiàng)] 容器 [容器...]
啟動(dòng)一個(gè)限制資源的容器后,再修改其資源限制:
[root@docker ~]# docker run --rm -d -p 8080:80 -m 300M --cpu-shares=512 httpd 29d3cb1392b8e... [root@docker ~]# docker update -m 500M --cpu-shares=10245 29d3 29d3
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在CentOS 7 上為docker配置端口轉(zhuǎn)發(fā)以兼容firewall的解決方法
這篇文章主要介紹了在CentOS 7 上為docker配置端口轉(zhuǎn)發(fā)以兼容firewall的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Docker搭建一個(gè)nginx服務(wù)的實(shí)現(xiàn)
Nginx是一個(gè)高性能的HTTP和反向代理web服務(wù)器,同時(shí)也提供了IMAP/POP3/SMTP服務(wù),本文主要介紹了Docker搭建一個(gè)nginx服務(wù)的實(shí)現(xiàn),感興趣的可以了解一下2024-08-08
docker安裝sentinel的實(shí)現(xiàn)示例
本文主要介紹了docker安裝sentinel的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12
Linux環(huán)境下安裝docker環(huán)境(親測(cè)無(wú)坑)
大家好,本篇文章主要講的是Linux環(huán)境下安裝docker環(huán)境(親測(cè)無(wú)坑),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下2021-12-12
Docker部署SpringBoot應(yīng)用的實(shí)現(xiàn)步驟
本文主要介紹了Docker部署SpringBoot應(yīng)用,Docker可以巧妙的解決函數(shù)庫(kù)、依賴(lài)沖突問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下2021-11-11
Docker學(xué)習(xí)之?dāng)?shù)據(jù)卷和Dockerfile詳解
在容器化應(yīng)用的開(kāi)發(fā)和部署過(guò)程中,數(shù)據(jù)的持久化和共享是一個(gè)重要的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Docker學(xué)習(xí)之?dāng)?shù)據(jù)卷和Dockerfile的相關(guān)資料,需要的朋友可以參考下2024-04-04
Docker?40個(gè)實(shí)用的自動(dòng)化管理腳本
如果你最近在學(xué)習(xí)或者使用現(xiàn)代軟件開(kāi)發(fā)技術(shù),Docker和Kubernetes這兩個(gè)詞一定頻頻出現(xiàn)在你的視線(xiàn)中,這篇文章主要介紹了Docker?40個(gè)實(shí)用的自動(dòng)化管理腳本的相關(guān)資料,需要的朋友可以參考下2025-12-12
docker中的volume和bind?mount區(qū)別講解
這篇文章主要介紹了docker的volume和bind?mount區(qū)別,介紹了volume?相對(duì)于bind?mount的優(yōu)點(diǎn)及volume操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08

