怎么限制Docker容器可用的內(nèi)存

這篇文章主要介紹了怎么限制Docker容器可用的內(nèi)存的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇怎么限制Docker容器可用的內(nèi)存文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

創(chuàng)新互聯(lián)一直通過(guò)網(wǎng)站建設(shè)和網(wǎng)站營(yíng)銷(xiāo)幫助企業(yè)獲得更多客戶(hù)資源。 以"深度挖掘,量身打造,注重實(shí)效"的一站式服務(wù),以成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、移動(dòng)互聯(lián)產(chǎn)品、成都全網(wǎng)營(yíng)銷(xiāo)推廣服務(wù)為核心業(yè)務(wù)。10余年網(wǎng)站制作的經(jīng)驗(yàn),使用新網(wǎng)站建設(shè)技術(shù),全新開(kāi)發(fā)出的標(biāo)準(zhǔn)網(wǎng)站,不但價(jià)格便宜而且實(shí)用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡(jiǎn)單易用,維護(hù)方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設(shè)的選擇。

為什么要限制容器對(duì)內(nèi)存的使用?

限制容器不能過(guò)多的使用主機(jī)的內(nèi)存是非常重要的。對(duì)于 linux 主機(jī)來(lái)說(shuō),一旦內(nèi)核檢測(cè)到?jīng)]有足夠的內(nèi)存可以分配,就會(huì)扔出 oome(out of memmory exception),并開(kāi)始?xì)⑺酪恍┻M(jìn)程用于釋放內(nèi)存空間。糟糕的是任何進(jìn)程都可能成為內(nèi)核獵殺的對(duì)象,包括 docker daemon 和其它一些重要的程序。更危險(xiǎn)的是如果某個(gè)支持系統(tǒng)運(yùn)行的重要進(jìn)程被干掉了,整個(gè)系統(tǒng)也就宕掉了!這里我們考慮一個(gè)比較常見(jiàn)的場(chǎng)景,大量的容器把主機(jī)的內(nèi)存消耗殆盡,oome 被觸發(fā)后系統(tǒng)內(nèi)核立即開(kāi)始?xì)⑦M(jìn)程釋放內(nèi)存。如果內(nèi)核殺死的第一個(gè)進(jìn)程就是 docker daemon 會(huì)怎么樣?結(jié)果是所有的容器都不工作了,這是不能接受的!

針對(duì)這個(gè)問(wèn)題,docker 嘗試通過(guò)調(diào)整 docker daemon 的 oom 優(yōu)先級(jí)來(lái)進(jìn)行緩解。內(nèi)核在選擇要?dú)⑺赖倪M(jìn)程時(shí)會(huì)對(duì)所有的進(jìn)程打分,直接殺死得分最高的進(jìn)程,接著是下一個(gè)。當(dāng) docker daemon 的 oom 優(yōu)先級(jí)被降低后(注意容器進(jìn)程的 oom 優(yōu)先級(jí)并沒(méi)有被調(diào)整),docker daemon 進(jìn)程的得分不僅會(huì)低于容器進(jìn)程的得分,還會(huì)低于其它一些進(jìn)程的得分。這樣 docker daemon 進(jìn)程就安全多了。

我們可以通過(guò)下面的腳本直觀的看一下當(dāng)前系統(tǒng)中所有進(jìn)程的得分情況:

#!/bin/bash
for proc in $(find /proc -maxdepth 1 -regex '/proc/[0-9]+'); do
 printf "%2d %5d %s\n" \
  "$(cat $proc/oom_score)" \
  "$(basename $proc)" \
  "$(cat $proc/cmdline | tr '\0' ' ' | head -c 50)"
done 2>/dev/null | sort -nr | head -n 40

此腳本輸出得分最高的 40 個(gè)進(jìn)程,并進(jìn)行了排序:

怎么限制Docker容器可用的內(nèi)存

第一列顯示進(jìn)程的得分,MySQLd 排到的第一名。顯示為 node server.js 的都是容器進(jìn)程,排名普遍比較靠前。紅框中的是 docker daemon 進(jìn)程,非常的靠后,都排到了 sshd 的后面。

有了上面的機(jī)制后是否就可以高枕無(wú)憂了呢!不是的,docker 的官方文檔中一直強(qiáng)調(diào)這只是一種緩解的方案,并且為我們提供了一些降低風(fēng)險(xiǎn)的建議:

  • 通過(guò)測(cè)試掌握應(yīng)用對(duì)內(nèi)存的需求

  • 保證運(yùn)行容器的主機(jī)有重組的內(nèi)存

  • 限制容器可以使用的內(nèi)存

  • 為主機(jī)配置 swap

好了,啰嗦了這么多,其實(shí)就是說(shuō):通過(guò)限制容器使用的內(nèi)存上限,可以降低主機(jī)內(nèi)存耗盡時(shí)帶來(lái)的各種風(fēng)險(xiǎn)。

壓力測(cè)試工具 stress

為了測(cè)試容器的內(nèi)存使用情況,筆者在 ubuntu 的鏡像中安裝了壓力測(cè)試工作 stress,并新創(chuàng)建了鏡像 u-stress。本文演示用的所有容器都會(huì)通過(guò) u-stress 鏡像創(chuàng)建(本文運(yùn)行容器的宿主機(jī)為 centos7)。下面是創(chuàng)建 u-stress 鏡像的 dockerfile:

from ubuntu:latest
run apt-get update && \
  apt-get install stress

創(chuàng)建鏡像的命令為:

$ docker build -t u-stress:latest .

限制內(nèi)存使用上限

在進(jìn)入繁瑣的設(shè)置細(xì)節(jié)之前我們先完成一個(gè)簡(jiǎn)單的用例:限制容器可以使用的最大內(nèi)存為 300m。
-m(--memory=) 選項(xiàng)可以完成這樣的配置:

$ docker run -it -m 300m --memory-swap -1 --name con1 u-stress /bin/bash

下面的 stress 命令會(huì)創(chuàng)建一個(gè)進(jìn)程并通過(guò) malloc 函數(shù)分配內(nèi)存:

# stress --vm 1 --vm-bytes 500m

通過(guò) docker stats 命令查看實(shí)際情況:

怎么限制Docker容器可用的內(nèi)存

上面的 docker run 命令中通過(guò) -m 選項(xiàng)限制容器使用的內(nèi)存上限為 300m。同時(shí)設(shè)置 memory-swap 值為 -1,它表示容器程序使用內(nèi)存的受限,而可以使用的 swap 空間使用不受限制(宿主機(jī)有多少 swap 容器就可以使用多少)。
下面我們通過(guò) top 命令來(lái)查看 stress 進(jìn)程內(nèi)存的實(shí)際情況:

怎么限制Docker容器可用的內(nèi)存

上面的截圖中先通過(guò) pgrep 命令查詢(xún) stress 命令相關(guān)的進(jìn)程,進(jìn)程號(hào)比較大的那個(gè)是用來(lái)消耗內(nèi)存的進(jìn)程,我們就查看它的內(nèi)存信息。virt 是進(jìn)程虛擬內(nèi)存的大小,所以它應(yīng)該是 500m。res 為實(shí)際分配的物理內(nèi)存數(shù)量,我們看到這個(gè)值就在 300m 上下浮動(dòng)。看樣子我們已經(jīng)成功的限制了容器能夠使用的物理內(nèi)存數(shù)量。

限制可用的 swap 大小

強(qiáng)調(diào)一下 --memory-swap 是必須要與 --memory 一起使用的。

正常情況下, --memory-swap 的值包含容器可用內(nèi)存和可用 swap。所以 --memory="300m" --memory-swap="1g" 的含義為:

容器可以使用 300m 的物理內(nèi)存,并且可以使用 700m(1g -330m) 的 swap。--memory-swap 居然是容器可以使用的物理內(nèi)存和可以使用的 swap 之和!

把 --memory-swap 設(shè)置為 0 和不設(shè)置是一樣的,此時(shí)如果設(shè)置了 --memory,容器可以使用的 swap 大小為 --memory 值的兩倍。

如果 --memory-swap 的值和 --memory 相同,則容器不能使用 swap。下面的 demo 演示了在沒(méi)有 swap 可用的情況下向系統(tǒng)申請(qǐng)大量?jī)?nèi)存的場(chǎng)景:

$ docker run -it --rm -m 300m --memory-swap=300m u-stress /bin/bash
# stress --vm 1 --vm-bytes 500m

怎么限制Docker容器可用的內(nèi)存

demo 中容器的物理內(nèi)存被限制在 300m,但是進(jìn)程卻希望申請(qǐng)到 500m 的物理內(nèi)存。在沒(méi)有 swap 可用的情況下,進(jìn)程直接被 oom kill 了。如果有足夠的 swap,程序至少還可以正常的運(yùn)行。

我們可以通過(guò) --oom-kill-disable 選項(xiàng)強(qiáng)行阻止 oom kill 的發(fā)生,但是筆者認(rèn)為 oom kill 是一種健康的行為,為什么要阻止它呢?

除了限制可用 swap 的大小,還可以設(shè)置容器使用 swap 的緊迫程度,這一點(diǎn)和主機(jī)的 swappiness 是一樣的。容器默認(rèn)會(huì)繼承主機(jī)的 swappiness,如果要顯式的為容器設(shè)置 swappiness 值,可以使用 --memory-swappiness 選項(xiàng)。

關(guān)于“怎么限制Docker容器可用的內(nèi)存”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“怎么限制Docker容器可用的內(nèi)存”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

新聞名稱(chēng):怎么限制Docker容器可用的內(nèi)存
當(dāng)前路徑:http://muchs.cn/article10/jcpsdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站網(wǎng)站設(shè)計(jì)公司、網(wǎng)站排名、企業(yè)網(wǎng)站制作、品牌網(wǎng)站設(shè)計(jì)、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(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)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司