小編給大家分享一下Docker怎么限制容器可用的內存,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
為什么要限制容器對內存的使用?
限制容器不能過多的使用主機的內存是非常重要的。對于 linux 主機來說,一旦內核檢測到沒有足夠的內存可以分配,就會扔出 oome(out of memmory exception),并開始殺死一些進程用于釋放內存空間。糟糕的是任何進程都可能成為內核獵殺的對象,包括 docker daemon 和其它一些重要的程序。更危險的是如果某個支持系統運行的重要進程被干掉了,整個系統也就宕掉了!這里我們考慮一個比較常見的場景,大量的容器把主機的內存消耗殆盡,oome 被觸發后系統內核立即開始殺進程釋放內存。如果內核殺死的第一個進程就是 docker daemon 會怎么樣?結果是所有的容器都不工作了,這是不能接受的!
針對這個問題,docker 嘗試通過調整 docker daemon 的 oom 優先級來進行緩解。內核在選擇要殺死的進程時會對所有的進程打分,直接殺死得分最高的進程,接著是下一個。當 docker daemon 的 oom 優先級被降低后(注意容器進程的 oom 優先級并沒有被調整),docker daemon 進程的得分不僅會低于容器進程的得分,還會低于其它一些進程的得分。這樣 docker daemon 進程就安全多了。
我們可以通過下面的腳本直觀的看一下當前系統中所有進程的得分情況:
?
1
2 | $ docker run -it -- rm -m 300m --memory-swap=300m u-stress /bin/bash # stress --vm 1 --vm-bytes 500m |
demo 中容器的物理內存被限制在 300m,但是進程卻希望申請到 500m 的物理內存。在沒有 swap 可用的情況下,進程直接被 oom kill 了。如果有足夠的 swap,程序至少還可以正常的運行。
我們可以通過 --oom-kill-disable 選項強行阻止 oom kill 的發生,但是筆者認為 oom kill 是一種健康的行為,為什么要阻止它呢?
除了限制可用 swap 的大小,還可以設置容器使用 swap 的緊迫程度,這一點和主機的 swappiness 是一樣的。容器默認會繼承主機的 swappiness,如果要顯式的為容器設置 swappiness 值,可以使用 --memory-swappiness 選項。
看完了這篇文章,相信你對“Docker怎么限制容器可用的內存”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
原文鏈接:http://www.cnblogs.com/sparkdev/p/8032330.html
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。