Docker資源限制


在默認的情況下,docker沒有對容器進行硬件資源的限制,當容器負載過高時會盡肯能第占用宿主機資源。在這基礎上,docker提供了針對容器的內存,CPUIO資源的控制方式。(真正可以控制的只有內存和cpu)
Docker內存控制OOME在linxu系統上,如果內核探測到當前宿主機已經沒有可用內存使用,那么會拋出一個OOME(Out Of Memory Exception:內存異常 ),並且會開啟killing去殺掉一些進程。
一旦發生OOME,任何進程都有可能被殺死,包括docker daemon在內,為此,docker特地調整了docker daemon的OOM_Odj優先級,以免他被殺掉,但容器的優先級並未被調整。經過系統內部復制的計算后,每個系統進程都會有一個OOM_Score得分,OOM_Odj越高,得分越高,(在docker run的時候可以調整OOM_Odj)得分最高的優先被kill掉,當然,也可以指定一些特定的重要的容器禁止被OMM殺掉,在啟動容器時使用 –oom-kill-disable=true指定。
內存限制的部分參數

  • -m : 指定容器內存

  • --memory-swap : 設置容器交換分區大小,設置交換分區必須要設置 -m:依賴前者,容器內與交換分區的關系比較特別,如下:

--memory-swap --memory 功能
正數S 正數M 容器可用總空間為S,其中ram為M,swap為(S-M),若S=M,則無可用swap資源
O 正數M 相當於未設置swap (unset)
unset 正數M 若主機(Docker Host)啟用了swap,則容器的可用swap為2*M
-l 正數M 若主機(Docker Host)啟用了swap,則容器的可使用最大值主機上的所有swap空間的swap資源

注意:在容器內使用free命令可以看到的swap空間並不具有其所展現出的空間指示意義

  • --oom-kill-disable=true : 禁止容器被oom殺掉,使用該參數要與-m一起使用

CPU的限制

默認情況下,每一個容器可以使用宿主機上的所有cpu資源,但大多數系統使用的資源調度算法是CFS(完全公平調度器),它公平調度每一個工作進程。進程分cpu密集型io密集型兩類。系統內核會實時監測系統進程,當某個進程占用cpu資源時間過長時,內核會調整該進程的優先級。

CPU資源分配策略

共享cpu資源

  • --cpu-share: cpu資源提供給一組容器使用,組內的容器按比例使用cpu資源,當容器處於空閑狀態時,cpu資源被負載大的容器占用,(按壓縮方式比例分配),當空閑進行運行起來時,cpu資源會被分配到其他容器
  • --cpus= value : 指定 cpu的核心數量,這種方式直接限定了容器可用的cpu資源
  • --cpuset-cpus: 指定容器只能運行在哪個cpu核心上(綁定cpu);核心使用0,1,2,3編號;–cpu-share會隨機指定cpu

啟動一個容器並限制資源

啟動一個centos容器,限制其內存為1G ,可用cpu數為2

[root@localhost ~]# docker run --name os1 -it -m 1g --cpus=2 centos:latest bash

啟動容器后,可以使用docker 的監控指令查看容器的運行狀態

  • docker top 容器名: 查看容器的進程,不加容器名即查看所有
  • docker stats 容器名:查看容器的CPU,內存,IO 等使用信息
[root@localhost ~]# docker stats os1
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
f9420cbbd2a9        os1                 45.94%              47.09MiB / 1GiB     4.60%               54.6MB / 352kB      0B / 21.1MB         3

在容器中安裝docker容器壓測工具 stress

#先安裝一些基礎工具
[root@f9420cbbd2a9 /]# yum install wget gcc gcc-c++ make -y
#下載stress
[root@f9420cbbd2a9 ~]# wget http://people.seas.harvard.edu/~apw/stress/stress-1.0.4.tar.gz
#安裝
[root@f9420cbbd2a9 ~]# tar zxf stress-1.0.4.tar.gz
[root@f9420cbbd2a9 ~]# cd stress-1.0.4
[root@f9420cbbd2a9 stress-1.0.4]./configure
[root@f9420cbbd2a9 stress-1.0.4]# make
[root@f9420cbbd2a9 stress-1.0.4]# make install

在容器使用stress指令進行負載壓測

[root@f9420cbbd2a9 ~]# stress  -m 1204m --vm 2
#模擬出4個繁忙的進程消耗cpu,然后使用-m 模擬進程最大使用的內存數1024,使用--vm 指定進程數
#更多參數使用 stress --help查看

使用docker指令查看容器運行狀態,可以os1容器的內存和cpu都得到了限制,即使給壓測時超出了最大內存,也不會額外占用資源

[root@localhost ~]# docker stats os1
CONTAINER ID       NAME       CPU %            MEM USAGE / LIMIT  MEM %         NET I/O              BLOCK I/O           PIDS
f9420cbbd2a9        os1          127.46%          319.7MiB / 1GiB     31.22%        54.8MB / 356kB      0B / 33.6MB          9


免責聲明!

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



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