當前位置:
首頁 > 科技 > docker可以限制容器內存大小嗎?

docker可以限制容器內存大小嗎?

概述

默認情況下容器使用的資源是不受限制的。也就是可以使用主機內核調度器所允許的最大資源。但是在容器的使用過程中,我們不可能讓容器無限制的去使用主機資源,下面介紹下怎麼去對Docker容器可用的內存做限制。



為什麼要限制容器對內存的使用?

限制容器不能過多的使用主機的內存是非常重要的。對於 linux 主機來說,一旦內核檢測到沒有足夠的內存可以分配,就會扔出 OOME(Out Of Memmory Exception),並開始殺死一些進程用於釋放內存空間。

這裡我們考慮一個比較常見的場景,大量的容器把主機的內存消耗殆盡,OOME 被觸發後系統內核立即開始殺進程釋放內存。如果內核殺死的第一個進程就是 docker daemon 會怎麼樣?結果就是所有的容器都不工作了!

針對這個問題,docker 嘗試通過調整 docker daemon 的 OOM 優先順序來進行緩解。內核在選擇要殺死的進程時會對所有的進程打分,直接殺死得分最高的進程,接著是下一個。當 docker daemon 的 OOM 優先順序被降低後(注意容器進程的 OOM 優先順序並沒有被調整),docker daemon 進程的得分不僅會低於容器進程的得分,還會低於其它一些進程的得分。這樣 docker daemon 進程就安全多了。

可以通過下面的腳本直觀的看一下當前系統中所有進程的得分情況:

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

此腳本輸出得分最高的 40 個進程,並進行了排序(第一列顯示進程的得分)

docker可以限制容器內存大小嗎?

打開今日頭條,查看更多圖片


壓力測試工具 stress

為了測試容器的內存使用情況,我安裝了壓力測試工作 stress,並新創建了鏡像 u-stress。

下面用的所有容器都會通過 u-stress 鏡像創建(運行容器的宿主機為 ubuntu16.04 )。下面是創建 u-stress 鏡像的 Dockerfile:

FROM ubuntu:latest
RUN apt-get update &&
apt-get install stress

創建鏡像的命令為:

docker build -t u-stress:latest .

docker可以限制容器內存大小嗎?



限制內存使用上限

先完成一個簡單的用例:限制容器可以使用的最大內存為 300M。

-m(--memory=) 選項可以完成這樣的配置:

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

docker可以限制容器內存大小嗎?

下面的 stress 命令會創建一個進程並通過 malloc 函數分配內存:

# stress --vm 1 --vm-bytes 500M

通過 docker stats 命令查看實際情況:

docker可以限制容器內存大小嗎?

上面的 docker run 命令中通過 -m 選項限制容器使用的內存上限為 300M。同時設置 memory-swap 值為 -1,它表示容器程序使用內存的受限,而可以使用的 swap 空間使用不受限制(宿主機有多少 swap 容器就可以使用多少)。

下面我們通過 top 命令來查看 stress 進程內存的實際情況:

docker可以限制容器內存大小嗎?

上面的截圖中先通過 pgrep 命令查詢 stress 命令相關的進程,進程號比較大(9296)的那個是用來消耗內存的進程,我們就查看它的內存信息。VIRT 是進程虛擬內存的大小,所以它應該是 500M。RES 為實際分配的物理內存數量,我們看到這個值就在 300M 上下浮動。

結果:成功的限制了容器能夠使用的物理內存數量。



限制可用的 swap 大小

強調一下 --memory-swap 是必須要與 --memory 一起使用的。

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

容器可以使用 300M 的物理內存,並且可以使用 700M(1G -300M) 的 swap。

--memory-swap 是容器可以使用的物理內存和可以使用的 swap 之和!

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

如果 --memory-swap 的值和 --memory 相同,則容器不能使用 swap。

下面 演示在沒有 swap 可用的情況下向系統申請大量內存的場景:

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

docker可以限制容器內存大小嗎?



docker可以限制容器內存大小嗎?

通過限制容器可用的物理內存,可以避免容器內服務異常導致大量消耗主機內存的情況(此時讓容器重啟是較好的策略),因此可以降低主機內存被耗盡帶來的風險。

後面會分享更多devops方面內容,感興趣的朋友可以關注下!!

docker可以限制容器內存大小嗎?

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!

TAG: |