docker快速入门6-资源限制及验证

docker快速入门6-资源限制及验证

默认情况下容器中运行的程序可以尽可能吃掉宿主机的CPU、Memory以及IO资源。

CPU资源是可压缩性资源,Memory是非压缩性资源。是否可压缩性表现为当该资源被占用完时,再有其他程序向内核索要时,压缩性资源就会让其等待直到有资源分配后分配给它;非压缩性资源则会直接抛异常。

在Linux主机上,假如内核探测到没有足够的内存资源来运行重要的系统函数时,就会抛出一个OOME(Out Of Memory Exception),并且开始Kill掉一些进程来释放内存资源。一旦发生OOME,任何进程都有可能被杀死,包括docker daemon在内。为此,Docker特地调整了docker daemon的OOM优先级,以免它被内核杀掉,但容器的优先级并未被调整。

限制内存使用

-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空间并不具有其所展现出的空间指示意义,即没有参考意义,不要使用。

--oom-kill-disable 必须先设置-m,当系统出现OOM时内核不会kill该容器

限制cpu使用

--cpu=<value> 限制容器使用cpu的核心数,但不限制运行在哪个核心上

--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

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

猜你喜欢

转载自blog.51cto.com/zhaochj/2537386