真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

docker容器資源配額怎么控制

本篇內(nèi)容主要講解“docker容器資源配額怎么控制”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“docker容器資源配額怎么控制”吧!

創(chuàng)新互聯(lián)長期為上千多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為陽西企業(yè)提供專業(yè)的網(wǎng)站設(shè)計制作、成都網(wǎng)站制作,陽西網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

docker通過cgroup來控制容器使用的資源配額,包括cpu、內(nèi)存、磁盤三大方面,基本覆蓋了常見的資源配額和使用量控制。

cgroup簡介

cgroup是control groups的縮寫,是linux 內(nèi)核提供的一種可以限制、記錄、隔離進(jìn)程組所使用的物理資源(如 cpu、memory、磁盤io等等) 的機(jī)制,被lxc、docker等很多項目用于實現(xiàn)進(jìn)程資源控制。cgroup將任意進(jìn)程進(jìn)行分組化管理的 linux 內(nèi)核功能。cgroup本身是提供將進(jìn)程進(jìn)行分組化管理的功能和接口的基礎(chǔ)結(jié)構(gòu),i/o 或內(nèi)存的分配控制等具體的資源管理功能是通過這個功能來實現(xiàn)的。這些具體的資源管理功能稱為cgroup子系統(tǒng),有以下幾大子系統(tǒng)實現(xiàn):

  1. blkio:設(shè)置限制每個塊設(shè)備的輸入輸出控制。例如:磁盤,光盤以及usb等等。

  2. cpu:使用調(diào)度程序為cgroup任務(wù)提供cpu的訪問。

  3. cpuacct:產(chǎn)生cgroup任務(wù)的cpu資源報告。

  4. cpuset:如果是多核心的cpu,這個子系統(tǒng)會為cgroup任務(wù)分配單獨的cpu和內(nèi)存。

  5. devices:允許或拒絕cgroup任務(wù)對設(shè)備的訪問。

  6. freezer:暫停和恢復(fù)cgroup任務(wù)。

  7. memory:設(shè)置每個cgroup的內(nèi)存限制以及產(chǎn)生內(nèi)存資源報告。

  8. net_cls:標(biāo)記每個網(wǎng)絡(luò)包以供cgroup方便使用。

  9. ns:命名空間子系統(tǒng)。

  10. perf_event:增加了對每group的監(jiān)測跟蹤的能力,即可以監(jiān)測屬于某個特定的group的所有線程以及運(yùn)行在特定cpu上的線程。

目前docker只是用了其中一部分子系統(tǒng),實現(xiàn)對資源配額和使用的控制。

可以使用stress工具來測試cpu和內(nèi)存。使用下面的dockerfile來創(chuàng)建一個基于ubuntu的stress工具鏡像。

from ubuntu:14.04
run apt-get update &&apt-get install stress

cpu資源配額控制

cpu份額控制

docker提供了–cpu-shares參數(shù),在創(chuàng)建容器時指定容器所使用的cpu份額值。使用示例:

使用命令docker run -tid –cpu-shares 100 ubuntu:stress,創(chuàng)建容器,則最終生成的cgroup的cpu份額配置可以下面的文件中找到:

root@ubuntu:~# cat /sys/fs/cgroup/cpu/docker/<容器的完整長id>/cpu.shares
100

cpu-shares的值不能保證可以獲得1個vcpu或者多少ghz的cpu資源,僅僅只是一個彈性的加權(quán)值。

默認(rèn)情況下,每個docker容器的cpu份額都是1024。單獨一個容器的份額是沒有意義的,只有在同時運(yùn)行多個容器時,容器的cpu加權(quán)的效果才能體現(xiàn)出來。例如,兩個容器a、b的cpu份額分別為1000和500,在cpu進(jìn)行時間片分配的時候,容器a比容器b多一倍的機(jī)會獲得cpu的時間片,但分配的結(jié)果取決于當(dāng)時主機(jī)和其他容器的運(yùn)行狀態(tài),實際上也無法保證容器a一定能獲得cpu時間片。比如容器a的進(jìn)程一直是空閑的,那么容器b是可以獲取比容器a更多的cpu時間片的。極端情況下,比如說主機(jī)上只運(yùn)行了一個容器,即使它的cpu份額只有50,它也可以獨占整個主機(jī)的cpu資源。

cgroups只在容器分配的資源緊缺時,也就是說在需要對容器使用的資源進(jìn)行限制時,才會生效。因此,無法單純根據(jù)某個容器的cpu份額來確定有多少cpu資源分配給它,資源分配結(jié)果取決于同時運(yùn)行的其他容器的cpu分配和容器中進(jìn)程運(yùn)行情況。

cpu周期控制

docker提供了–cpu-period、–cpu-quota兩個參數(shù)控制容器可以分配到的cpu時鐘周期。–cpu-period是用來指定容器對cpu的使用要在多長時間內(nèi)做一次重新分配,而–cpu-quota是用來指定在這個周期內(nèi),最多可以有多少時間用來跑這個容器。跟–cpu-shares不同的是這種配置是指定一個絕對值,而且沒有彈性在里面,容器對cpu資源的使用絕對不會超過配置的值。
cpu-period和cpu-quota的單位為微秒(μs)。cpu-period的最小值為1000微秒,最大值為1秒(10^6 μs),默認(rèn)值為0.1秒(100000 μs)。cpu-quota的值默認(rèn)為-1,表示不做控制。

舉個例子,如果容器進(jìn)程需要每1秒使用單個cpu的0.2秒時間,可以將cpu-period設(shè)置為1000000(即1秒),cpu-quota設(shè)置為200000(0.2秒)。當(dāng)然,在多核情況下,如果允許容器進(jìn)程需要完全占用兩個cpu,則可以將cpu-period設(shè)置為100000(即0.1秒),cpu-quota設(shè)置為200000(0.2秒)。

使用示例:

使用命令docker run -tid –cpu-period 100000 –cpu-quota 200000 ubuntu,創(chuàng)建容器,則最終生成的cgroup的cpu周期配置可以下面的文件中找到:

root@ubuntu:~# cat /sys/fs/cgroup/cpu/docker/<容器的完整長id>/cpu.cfs_period_us
100000
root@ubuntu:~# cat /sys/fs/cgroup/cpu/docker/<容器的完整長id>/cpu.cfs_quota_us
200000

關(guān)于cpu-shares、cpu-period、cpu-quota這些配置的詳細(xì)介紹,大家可以深入閱讀redhat文檔中關(guān)于cpu的這一章。

cpu core控制

對多核cpu的服務(wù)器,docker還可以控制容器運(yùn)行限定使用哪些cpu內(nèi)核和內(nèi)存節(jié)點,即使用–cpuset-cpus和–cpuset-mems參數(shù)。對具有numa拓?fù)洌ň哂卸郼pu、多內(nèi)存節(jié)點)的服務(wù)器尤其有用,可以對需要高性能計算的容器進(jìn)行性能最優(yōu)的配置。如果服務(wù)器只有一個內(nèi)存節(jié)點,則–cpuset-mems的配置基本上不會有明顯效果。

使用示例:

命令docker run -tid –name cpu1 –cpuset-cpus 0-2 ubuntu,表示創(chuàng)建的容器只能用0、1、2這三個內(nèi)核。最終生成的cgroup的cpu內(nèi)核配置如下:

root@ubuntu:~# cat /sys/fs/cgroup/cpuset/docker/<容器的完整長id>/cpuset.cpus
0-2

通過docker exec <容器id> taskset -c -p 1(容器內(nèi)部第一個進(jìn)程編號一般為1),可以看到容器中進(jìn)程與cpu內(nèi)核的綁定關(guān)系,可以認(rèn)為達(dá)到了綁定cpu內(nèi)核的目的。

docker容器資源配額怎么控制

cpu配額控制參數(shù)的混合使用

當(dāng)上面這些參數(shù)中時,cpu-shares控制只發(fā)生在容器競爭同一個內(nèi)核的時間片時,如果通過cpuset-cpus指定容器a使用內(nèi)核0,容器b只是用內(nèi)核1,在主機(jī)上只有這兩個容器使用對應(yīng)內(nèi)核的情況,它們各自占用全部的內(nèi)核資源,cpu-shares沒有明顯效果。

cpu-period、cpu-quota這兩個參數(shù)一般聯(lián)合使用,在單核情況或者通過cpuset-cpus強(qiáng)制容器使用一個cpu內(nèi)核的情況下,即使cpu-quota超過cpu-period,也不會使容器使用更多的cpu資源。

cpuset-cpus、cpuset-mems只在多核、多內(nèi)存節(jié)點上的服務(wù)器上有效,并且必須與實際的物理配置匹配,否則也無法達(dá)到資源控制的目的。

在系統(tǒng)具有多個cpu內(nèi)核的情況下,需要通過cpuset-cpus為容器cpu內(nèi)核才能比較方便地進(jìn)行測試。

試用下列命令創(chuàng)建測試用的容器:

docker run -tid –name cpu2 –cpuset-cpus 3 –cpu-shares 512 ubuntu:stress stress -c 10
docker run -tid –name cpu3 –cpuset-cpus 3 –cpu-shares 1024 ubuntu:stress stress -c 10

上面的ubuntu:stress鏡像安裝了stress工具來測試cpu和內(nèi)存的負(fù)載。兩個容器的命令stress -c 10&,這個命令將會給系統(tǒng)一個隨機(jī)負(fù)載,產(chǎn)生10個進(jìn)程,每個進(jìn)程都反復(fù)不停的計算由rand()產(chǎn)生隨機(jī)數(shù)的平方根,直到資源耗盡。

觀察到宿主機(jī)上的cpu試用率如下圖所示,第三個內(nèi)核的使用率接近100%,并且一批進(jìn)程的cpu使用率明顯存在2:1的使用比例的對比:

docker容器資源配額怎么控制

容器cpu2的cpu使用如下所示:

docker容器資源配額怎么控制

容器cpu3的cpu使用如下圖示:

docker容器資源配額怎么控制

分別進(jìn)入容器后,使用top命令可以明顯地看出容器之間的資源使用對比,并且也達(dá)到了綁定cpu內(nèi)核的目的。
注意:如果使用nsenter之類的工具進(jìn)入容器,再使用stress -c 10進(jìn)行測試,就可以發(fā)現(xiàn)cpuset-cpus的限制是可以被突破的,從而使stress測試進(jìn)程使用宿主機(jī)的所有cpu內(nèi)核。這是因為nsenter使用掛載的方式直接進(jìn)入了容器的命名空間,突破了命名空間中的cgroup控制。

內(nèi)存配額控制

和cpu控制一樣,docker也提供了若干參數(shù)來控制容器的內(nèi)存使用配額,可以控制容器的swap大小、可用內(nèi)存大小等各種內(nèi)存方面的控制。主要有以下參數(shù):

  1. memory-swappiness:控制進(jìn)程將物理內(nèi)存交換到swap分區(qū)的傾向,默認(rèn)系數(shù)為60。系數(shù)越小,就越傾向于使用物理內(nèi)存。值范圍為0-100。當(dāng)值為100時,表示盡量使用swap分區(qū);當(dāng)值為0時,表示禁用容器 swap 功能(這點不同于宿主機(jī),宿主機(jī) swappiness 設(shè)置為 0 也不保證 swap 不會被使用)。

  2. –kernel-memory:內(nèi)核內(nèi)存,不會被交換到swap上。一般情況下,不建議修改,可以直接參考docker的官方文檔。

  3. –memory:設(shè)置容器使用的最大內(nèi)存上限。默認(rèn)單位為byte,可以使用k、g、m等帶單位的字符串。

  4. –memory-reservation:啟用彈性的內(nèi)存共享,當(dāng)宿主機(jī)資源充足時,允許容器盡量多地使用內(nèi)存,當(dāng)檢測到內(nèi)存競爭或者低內(nèi)存時,強(qiáng)制將容器的內(nèi)存降低到memory-reservation所指定的內(nèi)存大小。按照官方說法,不設(shè)置此選項時,有可能出現(xiàn)某些容器長時間占用大量內(nèi)存,導(dǎo)致性能上的損失。

  5. –memory-swap:等于內(nèi)存和swap分區(qū)大小的總和,設(shè)置為-1時,表示swap分區(qū)的大小是無限的。默認(rèn)單位為byte,可以使用k、g、m等帶單位的字符串。如果–memory-swap的設(shè)置值小于–memory的值,則使用默認(rèn)值,為–memory-swap值的兩倍。

默認(rèn)情況下,容器可以使用主機(jī)上的所有空閑內(nèi)存。

與cpu的cgroups配置類似,docker會自動為容器在目錄/sys/fs/cgroup/memory/docker/<容器的完整長id>中創(chuàng)建相應(yīng)cgroup配置文件,例如下面的文件:

docker容器資源配額怎么控制

這些文件與docker的相關(guān)配置是一一對應(yīng)的,可以參考redhat的文檔resource_management_guide的內(nèi)存部分來查看它們的作用。

內(nèi)存配額控制使用示例

設(shè)置容器的內(nèi)存上限,參考命令如下所示:

docker run -tid —name mem1 —memory 128m ubuntu:stress /bin/bash

默認(rèn)情況下,除了–memory指定的內(nèi)存大小以外,docker還為容器分配了同樣大小的swap分區(qū),也就是說,上面的命令創(chuàng)建出的容器實際上最多可以使用256mb內(nèi)存,而不是128mb內(nèi)存。如果需要自定義swap分區(qū)大小,則可以通過聯(lián)合使用–memory–swap參數(shù)來實現(xiàn)控制。

對上面的命令創(chuàng)建的容器,可以查看到在cgroups的配置文件中,查看到容器的內(nèi)存大小為128mb (128×1024×1024=134217728b),內(nèi)存和swap加起來大小為256mb (256×1024×1024=268435456b)。

cat /sys/fs/cgroup/memory/docker/<容器的完整id>/memory.limit_in_bytes
134217728
cat /sys/fs/cgroup/memory/docker/<容器的完整id>/memory.memsw.limit_in_bytes
268435456

注意:執(zhí)行上述命令時,命令行可能會輸出下面的警告:

warning: your kernel does not support swap limit capabilities, memory limited without swap.

這是因為主機(jī)上默認(rèn)不啟用cgroup來控制swap分區(qū),可以參考docker官方的相應(yīng)文檔,修改grub啟動參數(shù)。

在容器中,依次使用下面的stress命令,即可對容器的內(nèi)存進(jìn)行壓力測試,確認(rèn)內(nèi)存。

stress –vm 1 –vm-bytes 256m –vm-hang 0 &
stress –vm 1 –vm-bytes 250m –vm-hang 0 &

docker容器資源配額怎么控制

可以發(fā)現(xiàn),使用256mb進(jìn)行壓力測試時,由于超過了內(nèi)存上限(128mb內(nèi)存+128mb swap),進(jìn)程被oom殺死。使用250mb進(jìn)行壓力測試時,進(jìn)程可以正常運(yùn)行,并且通過docker stats可以查看到容器的內(nèi)存已經(jīng)滿負(fù)載了。

docker容器資源配額怎么控制

磁盤io配額控制

相對于cpu和內(nèi)存的配額控制,docker對磁盤io的控制相對不成熟,大多數(shù)都必須在有宿主機(jī)設(shè)備的情況下使用。主要包括以下參數(shù):

  1. –device-read-bps:限制此設(shè)備上的讀速度(bytes per second),單位可以是kb、mb或者gb。

  2. –device-read-iops:通過每秒讀io次數(shù)來限制指定設(shè)備的讀速度。

  3. –device-write-bps :限制此設(shè)備上的寫速度(bytes per second),單位可以是kb、mb或者gb。

  4. –device-write-iops:通過每秒寫io次數(shù)來限制指定設(shè)備的寫速度。

  5. –blkio-weight:容器默認(rèn)磁盤io的加權(quán)值,有效值范圍為10-100。

  6. –blkio-weight-device: 針對特定設(shè)備的io加權(quán)控制。其格式為device_name:weight

磁盤io配額控制示例

blkio-weight

要使–blkio-weight生效,需要保證io的調(diào)度算法為cfq??梢允褂孟旅娴姆绞讲榭矗?/p>

root@ubuntu:~# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq

使用下面的命令創(chuàng)建兩個–blkio-weight值不同的容器:

docker run -ti –rm –blkio-weight 100 ubuntu:stress
docker run -ti –rm –blkio-weight 1000 ubuntu:stress

在容器中同時執(zhí)行下面的dd命令,進(jìn)行測試:

time dd if=/dev/zero of=test.out bs=1m count=1024 oflag=direct

最終輸出如下圖所示:

docker容器資源配額怎么控制

在我的測試環(huán)境上沒有達(dá)到理想的測試效果,通過docker官方的blkio-weight doesn't take effect in docker docker version 1.8.1 #16173,可以發(fā)現(xiàn)這個問題在一些環(huán)境上存在,但docker官方也沒有給出解決辦法。

device-write-bps

使用下面的命令創(chuàng)建容器,并執(zhí)行命令驗證寫速度的限制。

docker run -tid –name disk1 –device-write-bps /dev/sda:1mb ubuntu:stress

通過dd來驗證寫速度,輸出如下圖示:

docker容器資源配額怎么控制

可以看到容器的寫磁盤速度被成功地限制到了1mb/s。device-read-bps等其他磁盤io限制參數(shù)可以使用類似的方式進(jìn)行驗證。

容器空間大小限制

在docker使用devicemapper作為存儲驅(qū)動時,默認(rèn)每個容器和鏡像的最大大小為10g。如果需要調(diào)整,可以在daemon啟動參數(shù)中,使用dm.basesize來指定,但需要注意的是,修改這個值,不僅僅需要重啟docker daemon服務(wù),還會導(dǎo)致宿主機(jī)上的所有本地鏡像和容器都被清理掉。

使用aufs或者overlay等其他存儲驅(qū)動時,沒有這個限制。

~~~以上所有截圖測試環(huán)境,宿主機(jī)為ubuntu 14.04.4,docker版本為1.10.3~~~

到此,相信大家對“docker容器資源配額怎么控制”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


標(biāo)題名稱:docker容器資源配額怎么控制
瀏覽地址:http://weahome.cn/article/ggcdjc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部