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

只占用了一个核心的资源。

相关文章
相关标签/搜索