Docker記憶體管理

2021-10-19 04:01:02 字數 2362 閱讀 5479

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

–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 錯誤時,系統通過殺死宿主機程序或獲取更改記憶體。

記憶體管理 記憶體管理概述

儲存器的發展方向是高速 大容量和小體積,即儲存器嘗試更高讀寫速度,更大儲存容量,更小物理體積。在計算機中,常見的儲存器有 暫存器,快取,記憶體,硬碟,一般硬碟之類的輔助儲存器又稱外存。在平均讀寫速度上,有 暫存器 快取 記憶體 外存 在單位容量 上,有 外存 記憶體 快取 暫存器 cpu處理器只能直...

docker記憶體限制

部落格 m 和 memory swap docker run it rm m 100m memory swap 1 ubuntu stress latest bin bash指定限制記憶體大小並且設定 memory swap 值為 1,表示容器程式使用記憶體受限,而 swap 空間使用不受限制 宿主...

docker記憶體限制

預設docker容器可以使用宿主機所有的記憶體和cpu,我們可以通過 docker run 來限制記憶體和cpu的使用。有的系統核心不支援 linux capabilities.可以通過 docker info 命令來檢查,如果系統核心不支援,會有如下報錯 warning no swap limit...