Docker在默認(rèn)情況下,容器使用的資源是不受限制的。也就是可以使用主機(jī)內(nèi)核調(diào)度器所允許的資源。但是在容器的使用過程中,經(jīng)常需要對容器可以使用的主機(jī)資源進(jìn)行限制使容器之間會盡量不互相影響。
Docker內(nèi)存控制OOME在linxu系統(tǒng)上,如果內(nèi)核探測到當(dāng)前宿主機(jī)已經(jīng)沒有可用內(nèi)存使用,那么會拋出一個OOME(Out Of Memory Exception:內(nèi)存異常 ),并且會開啟killing去殺掉一些進(jìn)程。
一旦發(fā)生OOME,任何進(jìn)程都有可能被殺死,包括docker daemon在內(nèi),為此,docker特地調(diào)整了docker daemon的OOM_Odj優(yōu)先級,以免他被殺掉,但容器的優(yōu)先級并未被調(diào)整。經(jīng)過系統(tǒng)內(nèi)部復(fù)制的計(jì)算后,每個系統(tǒng)進(jìn)程都會有一個OOM_Score得分,OOM_Odj越高,得分越高,(在docker run的時候可以調(diào)整OOM_Odj)得分高的優(yōu)先被kill掉,當(dāng)然,也可以指定一些特定的重要的容器禁止被OMM殺掉,在啟動容器時使用 –oom-kill-disable=true指定。
Docker 提供的內(nèi)存限制功能有以下幾點(diǎn):
容器能使用的內(nèi)存和交換分區(qū)大小。
容器的核心內(nèi)存大小。
容器虛擬內(nèi)存的交換行為。
容器內(nèi)存的軟性限制。
是否殺死占用過多內(nèi)存的容器。
容器被殺死的優(yōu)先級
一般情況下,達(dá)到內(nèi)存限制的容器過段時間后就會被系統(tǒng)殺死。
執(zhí)行docker run命令時能使用的和內(nèi)存限制相關(guān)的所有選項(xiàng)如下。
-m,--memory 內(nèi)存限制,格式是數(shù)字加單位,單位可以為 b,k,m,g。最小為 4M
--memory-swap 內(nèi)存+交換分區(qū)大小總限制。格式同上。必須必-m設(shè)置的大
--memory-reservation 內(nèi)存的軟性限制。格式同上
--oom-kill-disable 是否阻止 OOM killer 殺死容器,默認(rèn)沒設(shè)置
--oom-score-adj 容器被 OOM killer 殺死的優(yōu)先級,范圍是[-1000, 1000],默認(rèn)為 0
--memory-swappiness 用于設(shè)置容器的虛擬內(nèi)存控制行為。值為 0~100 之間的整數(shù)
--kernel-memory 核心內(nèi)存限制。格式同上,最小為 4M
使用Docker自帶的-m操作進(jìn)行內(nèi)存限制時可能會由于內(nèi)核限制所以出現(xiàn)以下提示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設(shè)置
只有當(dāng)--memory設(shè)置之后,--memory-swap 才會生效
1、如果--memory-swap設(shè)置為正整數(shù),那么這兩個--memory和 --memory-swap必須設(shè)置。--memory-swap表示可以使用的內(nèi)存和交換總量,并--memory控制非交換內(nèi)存使用的數(shù)量。因此,如果--memory=300m和--memory-swap=1g,容器可以使用300m的內(nèi)存和700m(1g - 300m)交換。
2、如果--memory-swap設(shè)置為0,則忽略該設(shè)置,并將該值視為未設(shè)置。
3、如果--memory-swap設(shè)置為與值相同的值--memory,并且--memory設(shè)置為正整數(shù),則不使用swap。
4、如果--memory-swap未設(shè)置并且--memory已--memory設(shè)置,則如果主機(jī)容器配置了交換內(nèi)存,則容器可以使用兩倍于設(shè)置的交換。例如,如果--memory=300m和--memory-swap未設(shè)置,容器可以使用300m的內(nèi)存和600m的交換。
5、如果--memory-swap明確設(shè)置為-1,則允許容器使用無限制交換,最多可達(dá)主機(jī)系統(tǒng)上可用的數(shù)量。
--memory-reservation設(shè)置
Memory reservation 是一種軟性限制,用于節(jié)制容器內(nèi)存使用。給--memory-reservation設(shè)置一個比-m小的值后,雖然容器最多可以使用-m使用的內(nèi)存大小,但在宿主機(jī)內(nèi)存資源緊張時,在系統(tǒng)的下次內(nèi)存回收時,系統(tǒng)會回收容器的部分內(nèi)存頁,強(qiáng)迫容器的內(nèi)存占用回到--memory-reservation設(shè)置的值大小。
--oom-kill-disable設(shè)置
默認(rèn)情況下,在出現(xiàn) out-of-memory(OOM) 錯誤時,系統(tǒng)會殺死容器內(nèi)的進(jìn)程來獲取更多空閑內(nèi)存。這個殺死進(jìn)程來節(jié)省內(nèi)存的進(jìn)程,我們姑且叫它 OOM killer。我們可以通過設(shè)置--oom-kill-disable選項(xiàng)來禁止 OOM killer 殺死容器內(nèi)進(jìn)程。但請確保只有在使用了-m/--memory選項(xiàng)時才使用--oom-kill-disable禁用 OOM killer。如果沒有設(shè)置-m選項(xiàng),卻禁用了 OOM-killer,可能會造成出現(xiàn) out-of-memory 錯誤時,系統(tǒng)通過殺死宿主機(jī)進(jìn)程或獲取更改內(nèi)存。
--memory-swappiness設(shè)置
值為0將關(guān)閉匿名頁面交換,值100將所有匿名頁面設(shè)置為可交換,默認(rèn)情況下,如果未設(shè)置--memory-swappiness,則值將從主機(jī)繼承。
當(dāng)前題目:云計(jì)算核心技術(shù)Docker教程:Docker內(nèi)存管理
文章來源:http://chinadenli.net/article22/cpogjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、服務(wù)器托管、網(wǎng)站收錄、搜索引擎優(yōu)化、網(wǎng)站改版、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)