默认状况下容器中运行的程序能够尽量吃掉宿主机的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
只占用了一个核心的资源。