中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么限制Docker容器可用的內存

發布時間:2022-05-20 15:41:05 來源:億速云 閱讀:1845 作者:iii 欄目:大數據

這篇文章主要介紹了怎么限制Docker容器可用的內存的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇怎么限制Docker容器可用的內存文章都會有所收獲,下面我們一起來看看吧。

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

限制容器不能過多的使用主機的內存是非常重要的。對于 linux 主機來說,一旦內核檢測到沒有足夠的內存可以分配,就會扔出 oome(out of memmory exception),并開始殺死一些進程用于釋放內存空間。糟糕的是任何進程都可能成為內核獵殺的對象,包括 docker daemon 和其它一些重要的程序。更危險的是如果某個支持系統運行的重要進程被干掉了,整個系統也就宕掉了!這里我們考慮一個比較常見的場景,大量的容器把主機的內存消耗殆盡,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\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 個進程,并進行了排序:

怎么限制Docker容器可用的內存

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

有了上面的機制后是否就可以高枕無憂了呢!不是的,docker 的官方文檔中一直強調這只是一種緩解的方案,并且為我們提供了一些降低風險的建議:

  • 通過測試掌握應用對內存的需求

  • 保證運行容器的主機有重組的內存

  • 限制容器可以使用的內存

  • 為主機配置 swap

好了,啰嗦了這么多,其實就是說:通過限制容器使用的內存上限,可以降低主機內存耗盡時帶來的各種風險。

壓力測試工具 stress

為了測試容器的內存使用情況,筆者在 ubuntu 的鏡像中安裝了壓力測試工作 stress,并新創建了鏡像 u-stress。本文演示用的所有容器都會通過 u-stress 鏡像創建(本文運行容器的宿主機為 centos7)。下面是創建 u-stress 鏡像的 dockerfile:

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

創建鏡像的命令為:

$ docker build -t u-stress:latest .

限制內存使用上限

在進入繁瑣的設置細節之前我們先完成一個簡單的用例:限制容器可以使用的最大內存為 300m。
-m(--memory=) 選項可以完成這樣的配置:

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

下面的 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 命令相關的進程,進程號比較大的那個是用來消耗內存的進程,我們就查看它的內存信息。virt 是進程虛擬內存的大小,所以它應該是 500m。res 為實際分配的物理內存數量,我們看到這個值就在 300m 上下浮動。看樣子我們已經成功的限制了容器能夠使用的物理內存數量。

限制可用的 swap 大小

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

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

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

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

如果 --memory-swap 的值和 --memory 相同,則容器不能使用 swap。下面的 demo 演示了在沒有 swap 可用的情況下向系統申請大量內存的場景:

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

怎么限制Docker容器可用的內存

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

我們可以通過 --oom-kill-disable 選項強行阻止 oom kill 的發生,但是筆者認為 oom kill 是一種健康的行為,為什么要阻止它呢?

除了限制可用 swap 的大小,還可以設置容器使用 swap 的緊迫程度,這一點和主機的 swappiness 是一樣的。容器默認會繼承主機的 swappiness,如果要顯式的為容器設置 swappiness 值,可以使用 --memory-swappiness 選項。

關于“怎么限制Docker容器可用的內存”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“怎么限制Docker容器可用的內存”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

拉萨市| 藁城市| 九台市| 长沙市| 房山区| 安岳县| 三江| 莲花县| 井冈山市| 五大连池市| 竹北市| 牟定县| 博兴县| 嘉祥县| 乐平市| 铁力市| 延边| 化州市| 芜湖县| 通江县| 南康市| 秦皇岛市| 凤山县| 怀仁县| 信宜市| 盐源县| 通渭县| 乌鲁木齐县| 铜陵市| 沁阳市| 新化县| 石渠县| 蕉岭县| 滨州市| 江陵县| 五寨县| 东阳市| 昭平县| 广丰县| 泗水县| 易门县|