Docker資源限制

默認(rèn)情況下,一個(gè)容器并沒(méi)有資源限制,并且該容器可以使用內(nèi)核調(diào)度的所有資源。Docke提供了在啟動(dòng)容器時(shí)設(shè)置一些參數(shù)來(lái)控制該容器使用的內(nèi)存、CPU和block IO。

銅川網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司2013年開(kāi)創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。

真正可以控制的只有內(nèi)存和CPU。。

內(nèi)存

內(nèi)存是不可壓縮資源

OOME

在Linxu系統(tǒng)中,如果內(nèi)核探測(cè)到宿主機(jī)沒(méi)有足夠的內(nèi)存來(lái)調(diào)用執(zhí)行系統(tǒng)的某些重要功能的時(shí)候,那么會(huì)拋出一個(gè)OOME(Out Of Memory Exception:內(nèi)存異常)殺死某些進(jìn)程,以此來(lái)釋放內(nèi)存。
一旦發(fā)生OOME,任何進(jìn)程都有可能被殺死,包括docker daemon在內(nèi)。為此,Docker特地調(diào)整了docker daemon的OOM優(yōu)先級(jí),防止其被殺死,但是容器的優(yōu)先級(jí)沒(méi)有被調(diào)整。在內(nèi)存不足時(shí),內(nèi)核會(huì)根據(jù)自己的調(diào)度算法,為每個(gè)進(jìn)程得出一個(gè)評(píng)分,然后殺死分?jǐn)?shù)最高的進(jìn)程來(lái)釋放內(nèi)存。
可以在docker run的時(shí)候指定--oom-score-adj參數(shù)(默認(rèn)為0)。這個(gè)是容器被殺死的優(yōu)先級(jí),會(huì)影響評(píng)分,值越大越容易被殺死。這個(gè)參數(shù)只是影響最終的評(píng)分,優(yōu)先殺死進(jìn)程是看評(píng)分,參數(shù)小的可能計(jì)算后分?jǐn)?shù)仍然最高,依然會(huì)被優(yōu)先殺掉。
可以指定–oom-kill-disable=true參數(shù),指定一些特定的重要的容器禁止被OOM殺掉。

--oom-kill-disable               Disable OOM Killer
--oom-score-adj int              Tune host's OOM preferences (-1000 to 1000)

內(nèi)存限制

選項(xiàng)描述
-m,--memory 內(nèi)存限制,格式是數(shù)字加單位,單位可以為 b,k,m,g。最小為4M
--memory-swap 內(nèi)存+交換分區(qū)大小總限制。格式同上。必須比-m設(shè)置的大
--memory-swappiness 默認(rèn)情況下,主機(jī)可以把容器使用的匿名頁(yè)(anonymous page)swap 出來(lái),你可以設(shè)置一個(gè) 0-100 之間的值,代表允許 swap 出來(lái)的比例
--memory-reservation 設(shè)置一個(gè)內(nèi)存使用的 soft limit,如果 docker 發(fā)現(xiàn)主機(jī)內(nèi)存不足,會(huì)執(zhí)行 OOM 操作。這個(gè)值必須小于 --memory 設(shè)置的值
--kernel-memory 容器能夠使用的 kernel memory 大小,最小值為 4m
--oom-kill-disable 是否運(yùn)行 OOM 的時(shí)候殺死容器。只有設(shè)置了 -m,才可以把這個(gè)選項(xiàng)設(shè)置為 false,否則容器會(huì)耗盡主機(jī)內(nèi)存,而且導(dǎo)致主機(jī)應(yīng)用被殺死

--memory-swap參數(shù)
這個(gè)參數(shù)要結(jié)合-m一起生效,表格中的描述比較簡(jiǎn)單,是一般的用法。
一般用法:比-m大,內(nèi)存+交換分區(qū)大小總限制
禁用swap:和-m一樣大,這樣--memory和--memory-swap的限制是一樣大,可用的swap資源為0,相當(dāng)于禁用。
默認(rèn)設(shè)置:設(shè)置為0或者不設(shè)置,如果主機(jī)(Docker Host)啟用了swap,則容器可用的swap為內(nèi)存限制的2倍。
無(wú)限制:設(shè)置為-1,如果主機(jī)(Docker Host)啟用了swap,則容器可使用宿主機(jī)所有的swap資源。

在容器內(nèi)使用free命令,看到的swap空間沒(méi)有體現(xiàn)出上面這些限制,沒(méi)有參考價(jià)值。

CPU

CPU是可壓縮資源。

默認(rèn)情況下,每一個(gè)容器可以使用宿主機(jī)上的所有cpu資源。大多數(shù)系統(tǒng)使用的資源調(diào)度算法是CFS(完全公平調(diào)度器),它公平調(diào)度每一個(gè)工作進(jìn)程。進(jìn)程可以分2類:CPU密集型(低優(yōu)先級(jí))和IO密集型(高優(yōu)先級(jí))。系統(tǒng)內(nèi)核實(shí)時(shí)監(jiān)測(cè)系統(tǒng)進(jìn)程,當(dāng)某個(gè)進(jìn)程占用cpu資源時(shí)間過(guò)長(zhǎng)時(shí),內(nèi)核會(huì)調(diào)整該進(jìn)程的優(yōu)先級(jí)。
docker 1.13 之后還支持realtime調(diào)度。

有如下的3種CPU資源分配策略:

  1. 按壓縮方式比例分配
  2. 限定最多只能幾個(gè)核
  3. 限定只能使用哪個(gè)或哪幾個(gè)核
選項(xiàng)描述
-c, --cpu-shares int cpu資源提供給一組容器使用,組內(nèi)的容器按比例使用cpu資源,當(dāng)容器處于空閑狀態(tài)時(shí),cpu資源被負(fù)載大的容器占用,(按壓縮方式比例分配),當(dāng)空閑進(jìn)行運(yùn)行起來(lái)時(shí),cpu資源會(huì)被分配到其他容器
--cpus decimal 指定 cpu的核心數(shù)量,這種方式直接限定了容器可用的cpu資源
--cpuset-cpus string 指定容器只能運(yùn)行在哪個(gè)cpu核心上(綁定cpu);核心使用0,1,2,3編號(hào)

CPU Share

docker 為容器設(shè)置 CPU share 的參數(shù)是 -c, --cpu-shares,它的值是一個(gè)整數(shù)。

docker 允許用戶為每個(gè)容器設(shè)置一個(gè)數(shù)字,代表容器的 CPU share,默認(rèn)情況下每個(gè)容器的 share 是 1024。當(dāng)主機(jī)上有多個(gè)容器運(yùn)行時(shí),每個(gè)容器占用的 CPU 時(shí)間比例為它的 share 在總額中的比例。舉個(gè)例子,如果主機(jī)上有兩個(gè)一直使用 CPU 的容器(為了簡(jiǎn)化理解,不考慮主機(jī)上其他進(jìn)程),其 CPU share 都是 1024,那么兩個(gè)容器 CPU 使用率都是 50%;如果把其中一個(gè)容器的 share 設(shè)置為 512,那么兩者 CPU 的使用率分別為 67% 和 33%;如果刪除 share 為 1024 的容器,剩下來(lái)容器的 CPU 使用率將會(huì)是 100%。

總結(jié)下來(lái),這種情況下,docker 會(huì)根據(jù)主機(jī)上運(yùn)行的容器和進(jìn)程動(dòng)態(tài)調(diào)整每個(gè)容器使用 CPU 的時(shí)間比例。這樣的好處是能保證 CPU 盡可能處于運(yùn)行狀態(tài),充分利用 CPU 資源,而且保證所有容器的相對(duì)公平;缺點(diǎn)是無(wú)法指定容器使用 CPU 的確定值。

CPU 核數(shù)

從 1.13 版本之后,docker 提供了 --cpus 參數(shù)可以限定容器能使用的 CPU 核數(shù)。這個(gè)功能可以讓我們更精確地設(shè)置容器 CPU 使用量,是一種更容易理解也因此更常用的手段。

--cpus 后面跟著一個(gè)浮點(diǎn)數(shù),代表容器最多使用的核數(shù),可以精確到小數(shù)點(diǎn)二位,也就是說(shuō)容器最小可以使用 0.01 核 CPU。比如,我們可以限制容器只能使用 1.5 核數(shù) CPU。

如果設(shè)置的 --cpus 值大于主機(jī)的 CPU 核數(shù),docker 會(huì)直接報(bào)錯(cuò)。
如果多個(gè)容器都設(shè)置了 --cpus,并且它們之和超過(guò)主機(jī)的 CPU 核數(shù),并不會(huì)導(dǎo)致容器失敗或者退出,這些容器之間會(huì)競(jìng)爭(zhēng)使用 CPU,具體分配的 CPU 數(shù)量取決于主機(jī)運(yùn)行情況和容器的 CPU share 值。也就是說(shuō) --cpus 只能保證在 CPU 資源充足的情況下容器最多能使用的 CPU 數(shù),docker 并不能保證在任何情況下容器都能使用這么多的 CPU(因?yàn)檫@根本是不可能的)。

CPU 指定核心

Docker 允許調(diào)度的時(shí)候限定容器運(yùn)行在哪個(gè) CPU 上。可以通過(guò) --cpuset-cpus 參數(shù)讓容器只運(yùn)行在某個(gè)或某幾個(gè)核上。

--cpuset-cpus、-cpus 參數(shù)可以和 -c, --cpu-shares 一起使用,限制容器只能運(yùn)行在某些 CPU 核上,并且配置了使用率。

限制容器運(yùn)行在哪些核上并不是一個(gè)很好的做法,因?yàn)樗枰孪戎乐鳈C(jī)上有多少 CPU 核,而且非常不靈活。除非有特別的需求,一般并不推薦在生產(chǎn)中這樣使用。

其他CPU參數(shù)

選項(xiàng)描述
--cpu-period int 指定CFS調(diào)度的周期,一般與--cpu-quota一起使用。默認(rèn)情況下周期為1 秒,以微秒為單位表示,一般使用默認(rèn)值。1.13或者更高版本推薦使用 --cpus 標(biāo)志代替。
--cpu-quota int 在CFS調(diào)度中容器一個(gè)周期的cpu時(shí)間配額,即每個(gè)--cpu-period周期容器可獲得的cpu時(shí)間(微秒),cpu-quota/cpu-period。1.13或者更高版本推薦使用 --cpus 標(biāo)志代替。

壓力測(cè)試

資源限制的演示

查詢宿主機(jī)上的資源

這里用了lscpu和free命令:

[root@Docker ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Model name:            Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz
Stepping:              3
CPU MHz:               3999.996
BogoMIPS:              7999.99
Hypervisor vendor:     Microsoft
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm ssbd ibrs ibpb stibp fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt spec_ctrl intel_stibp flush_l1d
[root@Docker ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           936M        260M        340M        6.7M        334M        592M
Swap:          1.6G          0B        1.6G
[root@Docker ~]# 

下載鏡像

可以在docker hub上搜索stress(壓測(cè))。
下載鏡像,運(yùn)行查看幫助:

[root@Docker ~]# docker pull lorel/docker-stress-ng
[root@Docker ~]# docker run -it --rm lorel/docker-stress-ng
stress-ng, version 0.03.11

Usage: stress-ng [OPTION [ARG]]
 --h,  --help             show help
......省略......
Example: stress-ng --cpu 8 --io 4 --vm 2 --vm-bytes 128M --fork 4 --timeout 10s

Note: Sizes can be suffixed with B,K,M,G and times with s,m,h,d,y
[root@Docker ~]# 

主要命令參數(shù):

  • --h, --help: 默認(rèn)啟動(dòng)容器就是這個(gè)命令參數(shù)
  • -c N, --cpu N: 啟動(dòng)N個(gè)子進(jìn)程對(duì)CPU進(jìn)行壓測(cè)
  • -m N, --vm N: 啟動(dòng)N個(gè)進(jìn)程對(duì)內(nèi)存進(jìn)行壓測(cè)
  • --vm-bytes N: 每個(gè)子進(jìn)程使用多少內(nèi)存(默認(rèn)256MB)

測(cè)試內(nèi)存限制

查看lorel/docker-stress-ng里內(nèi)存相關(guān)的參數(shù)說(shuō)明:

 -m N, --vm N             start N workers spinning on anonymous mmap
       --vm-bytes N       allocate N bytes per vm worker (default 256MB)

默認(rèn)每個(gè)worker是256MB的內(nèi)存,這個(gè)保持默認(rèn)。然后指定--vm,開(kāi)啟2個(gè)worker,并且限制容器的內(nèi)存只能使用256MB,啟動(dòng)容器:

[root@Docker ~]# docker run --name stress1 -it --rm -m 256m lorel/docker-stress-ng --vm 2
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 2 vm

這個(gè)終端已經(jīng)被占用了,另起一個(gè)終端使用docker top命令查看容器內(nèi)部正在運(yùn)行的進(jìn)程:

[root@Docker ~]# docker top stress1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                5922                5907                0                   21:06               pts/0               00:00:00            /usr/bin/stress-ng --vm 2
root                6044                5922                0                   21:06               pts/0               00:00:00            /usr/bin/stress-ng --vm 2
root                6045                5922                0                   21:06               pts/0               00:00:00            /usr/bin/stress-ng --vm 2
root                6086                6044                13                  21:06               pts/0               00:00:00            /usr/bin/stress-ng --vm 2
root                6097                6045                47                  21:06               pts/0               00:00:00            /usr/bin/stress-ng --vm 2
[root@Docker ~]# 

這里可以看一下PID和PPID,這里一共5個(gè)進(jìn)程,一個(gè)父進(jìn)程創(chuàng)建了2個(gè)子進(jìn)程,這2個(gè)子進(jìn)程又分別各創(chuàng)建了一個(gè)進(jìn)程。

另外還可以使用命令docker stats查看容器的資源實(shí)時(shí)使用的情況:

$ docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
626f38c4a4ad        stress1             18.23%              256MiB / 256MiB     100.00%             656B / 0B           17.7MB / 9.42GB     5

這個(gè)是實(shí)時(shí)刷新的。

測(cè)試CPU限制

限制容器最大只能使用2核,然后同時(shí)開(kāi)啟8個(gè)CPU進(jìn)行壓測(cè),使用下面的命令:

docker run -it --rm --cpus 2 lorel/docker-stress-ng --cpu 8

限制只用0.5核,開(kāi)啟4個(gè)CPU進(jìn)行壓測(cè):

[root@Docker ~]# docker run --name stress2 -it --rm --cpus 0.5 lorel/docker-stress-ng --cpu 4
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 4 cpu

另起一個(gè)終端使用docker top命令查看容器內(nèi)部正在運(yùn)行的進(jìn)程:

[root@Docker ~]# docker top stress2
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                7198                7184                0                   22:35               pts/0               00:00:00            /usr/bin/stress-ng --cpu 4
root                7230                7198                12                  22:35               pts/0               00:00:02            /usr/bin/stress-ng --cpu 4
root                7231                7198                12                  22:35               pts/0               00:00:02            /usr/bin/stress-ng --cpu 4
root                7232                7198                12                  22:35               pts/0               00:00:02            /usr/bin/stress-ng --cpu 4
root                7233                7198                12                  22:35               pts/0               00:00:02            /usr/bin/stress-ng --cpu 4
[root@Docker ~]# 

一個(gè)父進(jìn)程,創(chuàng)建了4個(gè)子進(jìn)程。
然后再用docker stats命令查看資源占用:

$ docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
14a341dd23d1        stress2             50.02%              13.75MiB / 908.2MiB   1.51%               656B / 0B           0B / 0B             5

因?yàn)橄拗屏?.5核,所以基本不會(huì)超過(guò)50%。

測(cè)試 CPU Share

開(kāi)啟3個(gè)容器,分別指定不同的--cpu-shares參數(shù),不指定的話默認(rèn)是1024:

[root@Docker ~]# docker run --name stress3.1 -itd --rm --cpu-shares 512 lorel/docker-stress-ng --cpu 4
800d756f76ca4cf20af9fa726349f25e29bc57028e3a1cb738906a68a87dcec4
[root@Docker ~]# docker run --name stress3.2 -itd --rm lorel/docker-stress-ng --cpu 4
4b88007191812b239592373f7de837c25f795877d314ae57943b5410074c6049
[root@Docker ~]# docker run --name stress3.3 -itd --rm --cpu-shares 2048 lorel/docker-stress-ng --cpu 4
8f103395b6ac93d337594fdd1db289b6462e01c3a208dcd3788332458ec03b98
[root@Docker ~]#

查看3個(gè)容器的CPU占用率:

$ docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
800d756f76ca        stress3.1           14.18%              14.53MiB / 908.2MiB   1.60%               656B / 0B           0B / 0B             5
4b8800719181        stress3.2           28.60%              15.78MiB / 908.2MiB   1.74%               656B / 0B           0B / 0B             5
8f103395b6ac        stress3.3           56.84%              15.38MiB / 908.2MiB   1.69%               656B / 0B           0B / 0B             5

占用率基本就是1/2/4,符合期望。

網(wǎng)站欄目:Docker資源限制
文章URL:http://bm7419.com/article28/jjsscp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作虛擬主機(jī)、網(wǎng)站設(shè)計(jì)、自適應(yīng)網(wǎng)站、網(wǎng)站導(dǎo)航Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)