?
This document uses PHP Chinese website manual Release
默認(rèn)情況下,容器沒(méi)有資源約束,并且可以使用主機(jī)內(nèi)核調(diào)度器允許的給定資源的多少。Docker提供了控制容器可以使用多少內(nèi)存、CPU或塊IO的方法,并設(shè)置docker run
命令。本節(jié)詳細(xì)介紹了何時(shí)設(shè)置這些限制以及設(shè)置這些限制可能帶來(lái)的影響。
重要的是不要讓正在運(yùn)行的容器占用主機(jī)的太多內(nèi)存。在linux主機(jī)上,如果內(nèi)核檢測(cè)到?jīng)]有足夠的內(nèi)存來(lái)執(zhí)行重要的系統(tǒng)功能,則會(huì)拋出OOME
,或Out Of Memory Exception
,并開(kāi)始銷毀進(jìn)程以釋放內(nèi)存。任何程序都可能被殺死,包括Docker和其他重要的應(yīng)用程序。如果錯(cuò)誤的過(guò)程被扼殺,這將有效地降低整個(gè)系統(tǒng)。
Docker試圖通過(guò)調(diào)整Docker守護(hù)進(jìn)程上的OOM優(yōu)先級(jí)來(lái)降低這些風(fēng)險(xiǎn),這樣它就不會(huì)比系統(tǒng)上的其他進(jìn)程被殺死的可能性更小。不調(diào)整容器的OOM優(yōu)先級(jí)。這使得單個(gè)容器更有可能被殺死,而不是Docker守護(hù)進(jìn)程或其他系統(tǒng)進(jìn)程被殺死。您不應(yīng)該試圖通過(guò)手動(dòng)設(shè)置來(lái)規(guī)避這些安全措施。--oom-score-adj
在守護(hù)進(jìn)程或容器上,或通過(guò)設(shè)置--oom-disable-kill
在集裝箱上。
有關(guān)Linux內(nèi)核的OOM管理的更多信息,請(qǐng)參閱內(nèi)存不足管理。
您可以通過(guò)以下方法減少由于OOME而導(dǎo)致的系統(tǒng)不穩(wěn)定風(fēng)險(xiǎn):
在將應(yīng)用程序投入生產(chǎn)之前,執(zhí)行測(cè)試以了解應(yīng)用程序的內(nèi)存需求。
確保您的應(yīng)用程序僅在資源充足的主機(jī)上運(yùn)行。
限制容器可以使用的內(nèi)存量,如下所述。
在您的Docker主機(jī)上配置交換時(shí)要注意。交換比內(nèi)存慢,性能差,但可以提供緩沖,防止系統(tǒng)內(nèi)存不足。
考慮將容器轉(zhuǎn)換為服務(wù),并使用服務(wù)級(jí)約束和節(jié)點(diǎn)標(biāo)簽確保應(yīng)用程序僅在內(nèi)存充足的主機(jī)上運(yùn)行。
Docker可以強(qiáng)制執(zhí)行硬內(nèi)存限制,這允許容器使用不超過(guò)給定數(shù)量的用戶或系統(tǒng)內(nèi)存,或者軟限制,允許容器使用它所需要的內(nèi)存,除非滿足某些條件。例如,當(dāng)內(nèi)核檢測(cè)到主機(jī)上的低內(nèi)存或爭(zhēng)用時(shí)。當(dāng)單獨(dú)使用或設(shè)置多個(gè)選項(xiàng)時(shí),這些選項(xiàng)中的一些具有不同的效果。
大部分的選項(xiàng)取正整數(shù),跟著一個(gè)后綴b
,k
,m
,g
,,表示字節(jié),千字節(jié),兆字節(jié)或千兆字節(jié)。
選項(xiàng) | 描述 |
---|---|
-m or --memory= | 容器可以使用的最大內(nèi)存量。如果您設(shè)置此選項(xiàng),則允許的最小值為4米(4兆字節(jié))。 |
--memory-swap* | 此容器允許交換到磁盤的內(nèi)存量。請(qǐng)參閱--memory-swap詳細(xì)信息。 |
--memory-swappiness | 默認(rèn)情況下,主機(jī)內(nèi)核可以交換容器使用的匿名頁(yè)面的百分比。您可以將--memory-swappiness設(shè)置為介于0和100之間的值,以調(diào)整此百分比。請(qǐng)參閱--memory-swappiness詳細(xì)信息。 |
--memory-reservation | 允許您指定一個(gè)小于--memory的軟限制,當(dāng)Docker檢測(cè)到主機(jī)上的爭(zhēng)用或內(nèi)存不足時(shí),該內(nèi)存會(huì)被激活。如果使用--memory-reservation,它必須設(shè)置為低于--memory才能優(yōu)先。由于這是一個(gè)軟限制,它不能保證容器不會(huì)超出限制。 |
--kernel-memory | 容器可以使用的最大內(nèi)核內(nèi)存量。允許的最小值是4米。由于內(nèi)核內(nèi)存不能被換出,因此內(nèi)核內(nèi)存不足的容器可能會(huì)阻塞主機(jī)資源,這會(huì)對(duì)主機(jī)和其他容器產(chǎn)生副作用。請(qǐng)參閱 - 內(nèi)核內(nèi)存細(xì)節(jié)。 |
--oom-kill-disable | 默認(rèn)情況下,如果發(fā)生內(nèi)存不足(OOM)錯(cuò)誤,內(nèi)核會(huì)殺死容器中的進(jìn)程。要更改此行為,請(qǐng)使用--oom-kill-disable選項(xiàng)。只有在您還設(shè)置了-m / - memory選項(xiàng)的容器上禁用OOM殺手。如果未設(shè)置-m標(biāo)志,主機(jī)可能會(huì)耗盡內(nèi)存,內(nèi)核可能需要終止主機(jī)系統(tǒng)的進(jìn)程以釋放內(nèi)存。 |
有關(guān)cgroup和內(nèi)存的詳細(xì)信息,請(qǐng)參閱內(nèi)存資源控制器...
--memory-swap
細(xì)節(jié)--memory-swap
是一個(gè)修飾符標(biāo)志,它只有在以下情況下才有意義:--memory
也設(shè)置好了。當(dāng)容器耗盡了可用的所有RAM時(shí),使用交換空間允許容器將多余的內(nèi)存需求寫(xiě)入磁盤。對(duì)于經(jīng)常將內(nèi)存交換到磁盤的應(yīng)用程序,存在性能損失。
它的設(shè)置可能會(huì)產(chǎn)生復(fù)雜的影響:
如果--memory-swap
設(shè)置為正整數(shù),則兩者均為--memory
和--memory-swap
必須設(shè)置好。--memory-swap
表示可以使用的內(nèi)存和交換空間的總量,以及--memory
控制非交換內(nèi)存使用的數(shù)量。所以如果--memory="300m"
和--memory-swap="1g"
,該容器可使用300 m內(nèi)存和700 m%28。1g - 300m
%29掉期
如果--memory-swap
設(shè)置為0
,則忽略該設(shè)置,并將該值視為未設(shè)置。
如果--memory-swap
設(shè)置為與--memory
,和--memory
被設(shè)置為正整數(shù),容器將無(wú)法訪問(wèn)交換。.見(jiàn)防止容器使用交換...
如果--memory-swap
是未設(shè)置的,而且--memory
設(shè)置后,容器可以使用的交換空間是--memory
設(shè)置,如果主機(jī)容器已配置了交換內(nèi)存。例如,如果--memory="300m"
和--memory-swap
如果沒(méi)有設(shè)置,容器可以使用300米內(nèi)存和600米交換。
如果--memory-swap
顯式設(shè)置為-1
,容器可以使用無(wú)限交換,最多可在主機(jī)系統(tǒng)上使用。防止容器使用交換如果--memory
和--memory-swap
設(shè)置為相同的值,這將防止容器使用任何交換。這是因?yàn)?code>--memory-swap是可以使用的組合內(nèi)存和交換空間的數(shù)量,而--memory
僅為可使用的物理內(nèi)存量。--memory-swappiness
細(xì)節(jié)
值0關(guān)閉匿名頁(yè)交換。
值100將所有匿名頁(yè)面設(shè)置為可交換。
默認(rèn)情況下,如果不設(shè)置--memory-swappiness
,則從主機(jī)繼承該值。
--kernel-memory
細(xì)節(jié)內(nèi)核內(nèi)存限制以分配給容器的總體內(nèi)存表示??紤]以下情況:
無(wú)限內(nèi)存,無(wú)限內(nèi)核內(nèi)存這是默認(rèn)行為。
無(wú)限內(nèi)存,有限內(nèi)核內(nèi)存當(dāng)所有cgroup所需的內(nèi)存量大于主機(jī)上實(shí)際存在的內(nèi)存量時(shí),這是適當(dāng)?shù)?。您可以將?nèi)核內(nèi)存配置為永遠(yuǎn)不要檢查主機(jī)上可用的內(nèi)容,需要更多內(nèi)存的容器需要等待。
有限內(nèi)存,無(wú)限制內(nèi)核內(nèi)存:總體內(nèi)存是有限的,但是內(nèi)核內(nèi)存不是。
有限內(nèi)存,有限內(nèi)核內(nèi)存限制用戶和內(nèi)核內(nèi)存對(duì)于調(diào)試與內(nèi)存相關(guān)的問(wèn)題非常有用。如果容器使用的內(nèi)存類型都是意外的,那么它將耗盡內(nèi)存,而不會(huì)影響其他容器或主機(jī)。在此設(shè)置中,如果內(nèi)核內(nèi)存限制低于用戶內(nèi)存限制,內(nèi)核內(nèi)存不足將導(dǎo)致容器遇到OOM錯(cuò)誤。如果內(nèi)核內(nèi)存限制高于用戶內(nèi)存限制,內(nèi)核限制將不會(huì)導(dǎo)致容器體驗(yàn)OOM。
當(dāng)您打開(kāi)任何內(nèi)核內(nèi)存限制時(shí),主機(jī)會(huì)在每個(gè)進(jìn)程的基礎(chǔ)上跟蹤“高水標(biāo)記”統(tǒng)計(jì)數(shù)據(jù),這樣您就可以跟蹤哪個(gè)進(jìn)程%28--在這種情況下,容器%29使用的是多余內(nèi)存。這可以通過(guò)查看每個(gè)進(jìn)程來(lái)查看。/proc/<PID>/status
在主機(jī)上。
默認(rèn)情況下,每個(gè)容器對(duì)主機(jī)CPU周期的訪問(wèn)是無(wú)限的。您可以設(shè)置各種約束來(lái)限制給定容器對(duì)主機(jī)CPU周期的訪問(wèn)。大多數(shù)用戶將使用和配置默認(rèn)CFS調(diào)度程序.在Docker 1.13及更高版本中,還可以配置實(shí)時(shí)調(diào)度器...
CFS是用于正常Linux進(jìn)程的Linux內(nèi)核CPU調(diào)度程序。幾個(gè)運(yùn)行時(shí)標(biāo)志允許您配置容器對(duì)CPU資源的訪問(wèn)量。使用這些設(shè)置時(shí),Docker將修改主機(jī)上容器的cgroup設(shè)置。
選項(xiàng) | 描述 |
---|---|
--cpus=<value> | 指定容器可以使用多少可用CPU資源。例如,如果主機(jī)有兩個(gè)CPU,并且您設(shè)置了--cpus =“1.5”,那么該容器將保證最多可以訪問(wèn)一個(gè)半的CPU。這相當(dāng)于設(shè)置--cpu-period =“100000”和--cpu-quota =“150000”。在Docker 1.13和更高版本中可用。 |
--cpu-period=<value> | 指定CPU CFS調(diào)度程序周期,該周期與--cpu-quota一起使用。默認(rèn)為1秒,以微秒表示。大多數(shù)用戶不會(huì)從默認(rèn)值更改此設(shè)置。如果您使用Docker 1.13或更高版本,請(qǐng)改用--cpus。 |
--cpu-quota=<value> | 在容器上添加CPU CFS配額。每個(gè)--cpu-period允許CPU訪問(wèn)的容器數(shù)微秒數(shù)。換句話說(shuō),cpu-quota / cpu-period。如果您使用Docker 1.13或更高版本,請(qǐng)改用--cpus。 |
--cpuset-cpus | 限制容器可以使用的特定CPU或核心。如果您有多個(gè)CPU,則容器可以使用的逗號(hào)分隔列表或連字符分隔的CPU范圍。第一個(gè)CPU編號(hào)為0.有效值可能為0-3(使用第一,第二,第三和第四個(gè)CPU)或1,3(使用第二個(gè)和第四個(gè)CPU)。 |
--cpu-shares | 將此標(biāo)志設(shè)置為大于或小于默認(rèn)值1024的值,以增加或減少容器的重量,并使其能夠訪問(wèn)主機(jī)CPU周期的更大或更小比例。這僅在CPU周期受到限制時(shí)才會(huì)執(zhí)行。當(dāng)大量CPU周期可用時(shí),所有容器都使用盡可能多的CPU。這樣,這是一個(gè)軟限制。--cpu-shares不會(huì)阻止容器在群集模式下進(jìn)行調(diào)度。它優(yōu)先考慮容器CPU資源的可用CPU周期。它不保證或保留任何特定的CPU訪問(wèn)權(quán)限。 |
如果您有一個(gè)CPU,下面的每條命令將保證容器最多每秒占CPU的50%。
碼頭1.13及以上*
docker run -it --cpus=".5" ubuntu /bin/bash
碼頭1.12及以下*
$ docker run -it --cpu-period=100000 --cpu-quota=50000 ubuntu /bin/bash
在Docker 1.13及更高版本中,可以將容器配置為使用實(shí)時(shí)調(diào)度程序,以處理無(wú)法使用cfs調(diào)度程序的任務(wù)。你需要確保主機(jī)的內(nèi)核配置正確在你可以之前配置Docker守護(hù)進(jìn)程或配置單個(gè)容器...
警告CPU調(diào)度和優(yōu)先級(jí)是高級(jí)內(nèi)核級(jí)特性.。大多數(shù)用戶不需要從默認(rèn)值中更改這些值。不正確地設(shè)置這些值會(huì)導(dǎo)致主機(jī)系統(tǒng)變得不穩(wěn)定或無(wú)法使用。
核實(shí)CONFIG_RT_GROUP_SCHED
在linux內(nèi)核中通過(guò)運(yùn)行zcat /proc/config.gz | grep CONFIG_RT_GROUP_SCHED
或者通過(guò)檢查文件的存在/sys/fs/cgroup/cpu.rt_runtime_us
有關(guān)配置內(nèi)核實(shí)時(shí)調(diào)度程序的指導(dǎo),請(qǐng)參閱操作系統(tǒng)的文檔。
若要使用實(shí)時(shí)調(diào)度程序運(yùn)行容器,請(qǐng)使用--cpu-rt-runtime
標(biāo)志設(shè)置為每個(gè)運(yùn)行時(shí)期間為實(shí)時(shí)任務(wù)保留的最大微秒數(shù)。例如,默認(rèn)周期為10000微秒%281秒%29,設(shè)置--cpu-rt-runtime=95000
確保使用實(shí)時(shí)調(diào)度程序的容器每10000微秒可以運(yùn)行95000微秒,為非實(shí)時(shí)任務(wù)留出至少5000微秒。使此配置在使用systemd
,見(jiàn)用system d控制和配置Docker...
在啟動(dòng)容器時(shí),可以傳遞幾個(gè)標(biāo)志來(lái)控制容器的CPU優(yōu)先級(jí)。docker run
查閱您的操作系統(tǒng)文檔或ulimit
命令獲取有關(guān)適當(dāng)值的信息。
選項(xiàng) | 描述 |
---|---|
--cap-add=sys_nice | 授予容器CAP_SYS_NICE功能,允許容器提升進(jìn)程的良好值,設(shè)置實(shí)時(shí)調(diào)度策略,設(shè)置CPU關(guān)聯(lián)和其他操作。 |
--cpu-rt-runtime=<value> | 容器可以在Docker守護(hù)進(jìn)程的實(shí)時(shí)調(diào)度程序期間以實(shí)時(shí)優(yōu)先級(jí)運(yùn)行的最大微秒數(shù)。您還需要--cap-add = sys_nice標(biāo)志。 |
--ulimit rtprio=<value> | 容器允許的最大實(shí)時(shí)優(yōu)先級(jí)。您還需要--cap-add = sys_nice標(biāo)志。 |
下面的示例命令設(shè)置debian:jessie
集裝箱。
$ docker run --it --cpu-rt-runtime=95000 \ --ulimit rtprio=99 \ --cap-add=sys_nice \ debian:jessie
如果內(nèi)核或Docker守護(hù)進(jìn)程配置不正確,就會(huì)發(fā)生錯(cuò)誤。