Docker资源限制详解

容器资源限制:

对于Linux 主机,如果没有足够的内容来执行其他重要的系统任务,将会抛出 OOM (Out of Memory Exception,内存溢出、内存泄漏、 内存异常), 随后系统会开始杀死进程以释放内存,凡是运行在宿主机的进程都有可能被 kill,包括Dockerd和其它的应用程序,如果重要的系统进程被Kill,会导致和该进程相关的服务全部宕机。

默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源,Docker提供了控制容器可以限制容器使用多少内存或CPU的方法,运行docker run命令创建容器的时候可以进行资源限制。
 
OOM优先级机制:
linux会为每个进程算一个分数,最终他会将分数最高的进程kill
/proc/PID/oom_score_adj  #范围为-1000到1000,值越高越容易被宿主机kill掉,如果将该值设置为-1000,则进程永远不会被宿主机kernel kill。
/proc/PID/oom_adj  #范围为-17到+15,取值越高越容易被干掉,如果是-17,则表示不能被kill,该设置参数的存在是为了和旧版本的Linux内核兼容。
/proc/PID/oom_score  #这个值是系统综合进程内存消耗量、CPU时间(utime + stime)、存活时间(uptime - start time)和oom_adj计算出的进程得分,消耗内存越多得分越高,越容易被宿主机kernel强制杀死。

注:

Docker 可以强制执行硬性内存限制,即只允许容器使用给定的内存大小。
Docker 也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了。
大部分的选项取正整数,跟着一个后缀b,k, m,g,,表示字节,千字节,兆字节或千兆字节。
--oom-score-adj #宿主机kernel对进程使用的内存进行评分,评分最高的将被宿主机内核kill掉(越低越不容易被kill),可以指定一个容器的评分为较低的负数,但是不推荐手动指定。 
--oom-kill-disable #对某个容器关闭oom机制。

物理内存限制参数: 

-m or --memory #限制容器可以使用的最大内存量,如果设置此选项,最小存值为6m(6兆字节)。
--memory-reservation #允许指定小于--memory的软限制,当Docker检测到主机上的争用或内存不足时会激活该限制,如果使用--memory-reservation,则必须将其设置为低于--memory才能使其优先。 因为它是软限制,所以不能保证容器不超过限制。

物理内存限制验证

假如一个容器未做内存使用限制,则该容器可以利用到系统内存最大空间,默认创建的容器没有做内存资源限制
docker pull lorel/docker-stress-ng #测试镜像 
docker run -it --rm lorel/docker-stress-ng –help #查看帮助信息

Example: stress-ng --cpu 8 --io 4 --vm 2 --vm-bytes 128M --fork 4 --timeout 10s

1、不限制容器内存:
启动两个工作进程,每个工作进程最大允许使用内存256M,且宿主机不限制当前容器最大内存: 
docker run -it --rm --name stress-test lorel/docker-stress-ng --vm 2 --vm-bytes 256M
docker stats
 
2、限制容器最大内存:

docker run -it --rm -m 256m --name stress-test lorel/docker-stress-ng --vm 2 --vm-bytes 256M

 

CPU限制验证:

只给容器分配最多两核宿主机CPU利用率
docker run -it --rm --cpus 2 --name stress-test lorel/docker-stress-ng --vm 4 --cpu 4
注:CPU资源限制是将分配给容器的2核心分配到了宿主机每一核心CPU上,也就是容器的总CPU值是在宿主机的每一个核心CPU分配了部分比例。
 
将容器运行到指定的CPU上:
docker run -it --rm --name stress-test --cpus 2 --cpuset-cpus 1,3 lorel/docker-stress-ng --cpu 4 --vm 4
 
 
systemd限制验证:
ps -ef | grep nginx    #过滤出目的服务的进程号
root        5351    5316  0 09:59 pts/0    00:00:00 nginx: master process nginx -g daemon off;
cat /proc/5316/cpuset   #查询进程的限制

 

cat /sys/fs/cgroup/system.slice/docker-00bbf6676e198873641b3ff67c5b4dfba603cf668bf76f0bb8e6d1f8817a8aee.scope/cpu.max    #查询cpu限制范围

cat /sys/fs/cgroup/system.slice/docker-00bbf6676e198873641b3ff67c5b4dfba603cf668bf76f0bb8e6d1f8817a8aee.scope/memory.max  #查询内存限制范围

 

 

 

 

posted @ 2022-10-31 10:10  耿筱诺  阅读(968)  评论(0编辑  收藏  举报