在默認的情況下,docker沒有對容器進行硬件資源的限制,當容器負載過高時會盡肯能第占用宿主機資源。在這基礎上,docker提供了針對容器的內存,CPU
,IO
資源的控制方式。(真正可以控制的只有內存和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