docker內存限制


默認docker容器可以使用宿主機所有的內存和CPU,我們可以通過 docker run 來限制內存和CPU的使用。

有的系統內核不支持 Linux capabilities. 可以通過 docker info 命令來檢查,如果系統內核不支持,會有如下報錯

WARNING: No swap limit support

在linux主機上,如果kernel發現沒有足夠的內存了,會報出OOME或者Out Of Memory Exception,並且會kill 進程來釋放內存,任何的進程都有可能會被kill,包括docker,這可能引起整個系統的宕機。

docker嘗試通過調整docker守護進程的OOM優先級來減輕風險,以便它比系統上的其他進程更不可能被殺死。

選項 描述
-m or --memory= 容器可使用最大內存,最小內存為4m,單位可以為 b,k,m,g
--memory-swap* 容器可用於交換到硬盤的最大內存
--memory-swappiness 默認情況下,容器的內核可以交換出一定比例的匿名頁,設置為從 0 到 100,0表示關閉
--memory-reservation 內存預留
--kernel-memory 核心內存限制。最小為 4M
--oom-kill-disable 是否阻止 OOM killer 殺死容器,默認沒設置

 

 

 

 

 

 

--memory-swap 介紹

只有當--memory設置之后,--memory-swap 才會生效

1、如果--memory-swap設置為正整數,那么這兩個--memory和 --memory-swap必須設置。--memory-swap表示可以使用的內存和交換總量,並--memory控制非交換內存使用的數量。因此,如果--memory="300m"--memory-swap="1g",容器可以使用300m的內存和700m(1g - 300m)交換。

2、如果--memory-swap設置為0,則忽略該設置,並將該值視為未設置。

3、如果--memory-swap設置為與值相同的值--memory,並且--memory設置為正整數,則不使用swap

4、如果--memory-swap未設置並且--memory--memory設置,則如果主機容器配置了交換內存,則容器可以使用兩倍於設置的交換。例如,如果--memory="300m"--memory-swap未設置,容器可以使用300m的內存和600m的交換。

5、如果--memory-swap明確設置為-1,則允許容器使用無限制交換,最多可達主機系統上可用的數量。

防止容器使用交換

如果--memory--memory-swap設置為相同的值,則可以防止容器使用任何交換。這是因為--memory-swap可以使用的組合內存和交換量,而--memory只是可以使用的物理內存量。

--memory-swappiness 細節

  • 值為0將關閉匿名頁面交換。
  • 值100將所有匿名頁面設置為可交換。
  • 默認情況下,如果未設置--memory-swappiness,則值將從主機繼承。

--kernel-memory 細節

內核內存限制以分配給容器的總內存表示。請考慮以下方案:

  • 無限內存,無限內核內存:這是默認行為。
  • 無限內存,有限內核內存:當所有cgroup所需的內存量大於主機上實際存在的內存量時,這是合適的。您可以將內核內存配置為永遠不會覆蓋主機上可用的內容,而需要更多內存的容器需要等待它。
  • 有限的內存,無限的內核內存:整體內存有限,但內核內存不受限制。
  • 有限的內存,有限的內核內存:限制用戶和內核內存對於調試與內存相關的問題非常有用。如果容器正在使用意外數量的任一類型的內存,則它會耗盡內存而不會影響其他容器或主機。在此設置中,如果內核內存限制低於用戶內存限制,則內核內存不足會導致容器遇到OOM錯誤。如果內核內存限制高於用戶內存限制,則內核限制不會導致容器遇到OOM。

當您打開任何內核內存限制時,主機會根據每個進程跟蹤“高水位線”統計信息,因此您可以跟蹤哪些進程(在本例中為容器)正在使用多余的內存。通過/proc/<PID>/status在主機上查看可以在每個過程中看到這一點

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM