默認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
在主機上查看,可以在每個過程中看到這一點。