容器的资源限制介绍

2023年 10月 8日 59.7k 0

三、Docker资源限制介绍、以及在容器上进行CPU与内存资源限制的方法

OOM优先级机制

主机资源不足的时候 触发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强制 杀死。

容器不要超分 不要超过宿主机的90%

容器资源限制

对于Linux 主机,如果没有足够的内容来执行其他重要的系统任务,将会抛出 OOM (Out of Memory Exception,内存溢出、内存泄漏 内存异常)。

随后系统会开始杀死进程以释放内存,凡是运行在宿主机的进程都有可能被 kill,包括Dockerd和其它的应用程序

如果重要的系统进程被Kill,会导致和该进程相关的服务全部宕机

image.png

image.png

Docker早期使用cgroupfs进行容器的资源限制管理,然后再调用内核的cgroup进行资源限制

kubernetes后来使用systemd直接调用cgroup对进程 实现资源限制,等于绕过了docker的cgroupfs的管理,对资源限制更严格、性能更好,因此在kubernetes环境推荐使用systemd进行资源限制。

 "exec-opts": ["native.cgroupdriver=systemd"], 
 "exec-opts": ["native.cgroupdriver=cgroupfs"],

docker 限制内存参数介绍

Docker 可以强制执行硬性内存限制,即只允许容器使用给定的内存大小。
Docker 也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了。
大部分的选项取正整数,跟着一个后缀b,k, m,g,,表示字节,千字节,兆字节或千兆字节。  

--oom-score-adj #宿主机kernel对进程使用的内存进行评分,评分最高的将被宿主机内核kill掉(越低越不容易被kill),可以指定一个 容器的评分为较低的负数,但是不推荐手动指定。

--oom-kill-disable #对某个容器关闭oom机制。


# 物理内存限制参数:

-m or --memory #限制容器可以使用的最大内存量,如果设置此选项,最小存值为4m(4兆字节)。

--memory-swap #容器可以使用的交换分区大小,必须要在设置了物理内存限制的前提才能设置交换分区的限制

--memory-swappiness #设置容器使用交换分区的倾向性,值越高表示越倾向于使用swap分区,范围为0-100,0为能不用就不用,100为 能用就用。

--kernel-memory #容器可以使用的最大内核内存量,最小为4m,由于内核内存与用户空间内存隔离,因此无法与用户空间内存直接交换, 因此内核内存不足的容器可能会阻塞宿主主机资源,这会对主机和其他容器或者其他服务进程产生影响,因此不要设置内核内存大小。

--memory-reservation #允许指定小于--memory的软限制,当Docker检测到主机上的争用或内存不足时会激活该限制,如果使用-- memory-reservation,则必须将其设置为低于--memory才能使其优先。 因为它是软限制,所以不能保证容器不超过限制。

--oom-kill-disable #默认情况下,发生OOM时,kernel会杀死容器内进程,但是可以使用--oom-kill-disable参数,可以禁止oom发生在指 定的容器上,即 仅在已设置-m / - memory选项的容器上禁用OOM,如果-m 参数未配置,产生OOM时,主机为了释放内存还会杀死系统进 程。

# 交换分区限制参数
--memory-swap #只有在设置了 --memory 后才会有意义。使用Swap,可以让容器将超出限制部分的内存置换到磁盘上, WARNING:经常将内存交换到磁盘的应用程序会降低性能。

不同的--memory-swap设置会产生不同的效果:

--memory-swap #值为正数, 那么--memory和--memory-swap都必须要设置,--memory-swap表示你能使用的内存和 swap分区大小的总和,例如: --memory=300m, --memory-swap=1g, 那么该容器能够使用 300m 内存和 700m swap,即- -memory是实际物理内存大小值不变,而swap的实际大小计算方式为(--memory-swap)-(--memory)=容器可用swap。

--memory-swap #如果设置为0,则忽略该设置,并将该值视为未设置,即未设置交换分区。

--memory-swap #如果等于--memory的值,并且--memory设置为正整数,容器无权访问swap即也没有设置交换分区。

--memory-swap #如果设置为unset,如果宿主机开启了swap,则实际容器的swap值为2x( --memory),即两倍于物理内存 大小,但是并不准确(在容器中使用free命令所看到的swap空间并不精确,毕竟每个容器都可以看到具体大小,但是宿主机的 swap是有上限而且不是所有容器看到的累计大小)。

--memory-swap #如果设置为-1,如果宿主机开启了swap,则容器可以使用主机上swap的最大空间。

docker 限制cpu参数介绍

物理内存限制验证

假如一个容器未做内存使用限制,则该容器可以利用到系统内存最大空间,默认创建的容器没有做内存资源限制。

# docker pull lorel/docker-stress-ng #测试镜像  
# docker run -it --rm lorel/docker-stress-ng –help #查看帮助信息

1、不限制容器内存:
启动两个工作进程,每个工作进程最大允许使用内存256M,且宿主机不限制当前容器最大内存:

docker run -it --rm --name magedu-c1 lorel/docker-stress-ng --vm 2 --vm-bytes 256M  
# 查看资源使用
docker stats

image.png

2、限制容器最大内存:

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

# 查看资源使用
docker stats

可以看到limit 256MB
image.png

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论