容器资源限制
资源限制
在我们使用docker跑容器的时候,但从理论上来说,只要不对容器做限制,那么他是有可能把你的物理机的计算资源给占满的,为了避免这种情况发生,所以我们可以对容器做一定的限制
内存限制
我们先通过命令查看容器占用的资源
[root@docker ~]# free -h
total used free shared buff/cache available
Mem: 3.8Gi 724Mi 859Mi 59Mi 2.3Gi 2.8Gi
Swap: 3.9Gi 10Mi 3.9Gi
[root@docker ~]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
9a7eace0b2a4 nginx 0.00% 6.609MiB / 3.798GiB 0.17% 162MB / 163MB 1.7MB / 0B 3
在这里我们可以看见 cpu占用率目前是0 内存使用了6.6M,没有对内存做限制,我们物理机的内存也就是3.8G,也就是说,只要这个容器里面跑的任务足够吃内存,那么他是会将我们物理机的内存给用光的
所以我们现在来看看如何限制容器的资源
我现在启动一个centos的容器,限制他的内存最多可以使用500M
如果不知道使用什么参数可以使用 docker help run 去查看帮助
[root@docker ~]# docker run -itd --name os1 -m 500m centos:7
[root@docker ~]# docker stats os1
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
af387346eb9c os1 0.00% 1.395MiB / 500MiB 0.28% 946B / 0B 0B / 0B 1
现在我们可以看见他的内存的LIMIT变成了500m,那么如果容器的内存用超了会发生什么呢?
是会直接被停止还是不让这个容器运行其他的任务了呢,我们可以来看看
# 我们将内存限制到6M,然后我们在容器内运行一些任务来看看
[root@docker ~]# docker run -itd --name os2 -m 6m centos:7
63187fd92ff985c7ca0f531b69a4d86bb29efecb260aeba7e058846ee65a6878
[root@docker ~]# docker stats os2
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
63187fd92ff9 os2 0.00% 1.398MiB / 6MiB 23.31% 656B / 0B 0B / 0B 1
# 我们现在可以看见,他的内存被限制到了6m,那么我们进入容器执行一些命令
# 我们使用dd命令,dd命令不指定direct的话他是会先将内容读到内存然后再下盘的
# 这条命令的意思是写一个5M的文件,写到/tmp/test1 然后这5M是会先读到内存里的
[root@63187fd92ff9 /]# dd if=/dev/zero of=/tmp/test1 bs=5M count=1
1+0 records in
1+0 records out
5242880 bytes (5.2 MB) copied, 0.136385 s, 38.4 MB/s
# 我们可以发现,他是可以成功的
# 我们再来写1个10M的文件
[root@63187fd92ff9 /]# dd if=/dev/zero of=/tmp/test2 bs=10M count=1
Killed
[root@63187fd92ff9 /]# yum install vim
Killed
我们可以发现,当他内存不够的时候,他是会直接kill掉这个任务的,并不会执行,这个容器也没有被docekr停止掉
所以结论就是当容器的内存不够的时候,那么这个容器暂时是起不了新的任务的
cpu限制
# 我们首先来使用lscpu看看cpu的信息
[root@docker ~]# 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
# 我们可以看见CPU(s)这里写的是2,那么说明我们的物理机是有2个cpu核心的
# 下一行的在线cpu编号是0和1
# 我们首先限制这个容器的所有任务都必须跑在cpu0上,这样可以避免频繁的cpu上下文切换
[root@docker ~]# docker run -itd --name os4 --cpuset-cpus 0 centos:7
8474df87ae10bb638712a3913cea2733ae2556f3bf3253ba47f888b7811bee52
# 我们现在进入这个容器,执行命令,然后再退出来查看
[root@docker ~]# docker exec -it os4 /bin/bash
# 这条命令并不会发生什么,但是会一直持续跑
[root@8474df87ae10 /]# cat /dev/zero > /dev/null &
[1] 28
[root@8474df87ae10 /]# cat /dev/zero > /dev/null &
[2] 29
[root@8474df87ae10 /]# cat /dev/zero > /dev/null &
[3] 30
[root@8474df87ae10 /]# cat /dev/zero > /dev/null &
[4] 31
[root@8474df87ae10 /]# jobs
[1] Running cat /dev/zero > /dev/null &
[2] Running cat /dev/zero > /dev/null &
[3]- Running cat /dev/zero > /dev/null &
[4]+ Running cat /dev/zero > /dev/null &
# 我们现在使用快捷键 Ctrl+p+q退出容器,在物理机上查看这个任务是否跑在了0号cpu上
[root@docker ~]# ps mo pid,comm,psr `pgrep cat`
PID COMMAND PSR
151675 cat -
- - 0
151693 cat -
- - 0
151777 cat -
- - 0
151778 cat -
- - 0
# 这里显示的psr就是这个任务跑在哪个cpu上,这里全都是0,所以这个限制是生效的
本文来自博客园,作者:FuShudi,转载请注明原文链接:https://www.cnblogs.com/fsdstudy/p/17949513