默認狀況下容器中運行的程序能夠儘量吃掉宿主機的CPU、Memory以及IO資源。node
CPU資源是可壓縮性資源,Memory是非壓縮性資源。是否可壓縮性表現爲當該資源被佔用完時,再有其餘程序向內核索要時,壓縮性資源就會讓其等待直到有資源分配後分配給它;非壓縮性資源則會直接拋異常。docker
在Linux主機上,假如內核探測到沒有足夠的內存資源來運行重要的系統函數時,就會拋出一個OOME
(Out Of Memory Exception),而且開始Kill掉一些進程來釋放內存資源。一旦發生OOME,任何進程都有可能被殺死,包括docker daemon在內。爲此,Docker特意調整了docker daemon的OOM優先級,以避免它被內核殺掉,但容器的優先級並未被調整。ide
-m Or --memory=
限制分配ram(物理內存)大小函數
--memory-swap
必須先設置-m
測試
--memory-swap | --memory | 功能 |
---|---|---|
正數S | 正數M | 容器可用總空間爲S,其中ram爲M,swap爲(S-M),若S=M,則無可用swap資源 |
0 | 正數M | 至關於未設置swap(unset) |
unset | 正數M | 若主機(Docker Host)啓用了swap,則容器的可用swap爲2*M。(通常狀況下主機都會禁用swap) |
-1 | 正數M | 若主機(Docker Host)啓用了swap,則容器可以使用最大至主機上的全部swap空間的swap的資源。(通常狀況下主機都會禁用swap) |
注意:在容器內使用free命令能夠看到的swap空間並不具備其所展示出的空間指示意義,即沒有參考意義,不要使用。spa
--oom-kill-disable
必須先設置-m
,當系統出現OOM時內核不會kill該容器3d
--cpu=<value>
限制容器使用cpu的核心數,但不限制運行在哪一個核心上code
--cpu-shares
按比例分配進程
--cpuset-cpus
限制容器限制運行在哪一個核心上,默認能運行在全部的核心上內存
Docker Hub上有一個測試鏡像,名爲docker-stress-ng,先下載
root@node01:~# docker pull lorel/docker-stress-ng oot@node01:~# docker image ls | grep docker-stress-ng lorel/docker-stress-ng latest 1ae56ccafe55 4 years ago 8.1MB # 查看使用幫助 root@node01:~# docker container run -it --rm --name stress01 lorel/docker-stress-ng stress-ng --help
測試當docker run
不限制內存使用時
root@node01:~# docker container run -it --rm --name stress01 lorel/docker-stress-ng:latest stress-ng --vm 2 --vm-bytes 128M stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 2 vm` # --vm 2 表示啓動2個進程 # --vm-bytes 128M 表示每一個進程佔用內存
經過docker stats
命令查看容器佔用資源狀況
root@node01:~# docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 80595f89ec0f stress01 98.71% 267.8MiB / 1.924GiB 13.59% 906B / 0B 0B / 0B 5
內存佔用267.8MiB
,約爲128M * 2。
如今在docker run
時限制容器使用物理內容爲128M
oot@node01:~# docker container run -it --rm -m 128M --name stress01 lorel/docker-stress-ng:latest stress-ng --vm 2 --vm-bytes 128M stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 2 vm
再次查看容器資源佔用狀況
root@node01:~# docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 591ed9325404 stress01 80.32% 126MiB / 128MiB 98.41% 766B / 0B 61.4MB / 2.84GB 5
內存佔用被限制在128M
左右。
root@node01:~# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 2 On-line CPU(s) list: 0,1
測試主機有2個核心
一樣先docker run
不限制cpu
root@node01:~# docker container run -it --rm --name stress01 lorel/docker-stress-ng:latest stress-ng --cpu 4 stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 4 cpu # --cpu 4 表示啓動4個進程測試cpu
觀察cpu資源使用狀況
root@node01:~# docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 63d15bb3c554 stress01 198.76% 20.76MiB / 1.924GiB 1.05% 1.03kB / 0B 864kB / 0B 5
2個核心被所有佔用。
再來限制容器只能使用到1個核心時
root@node01:~# docker container run -it --rm --cpus 1 --name stress01 lorel/docker-stress-ng:latest stress-ng --cpu 4 stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 4 cpu
CPU資源佔用狀況以下
root@node01:~# docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 90d86e2d4340 stress01 98.32% 20.7MiB / 1.924GiB 1.05% 766B / 0B 0B / 0B 5
只佔用了一個核心的資源。