Docker的資源配額(cgroup)
什么是cgroup?
cgroup全稱是control groups
cgroup是linux內(nèi)核中的機(jī)制,這個(gè)機(jī)制可以根據(jù)特定的行為把一系列的任務(wù),子任務(wù)整合或者分離,按照資源劃分的等級的不同,從而實(shí)現(xiàn)資源統(tǒng)一控制的框架,cgoup可以控制、限制、隔離進(jìn)程所需的物理資源,包括cpu、內(nèi)存、IO,為容器虛擬化提供了支持,是構(gòu)建docker一系列虛擬化的管理工具。
control groups:控制組,被整合在了linux內(nèi)核當(dāng)中,把進(jìn)程(tasks)放到組里面,對組設(shè)置權(quán)限,對進(jìn)程進(jìn)行控制??梢岳斫鉃橛脩艉徒M的概念,用戶會繼承它所在組的權(quán)限。
cgroup作用?
cgroup和namespace類似,也是講進(jìn)程分組,但是目的與namespace不一樣,namespace是為了隔離進(jìn)程組之前的資源,而cgroup是為了對一組進(jìn)程進(jìn)行統(tǒng)一的資源控制。
- 限制進(jìn)程組可以使用的資源數(shù)量(Resource limiting )。比如:memory子系統(tǒng)可以為進(jìn)程組設(shè)定一個(gè)memory使用上限,一旦進(jìn)程組使用的內(nèi)存達(dá)到限額再申請內(nèi)存,就會觸發(fā)OOM(out of memory)。
- 進(jìn)程組的優(yōu)先級控制(Prioritization )。比如:可以使用cpu子系統(tǒng)為某個(gè)進(jìn)程組分配特定cpu share。
- 記錄進(jìn)程組使用的資源數(shù)量(Accounting )。比如:可以使用cpuacct子系統(tǒng)記錄某個(gè)進(jìn)程組使用的cpu時(shí)間。
- 進(jìn)程組隔離(Isolation)。比如:使用ns子系統(tǒng)可以使不同的進(jìn)程組使用不同的namespace,以達(dá)到隔離的目的,不同的進(jìn)程組有各自的進(jìn)程、網(wǎng)絡(luò)、文件系統(tǒng)掛載空間。
- 進(jìn)程組控制(Control)。比如:使用freezer子系統(tǒng)可以將進(jìn)程組掛起和恢復(fù)。
cgroup子系統(tǒng)
這些具體的資源管理功能稱為Cgroup子系統(tǒng),有以下幾大子系統(tǒng)實(shí)現(xiàn):
Cgroup子系統(tǒng) | 作用 |
---|---|
blkio | 設(shè)置限制每個(gè)塊設(shè)備的輸入輸出控制,例如:磁盤、光盤、usb等等 |
CPU | 使用調(diào)度程序?yàn)閏group任務(wù)提供CPU的訪問 |
cpuacct | 產(chǎn)生cgroup任務(wù)的CPU資源報(bào)告 |
cpuset | 如果是多核心的CPU,這個(gè)子系統(tǒng)會為cgroup任務(wù)分配單獨(dú)的CPU和內(nèi)存 |
devices | 允許或拒絕cgroup任務(wù)對設(shè)備的訪問 |
freezer | 暫停和恢復(fù)cgroup任務(wù) |
memory | 設(shè)置每個(gè)cgroup的內(nèi)存限制以及產(chǎn)生內(nèi)存資源報(bào)告 |
net_cls | 標(biāo)記每個(gè)網(wǎng)絡(luò)包以供cgroup方便使用 |
ns | 命名空間子系統(tǒng) |
perf_event | 增加了對每個(gè)group的檢測跟蹤能力,可以檢測屬于某個(gè)特定的group的所有線程以及運(yùn)行在特定CPU上的線程 |
前言
默認(rèn)情況下,容器時(shí)沒有資源限制的,會盡可能的使用宿主機(jī)的資源,但是宿主機(jī)并不是所有資源都可以給,所以就需要對docker的容器進(jìn)行一定的限制,這就用到了linux自帶的cgroup來支持。
一、CPU的資源配額
1、CPU周期限制
默認(rèn)情況下,每個(gè)容器對主機(jī)CPU周期的訪問時(shí)無線的。您可以設(shè)置各種約束來限制給定容器對主機(jī)CPU周期的訪問。大多數(shù)用戶將使用和配置默認(rèn)CFS調(diào)度程序。
2、配置默認(rèn)的cfs調(diào)度程序
CFS是用于正常Linux進(jìn)程的Linux內(nèi)核CPU調(diào)度程序。幾個(gè)運(yùn)行時(shí)標(biāo)志允許您配置容器對CPU資源的訪問量。使用這些設(shè)置時(shí),Docker將修改主機(jī)上容器的cgroup設(shè)置。
選項(xiàng) | 描述 |
---|---|
–cpus= | 指定容器可以使用多少可用CPU資源。例如,如果主機(jī)有兩個(gè)CPU,并且您設(shè)置了–cpus =“1.5”,那么該容器將保證最多可以訪問一個(gè)半的CPU。這相當(dāng)于設(shè)置–cpu-period =“100000”和–cpu-quota =“150000”。在Docker 1.13和更高版本中可用。 |
–cpu-period= | 指定CPU CFS調(diào)度程序周期,該周期與–cpu-quota一起使用。默認(rèn)為100000微妙,以微秒表示。大多數(shù)用戶不會從默認(rèn)值更改此設(shè)置。如果您使用Docker 1.13或更高版本,請改用–cpus。 |
–cpu-quota= | 在容器上添加CPU CFS配額。每個(gè)–cpu-period允許CPU訪問的容器數(shù)微秒數(shù)。換句話說,cpu-quota / cpu-period。如果您使用Docker 1.13或更高版本,請改用–cpus。 |
–cpuset-cpus | 限制容器可以使用的特定CPU或核心。如果您有多個(gè)CPU,則容器可以使用的逗號分隔列表或連字符分隔的CPU范圍。第一個(gè)CPU編號為0.有效值可能為0-3(使用第一,第二,第三和第四個(gè)CPU)或1,3(使用第二個(gè)和第四個(gè)CPU)。 |
–cpu-shares | 將此標(biāo)志設(shè)置為大于或小于默認(rèn)值1024的值,以增加或減少容器的重量,并使其能夠訪問主機(jī)CPU周期的更大或更小比例。這僅在CPU周期受到限制時(shí)才會執(zhí)行。當(dāng)大量CPU周期可用時(shí),所有容器都使用盡可能多的CPU。這樣,這是一個(gè)軟限制。–cpu-shares不會阻止容器在群集模式下進(jìn)行調(diào)度。它優(yōu)先考慮容器CPU資源的可用CPU周期。它不保證或保留任何特定的CPU訪問權(quán)限。 |
1.查看CPU的資源限制
命令格式:
cat /sys/fs/cgroup/cpu/docker/[容器ID]/cpu.cfs_quota_us
例:
[root@docker ~]# docker run -itd --name test2 centos:7 /bin/bash
2964d084535d0670cdf79233a0d2e2a99620d1f0c93854ac8ca73944d4affd5e
[root@docker ~]# cat /sys/fs/cgroup/cpu/docker/2964d084535d0670cdf79233a0d2e2a99620d1f0c93854ac8ca73944d4affd5e/cpu.cfs_quota_us
-1
'//-1代表不進(jìn)行任何限制'
--
2.手動修改文件以實(shí)現(xiàn)修改CPU限制
[root@docker ~]# echo 20000 > /sys/fs/cgroup/cpu/docker/2964d084535d0670cdf79233a0d2e2a99620d1f0c93854ac8ca73944d4affd5e/cpu.cfs_quota_us
[root@docker ~]# cat /sys/fs/cgroup/cpu/docker/2964d084535d0670cdf79233a0d2e2a99620d1f0c93854ac8ca73944d4affd5e/cpu.cfs_quota_us
20000
--
3.在運(yùn)行容器的同時(shí)指定CPU限制條件
'以下這兩個(gè)參數(shù)一般聯(lián)合使用,控制容器可以分配到的CPU時(shí)鐘周期'
'--cpu-period是用來指定容器對CPU的使用要在多長時(shí)間內(nèi)做一次重新分配'
'--cpu-quota是用來指定在這個(gè)周期內(nèi),最多可以有多少時(shí)間來跑這個(gè)容器'
//創(chuàng)建容器是定義cpu配額
docker run -itd --name test1 --cpu-period=200000 --cpu-quota=100000 centos:7 /bin/bash
docker exec -it test1 /bin/bash
yum -y install epel-release && yum -y install stress
3、多任務(wù)比例分享CPU
當(dāng)有多個(gè)容器任務(wù)同時(shí)運(yùn)行時(shí),很難計(jì)算 CPU 的使用率,我們可以設(shè)置 CPU 按照比例共享 CPU 資源,以實(shí)現(xiàn)使用率的動態(tài)調(diào)整
docker run -itd --name cpu1 --cpu-shares 1024 centos:7 /bin/bash
yum -y install epel-release
yum -y install stress
stress -c 10 &
docker exec -it *** bash
top '//查看CPU使用率'
--新開一個(gè)終端--
步驟和第一個(gè)類似到那時(shí)
docker run -itd --name test3 --cpu-shares 2048 centos:7 /bin/bash
'//對比CPU使用率,是1:2'
使用【–cpu-shares】,分配兩個(gè)容器使用CPU資源占用權(quán)重為1:2
- 默認(rèn)情況下,每個(gè)Docker容器的CPU份額都是1024,單獨(dú)一個(gè)容器的份額是沒有意義的,只有在同時(shí)運(yùn)行多個(gè)容器時(shí),容器CPU的加權(quán)效果才能體現(xiàn)出來
- 比如以上的兩個(gè)容器是1:2,在CPU進(jìn)行時(shí)間片分配時(shí),后者比前者多一倍的機(jī)會獲得CPU的時(shí)間片,但是分配的結(jié)果取決于當(dāng)時(shí)主機(jī)和其他容器的運(yùn)行狀態(tài)
- 實(shí)際上也無法保證該容器一定獲得相應(yīng)的CPU時(shí)間片,因?yàn)槿羰窃摰倪M(jìn)程一直是空閑的,那么cpu1就可以獲取比cpu2更多的CPU時(shí)間片
- 在極端情況下,例如主機(jī)上只運(yùn)行了一個(gè)容器,即使它的CPU份額較小,也是可以獨(dú)占整個(gè)主機(jī)的CPU資源的
- Cgroups只在容器分配的資源緊缺時(shí),即在需要對容器使用的資源進(jìn)行限制時(shí),才會生效,因此,無法根據(jù)某個(gè)容器的CPU份額來確定有多少CPU資源分給給它
- 即資源分配的結(jié)果取決于同時(shí)運(yùn)行的其他容器CPU分配和容器中進(jìn)程的運(yùn)行情況
4、限制CPU內(nèi)核使用
可以通過配置,使得某些程序獨(dú)享 CPU 內(nèi)核,以提高其處理速度
cat /sys/fs/cgroup/cpuset/docker/1da3b339530f1e256ff0206abb977659da494242b54c1fbeefc4b16ec0c49823/cpuset.cpus
docker run -itd --name test1 --cpuset-cpus 1 centos:7
docker exec -it test1 /bin/bash
yum -y install epel-release && yum -y install stress
stress -c 2 &
//在宿主機(jī)中
top//查看各個(gè)核心的使用情況
二、內(nèi)存使用的限制
'與操作系統(tǒng)類似,容器可使用的內(nèi)存包括兩部分:物理內(nèi)存和 Swap'
'-m 或 --memory:設(shè)置內(nèi)存的使用限額'
'--memory-swap:設(shè)置內(nèi)存+swap 的使用限額'
--
docker run -itd -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
'//--vm 1:啟動1個(gè)內(nèi)存工作線程'
'//--vm-bytes 280M:每個(gè)線程分配280M內(nèi)存'
--
'相應(yīng)的Cgroup配置文件:/sys/fs/cgroup/memory/memory.limit_in_bytes'
docker run -itd -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
'//如果讓工作線程分配的內(nèi)存超過300M,分配的內(nèi)存超過了限額,stress線程會報(bào)錯(cuò),容器退出'
--
'注意!一旦容器Cgroup使用的內(nèi)存超過了限制的容量,Linux內(nèi)核就會嘗試收回這些內(nèi)存'
'如果仍舊無法控制內(nèi)存使用在這個(gè)設(shè)置的范圍之內(nèi),就會殺死該進(jìn)程!'
docker run -itd --name test1 -m 200m centos:7 /bin/bash
docker stats
虛擬機(jī)沒配置swap分區(qū)所以無法對swap實(shí)現(xiàn)限制。
三、磁盤使用的限制
對讀寫進(jìn)行限制
bps:byte per second(每秒讀寫的字節(jié)數(shù))
iops:io per second(每秒IO的次數(shù))
--
1.限制某個(gè)程序?qū)懭氲腷ps數(shù)據(jù)量
docker run -d --device-write-bps /dev/sda:30M centos:7
2.限制讀取某個(gè)程序的bps數(shù)據(jù)量
docker run -d --device-read-bps /dev/sda:30M centos:7
3.限制讀取某個(gè)程序的iops次數(shù)
--device-read-iops
4.限制寫入某個(gè)程序的iops次數(shù)
--device-write-iops
對讀寫進(jìn)行權(quán)重進(jìn)行限制
- 默認(rèn)情況下,所有容器能平等地讀寫磁盤,可以通過設(shè)置–blkio-weight參數(shù)來改變?nèi)萜?block IO的優(yōu)先級。
- –blkio-weight 與–cpu-shares類似,設(shè)置的是相對權(quán)重值,默認(rèn)為500。
docker run -it --name test1 --blkio-weight 600 centos:1
cat /sys/fs/cgroup/blkio/blkio.weight
docker run -it --name test2 --blkio-weight 300 centos:1
cat /sys/fs/cgroup/blkio/blkio.weight
test1容器:
docker exec -it test1 /bin/bash
yum -y install epel-release && yum -y install stress
stress --hdd 2 --hdd-bytes 10G --backoff 2000000
//對磁盤開啟兩個(gè)io進(jìn)程,讀寫大小為10G ,新fork 出來的進(jìn)程 sleep 2000000 微秒再開始運(yùn)行。
test2容器:
docker exec -it test1 /bin/bash
yum -y install epel-release && yum -y install stress
stress --hdd 2 --hdd-bytes 10G --backoff 2000000
//對磁盤開啟兩個(gè)io進(jìn)程,讀寫大小為10G ,新fork 出來的進(jìn)程 sleep 2000000 微秒再開始運(yùn)行。
宿主機(jī):
docker stats
秒再開始運(yùn)行。
test2容器:
docker exec -it test1 /bin/bash
yum -y install epel-release && yum -y install stress
stress --hdd 2 --hdd-bytes 10G --backoff 2000000
//對磁盤開啟兩個(gè)io進(jìn)程,讀寫大小為10G ,新fork 出來的進(jìn)程 sleep 2000000 微秒再開始運(yùn)行。文章來源:http://www.zghlxwxcb.cn/news/detail-470772.html
宿主機(jī):
docker stats文章來源地址http://www.zghlxwxcb.cn/news/detail-470772.html

到了這里,關(guān)于Docker的資源配額的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!