Limit a container's resources

Limit a container’s resources

譯自 https://docs.docker.com/engine/admin/resource_constraints/

默認情況下,容器沒有資源限制,可以使用系統所有資源。docker 通過 docker run 配置容器的內存,cpu, 磁盤io使用量。

Memory

Understand the risks of running out of memory

限制容器對系統內存的使用量是非常重要的。對於Linux 主機,如果沒有足夠的內容來執行重要的系統任務,將會拋出 OOM 或者 Out of Memory Exception, 隨後系統會開始殺死進程以釋放內存。每個進程都有可能被 kill,包括Dockerd和其它的應用程序。如果重要的系統進程被Kill,會導致整個系統宕機。

產生 OOM 異常時,Docker 通過調整 Docker Daemon 的優先級來減少重要系統進程被終止的風險。但是容器的優先級未做調整。這使得單個容器相比Docker Daemon和其他系統進程更容易被 kill 掉。你不應該通過手動調整--oom-score-adj--oom-disable-kill,來避開這些安全措施。

原文:
Docker attempts to mitigate these risks by adjusting the OOM priority on the Docker daemon so that it will be less likely to be killed than other processes on the system. The OOM priority on containers is not adjusted. This makes it more likely that an individual container will be killed than that the Docker daemon or other system processes will be killed. You should not try to circumvent these safeguards by manually setting --oom-score-adj to an extreme negative number on the daemon or a container, or by setting --oom-disable-kill on a container.

有關 Linux kernel’s OOM 管理,參考 Out of Memory Management

可以通過以下建議來減少 OOM 帶來的風險:

  • Perform tests to understand the memory requirements of your application before placing it into production.
  • Ensure that your application runs only on hosts with adequate resources.
  • Limit the amount of memory your container can use, as described below.
  • Be mindful when configuring swap on your Docker hosts. Swap is slower and less performant than memory but can provide a buffer against running out of system memory.
  • Consider converting your container to a service, and using service-level constraints(約束) and node labels to ensure that the application runs only on hosts with enough memory

Limit a contains’s access to memory

Docker 可以強制執行硬性內存限制,即只允許容器使用給定的內存大小。
Docker 也可以執行非硬性內存限制,即容器可以使用儘可能多的內存,除非內核檢測到主機上的內存不夠用了。

Option Description
-m or --memory 容器能使用的內存最大值。如果設置了該值,所允許的最小值爲4字節
--memory-swap * 容器可以交換到磁盤的內存大小(即容器可用的 swap 大小)。 details
--memory-swappiness 默認情況下,主機內核可以置換的容器所使用匿名頁的百分比。 --memory-swappiness的值在 0 ~ 100之間。details
--memory-reservation 允許你設置一個比 --memory 小非硬性限制。當docker檢測到競爭或者主機內存不足時該配置被激活。如果配置了 --memory-reservation, 一定要比 --memory 值小。因爲是非硬性限制,所以不能保障容器佔用的內存不會超出該值限定的範圍。
--kernel-memory 容器所能使用的最大內核內存。最小值爲4m。由於內核內存無法被置換,佔用大量內核內存的容器可能會使主機以及主機上其他的容器受影響。detail
--oom-kill-disable 默認情況下,發生 OOM 時,kernel會殺死容器內進程。使用 --oom-kill-disable 可以阻止這種情況發生。使用該參數的同事,需要配置--memory。如果-m 參數未配置,產生OOM時,主機爲了釋放內存會殺死系統進程

--memory-swap detail


--memory-swap 只有在設置了 --memory 後纔會有意義。使用Swap,可以讓容器將超出限制部分的內存置換到磁盤上。swap過於頻繁的話,會影響系統性能。

不同的設置會產生不同的效果:

  • --memory-swap 值爲正整數, 那麼--memory--memory-swap都必須要設置。--memory-swap 表示你能使用的內存和swap分區大小的總和。eg. --memory=300m, --memory-swap=1g, 那麼該容器能夠使用 300m 內存和 700m swap.
  • --memory-swap=0, 表示使用默認值。這種情況下,容器能使用的內存大小爲 a,能使用的交換分區大小也爲 a。因爲 Docker 默認容器交換分區的大小和內存相同。
    如果在容器中運行一個一直不停申請內存的程序,你會觀察到該程序最終能佔用的內存大小爲 2a。
    eg: $ docker run -m 1G ubuntu:16.04,該容器能使用的內存大小爲 1G,能使用的 swap 分區大小也爲 1G。容器內的進程能申請到的總內存大小爲 2G。
  • --memory-swap的值和--memory的值一樣。同--memory-swap=0一樣。
  • --memory-swap 未被設置,--memory=x.容器可以使用 x 內存, 2x swap。
  • --memory-swap=-1, 容器可以使用任意大小的swap,上限不得超過主機swap大小。

--memory-swappiness detail


  • 0 , 表示關閉匿名頁置換
  • 100, 所有匿名頁都可交換
  • default(即不設置 --memory-swappiness), 值會從主機上繼承。

--memory-reservation detail

官方網站上並無詳細介紹,這裏引用http://blog.csdn.net/candcplusplus/article/details/53728507中的一段話:

Memory reservation 是一種軟性限制,用於節制容器內存使用。給--memory-reservation設置一個比-m小的值後,雖然容器最多可以使用-m使用的內存大小,但在宿主機內存資源緊張時,在系統的下次內存回收時,系統會回收容器的部分內存頁,強迫容器的內存佔用回到--memory-reservation設置的值大小。

沒有設置時(默認情況下)--memory-reservation的值和-m的限定的值相同。將它設置爲 0 會設置的比-m的參數大 等同於沒有設置。

Memory reservation 是一種軟性機制,它不保證任何時刻容器使用的內存不會超過--memory-reservation限定的值,它只是確保容器不會長時間佔用超過--memory-reservation限制的內存大小。

例如:

$ docker run -it -m 500M --memory-reservation 200M ubuntu:16.04 /bin/bash

如果容器使用了大於 200M 但小於 500M >內存時,下次系統的內存回收會嘗試將容器的內存鎖緊到 200M 以下。

例如:

$ docker run -it --memory-reservation 1G ubuntu:16.04 /bin/bash

容器可以使用儘可能多的內存。--memory-reservation確保容器不會長時間佔用太多內存。

--kernel-memory details


內核內存限制用分配給容器的總體內存來表示。 考慮以下情況:

  • Unlimited memory, unlimited kernel memory: 默認行爲
  • Unlimited memory, limited kernel memory: 當所有cgroup所需的內存量大於主機上實際存在的內存量時,這是適當的。 您可以將內核內存配置爲永遠不會超過主機上可用的內存,而需要更多內存的容器需要等待。
  • Limited memory, umlimited kernel memory: 整體內存受限,但內核內存不受限
  • Limited memory, limited kernel memory: 限制用戶和內核內存對於調試與內存有關的問題都很有用。 如果一個容器正在使用意外的任何一種類型的內存,它將耗盡內存而不會影響其他容器或主機。 在此設置中,如果內核內存限制低於用戶內存限制,則內存內存不足會導致容器遇到OOM錯誤。 如果內核內存限制高於用戶內存限制,則內核限制不會導致容器遇到OOM。

CPU limitation

to be continue

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章