容器技術之Docker資源限制

  上一篇咱們聊到了docker容器的單機編排工具docker-compose的簡單使用,回顧請參考http://www.javashuo.com/article/p-aqqzxffn-nt.html;今天咱們主要來聊一聊docker容器的資源限制;一般狀況下咱們啓動一個docker容器,其內存和CPU都是同宿主機同樣大,這意味着該容器和宿主機共享相同大小的內存和CPU資源;這樣一來容器正常狀況下沒有什麼問題,假如容器裏運行的進程特別愛吃內存,極可能存在把宿主機上的內存所有吃掉,觸發內核OOM,從而致使docker daemon直接被內核殺死;爲了不這樣的尷尬局面,對啓動容器咱們有必要對容器的資源進行限制;html

  所謂OOM就是當系統上的應用申請內存資源時,發現申請不到內存,這個時候Linux內核就會啓動OOM,內核將給系統上的全部進程進行評分,經過評分得分最高的進程就會被系統第一個幹掉,從而騰出一些內存空間,若是騰出的內存空間仍是不夠該應用使用,它會繼續殺得分第二高的,直到應用有足夠的內存使用;一旦發生OOM,任何進程都有可能被殺死,包括docker daemon在內,爲此,docker特定調整了docker daemon的oom優先級,以避免發生oom被內核殺死,可是容器的oom優先級並未作任何調整;docker

  那麼對於內存資源來說,在啓動爲容器時,咱們能夠經過一些選項來指定容器的內存相關設置;以下圖bash

  提示:-m 或 --memory 用來指定容器最大可以使用的內存大小,默認狀況不指定表示共享物理宿主機的內存大小;--memory-swap 用來指定容器的內存和交換內存的總大小;對於這個參數的取值比較詭異;待會在說吧;--memory-swappiness該選項用來指定容器使用交換內存的傾向性,swap啓用有個好處就是在內存不夠使用的狀況,它能夠臨時頂替一部分,可是性能會急劇降低;因此數字越大越早使用交換內存,數字越小越晚使用交換內存,取值在0-100之間;0不表明不是用交換內存,0表示能不用交換內存,則不用,可是在無可奈何的狀況仍是會使用的,100表示只要有一絲能夠使用交換內存的但願,就使用交換內存;一般狀況在運行容器的主機上不建議使用swap設備;swap交換分區若是一旦被激活,系統性能會急劇降低,建議直接禁用;--memory-reservation該選項用來指定給系統保留的內存空間大小;--kernel-memory用來指定給內核保留的內存大小;--oom-kill-disable該選項用於指定當發生oom時,是否禁用因oom而殺死該容器進程;app

  提示:一般狀況--memory-swap這個選項必須同--memory選項一塊兒使用,不可用單獨使用;工具

  示例:限制容器使用最大內存爲256M性能

[root@docker_registry ~]# docker run --name test --rm -m 256M lorel/docker-stress-ng --vm 2

  提示:以上命令表示啓動一個名爲test的容器,限制該容器最大使用內存大小爲256M;lorel/docker-stress-ng這個進行用來壓測容器;--vm表示同時使用多少進程來作壓測;3d

  驗證:用docker stats看看咱們啓動test容器是否只能使用256M內存?htm

  提示:從上面的結果能夠看到,在咱們啓動容器時,使用-m指定內存大小的容器limit的值就是咱們指定的值,而對於沒有用-m指定的容器,默認就是同宿主機內存大小同樣;blog

  對於CPU來說,默認狀況啓動容器時,不限制CPU的資源,此時容器是共享宿主機的CPU資源,也就是說默認狀況宿主機上有幾顆cpu核心,啓動的容器就有多少顆核心;對於CPU這種可壓縮資源,不會像內存那樣,若是CPU滿載,也不會致使某個容器崩潰,緣由是由於cpu是可壓縮資源;而不一樣於內存,內存屬於不可壓縮資源,若是申請不到內存,就會出現異常,出現oom;對啓動容器來限制cpu資源,一般也是使用選項來限定;以下圖進程

  提示:--cpus用來指定容器可以使用的最大cpu核心數,例如--cpus=1.5,就表示該容器最大可以使用1.5核的CPU資源,若是宿主機上有4顆CPU核心,那麼該容器最多可把1.5顆核心跑滿;這樣說吧,若是宿主機上有4顆核心,那麼該容器若是使用--cpus限定爲1.5,那麼該容器就只能使用宿主機上的百分之150的核心;--cpu-period 和--cpu-quota該選項在docker1.13之後基本廢棄;--cpuset-cpus該選項用於指定容器可以在哪些CPU上運行;若是宿主機上有4顆CPU,--cpuset-cpus=2,3就表示該容器只能使用第2號cpu和第3號cpu;--cpu-shares該選項用於指定容器使用cpu的比例;好比宿主機上只有一個容器,而該容器啓動時指定--cpu-shares=1024,則表示,若是沒有其餘容器,則它能夠使用宿主機上的全部cpu資源,若是有第二個容器啓動時,指定cpu-shares=512,那麼第一個容器會從原來使用整個宿主機的cpu變爲使用整個宿主機的cpu的2/3;以此類推,若是有第三個,第四個,他們使用cpu資源都是按照給定的比例動態調整;

  示例:第一個容器使用--cpu-shares=256;第二個容器使用--cpu-shares=512,看看當第一個容器啓動後,看看cpu使用狀況,而後第二個容器啓動後再看看cpu使用狀況

  提示:能夠看到當第一個容器啓動時,雖然設置的cpu-shares=256,可是它仍是把全部核心幾乎都跑滿了;咱們在跑一個容器看看,看看第二個容器啓動後,第一個容器的cpu使用狀況是否有變化?

  提示:從上面的結果看,t1和t2的cpu使用比例大概是1比2;總量仍是400%並無變化;

  示例:設置容器使用1.5個CPU核心

  提示:從上面的結果能夠看到使用--cpus來限定容器使用的CPU資源,默認它會在每顆黑核心上都要使用一部分,可是重量不會超過150%;

  示例:限定容器使用CPU核心,只能在0號和3號核心上使用;

  提示:從上面的結果能夠看到,限定t1容器只能使用0號和3號CPU後,1號和2號就基本不會被使用,總量也不會增長;

相關文章
相關標籤/搜索