Docker 容器資源限制


Docker 容器資源限制

默認情況下,一個容器並沒有資源限制,並且該容器可以使用內核調度的所有資源。Docke提供了在啟動容器時設置一些參數來控制該容器使用的內存、CPU和IO。

內存

OOME:在linux中,如果Linux內核發現宿主機沒有足夠的內存來調用執行系統的某些重要功能的時候,此時就會調用OOME(Out Of Memory Exception)來殺死某些進程,以此來釋放內存。

  • 一旦發生OOME,任何進程都有可能被殺死,包括docker daemon,因此Docker調整了Docker daemon的OOM優先級,防止其被殺死,但是容器的OOM並沒有調整,此時如何內存不夠用時,內核就會根據自己的調度算法,給所有的進程進行一個評分,然后殺死分數最高的進程來釋放內存。

限制容器使用的內存資源

-m or --memory=n : 限制一個容器可以使用的最大內存,單位(b,k,m,g)
--memory-swap * : 限制一個容器可以使用的交換分區的大小,前提是必須先設置-m才能生效。
--memory-swappiness:設置容器的swap控制行為。值為0-100
--memory-reservation:設置內存的軟限制
--kernel-memory:設置核心內存的最大值
--oom-kill-disable:是否阻止OOM 殺死容器,默認為否。

--memory-swap的總結:
--memory-swap --memory
功能描述
正數S 正數M 容器可以使用的總空間為S,ram為M,swap為(S-M),如果S=M,則沒有swap資源
0 正數M 相當於沒有設置swap
unset 正數M 如果Docker host啟動了swap,則容器可用的 swap為2*M
-1 正數M 如果Docker host啟用了swap,則容器可以使用最大swap為Docker host上的所有swap空間的資源。
在容器中,free所展現出來的swap分區是無效的

CPU

默認情況,每個容器都可以使用系統的所有CPU資源。但是我們可以通過使用CFS調度器來分配容器使用的CPU資源。
CFS調度器配置

--cpus=<value>:指定容器可以使用的CPU的核心數量
--cpu-period=<value>: 指定CPU CFS的調度周期,默認是100ms
--cpu-quota=<value>: 限制CPU CFS的配額。
--cpuset-cpus: 限制使用的CPU的集合,如有四個CPU,0-3則代表全部可以使用;1,3表示可以使用第二個和第四個。
--cpu-shares: 按比例切分CPU資源(CPU共享的權重)

測試:

使用docker提供的壓測工具:docker pull lorel/docker-stress-ng
使用方法:

Example: stress-ng --cpu 8 --io 4 --vm 2 --vm-bytes 128M --fork 4 --timeout 10s

這里使用--cpu-shares按照比例來切分CPU資源,3個容器使用的CPU占比為512、1024、2048,比例為1:2:4

docker run --name stress -it --rm --cpu-shares 512 lorel/docker-stress-ng stree-ng --cpu 4
docker run --name stress1 -it --rm --cpu-shares 1024 lorel/docker-stress-ng stree-ng --cpu 4
docker run --name stress2 -it --rm --cpu-shares 2048 lorel/docker-stress-ng stree-ng --cpu 4
# docker stats

可以看到各個容器之間的cpu占比大概為1:2:4。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM