Docker在默認情況下,容器使用的資源是不受限制的。也就是可以使用主機內核調度器所允許的最大資源。但是在容器的使用過程中,經常需要對容器可以使用的主機資源進行限制使容器之間會盡量不互相影響。
Docker內存控制OOME在linxu系統上,如果內核探測到當前宿主機已經沒有可用內存使用,那么會拋出一個OOME(Out Of Memory Exception:內存異常 ),并且會開啟killing去殺掉一些進程。
一旦發生OOME,任何進程都有可能被殺死,包括docker daemon在內,為此,docker特地調整了docker daemon的OOM_Odj優先級,以免他被殺掉,但容器的優先級并未被調整。經過系統內部復制的計算后,每個系統進程都會有一個OOM_Score得分,OOM_Odj越高,得分越高,(在docker run的時候可以調整OOM_Odj)得分最高的優先被kill掉,當然,也可以指定一些特定的重要的容器禁止被OMM殺掉,在啟動容器時使用 –oom-kill-disable=true指定。
Docker 提供的內存限制功能有以下幾點:
容器能使用的內存和交換分區大小。
容器的核心內存大小。
容器虛擬內存的交換行為。
容器內存的軟性限制。
是否殺死占用過多內存的容器。
容器被殺死的優先級
一般情況下,達到內存限制的容器過段時間后就會被系統殺死。
執行docker run命令時能使用的和內存限制相關的所有選項如下。
-m,--memory 內存限制,格式是數字加單位,單位可以為 b,k,m,g。最小為 4M
--memory-swap 內存+交換分區大小總限制。格式同上。必須必-m設置的大
--memory-reservation 內存的軟性限制。格式同上
--oom-kill-disable 是否阻止 OOM killer 殺死容器,默認沒設置
--oom-score-adj 容器被 OOM killer 殺死的優先級,范圍是[-1000, 1000],默認為 0
--memory-swappiness 用于設置容器的虛擬內存控制行為。值為 0~100 之間的整數
--kernel-memory 核心內存限制。格式同上,最小為 4M
使用Docker自帶的-m操作進行內存限制時可能會由于內核限制所以出現以下提示Your kernel does not support swap limit capabilities.memory limit without swap
必須通過修改grub文件/etc/default/grub 添加:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
之后更新grub并重啟可以解決
$ sudo update-grub
$ sudo reboot
--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-reservation設置
Memory reservation 是一種軟性限制,用于節制容器內存使用。給--memory-reservation設置一個比-m小的值后,雖然容器最多可以使用-m使用的內存大小,但在宿主機內存資源緊張時,在系統的下次內存回收時,系統會回收容器的部分內存頁,強迫容器的內存占用回到--memory-reservation設置的值大小。
--oom-kill-disable設置
默認情況下,在出現 out-of-memory(OOM) 錯誤時,系統會殺死容器內的進程來獲取更多空閑內存。這個殺死進程來節省內存的進程,我們姑且叫它 OOM killer。我們可以通過設置--oom-kill-disable選項來禁止 OOM killer 殺死容器內進程。但請確保只有在使用了-m/--memory選項時才使用--oom-kill-disable禁用 OOM killer。如果沒有設置-m選項,卻禁用了 OOM-killer,可能會造成出現 out-of-memory 錯誤時,系統通過殺死宿主機進程或獲取更改內存。
--memory-swappiness設置
值為0將關閉匿名頁面交換,值100將所有匿名頁面設置為可交換,默認情況下,如果未設置--memory-swappiness,則值將從主機繼承。








