重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
默認(rèn)情況下容器使用的資源是不受限制的。也就是可以使用主機內(nèi)核調(diào)度器所允許的大資源。但是在容器的使用過程中,經(jīng)常需要對容器可以使用的主機資源進(jìn)行限制,本文介紹如何限制容器可以使用的主機內(nèi)存。
為什么要限制容器對內(nèi)存的使用?
限制容器不能過多的使用主機的內(nèi)存是非常重要的。對于 linux 主機來說,一旦內(nèi)核檢測到?jīng)]有足夠的內(nèi)存可以分配,就會扔出 OOME(Out Of Memmory Exception),并開始?xì)⑺酪恍┻M(jìn)程用于釋放內(nèi)存空間。糟糕的是任何進(jìn)程都可能成為內(nèi)核獵殺的對象,包括 docker daemon 和其它一些重要的程序。更危險的是如果某個支持系統(tǒng)運行的重要進(jìn)程被干掉了,整個系統(tǒng)也就宕掉了!這里我們考慮一個比較常見的場景,大量的容器把主機的內(nèi)存消耗殆盡,OOME 被觸發(fā)后系統(tǒng)內(nèi)核立即開始?xì)⑦M(jìn)程釋放內(nèi)存。如果內(nèi)核殺死的第一個進(jìn)程就是 docker daemon 會怎么樣?結(jié)果是所有的容器都不工作了,這是不能接受的!
針對這個問題,docker 嘗試通過調(diào)整 docker daemon 的 OOM 優(yōu)先級來進(jìn)行緩解。內(nèi)核在選擇要殺死的進(jìn)程時會對所有的進(jìn)程打分,直接殺死得分最高的進(jìn)程,接著是下一個。當(dāng) docker daemon 的 OOM 優(yōu)先級被降低后(注意容器進(jìn)程的 OOM 優(yōu)先級并沒有被調(diào)整),docker daemon 進(jìn)程的得分不僅會低于容器進(jìn)程的得分,還會低于其它一些進(jìn)程的得分。這樣 docker daemon 進(jìn)程就安全多了。
我們可以通過下面的腳本直觀的看一下當(dāng)前系統(tǒng)中所有進(jìn)程的得分情況:
#!/bin/bash for proc in $(find /proc -maxdepth 1 -regex '/proc/[0-9]+'); do printf "%2d %5d %s\n" \ "$(cat $proc/oom_score)" \ "$(basename $proc)" \ "$(cat $proc/cmdline | tr '\0' ' ' | head -c 50)" done 2>/dev/null | sort -nr | head -n 40