docker快速入門6-資源限制及驗證

docker快速入門6-資源限制及驗證

默認狀況下容器中運行的程序能夠儘量吃掉宿主機的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使用

--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左右。

CPU限制驗證

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

只佔用了一個核心的資源。

相關文章
相關標籤/搜索