06-Docker资源限制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了06-Docker资源限制相关的知识,希望对你有一定的参考价值。

参考技术A

默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源,Docker 提供了控制容器可以限制容器使用多少内存或CPU 的方法,设置 docker run 命令的运行时配置标志。
其中许多功能都要求宿主机的内核支持Linux 功能,要检查支持,可以使用 docker info 命令,如果内核中禁用了某项功能,可能会在输出结尾处看到警告,如下所示:

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

linux 会为每个进程算一个分数,最终它会将分数最高的进程kill。

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

--memory-swap , 只有在设置了 --memory 后才会有意义。使用Swap,可以让容器将超出限制部分的内存置换到磁盘上,

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

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

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

接着宿主机限制容器最大内存使用:

宿主机cgroup 验证:

--memory-reservation

宿主机cgroup 验证:

一个宿主机,有几十个核的CPU,但是宿主机上可以同时运行成百上千个不同的进程用以处理不同的任务,多进程共用一个CPU 的核心依赖计数就是为可压缩资源,即一个核心的CPU 可以通过调度而运行多个进程,但是同一个单位时间内只能有一个进程在CPU 上运行,那么这么多的进程怎么在CPU 上执行和调度的呢?

Linux kernel 进程的调度基于CFS(Completely Fair Scheduler),完全公平调度

默认情况下,每个容器对主机CPU 周期的访问权限是不受限制的,但是我们可以设置各种约束来限制给定容器访问主机的CPU周期,大多数用户使用的是默认的CFS 调度方式,在Docker 1.13 及更高版本中,还可以配置实时优先级。
参数

对于一台2核的服务器,如果不做限制,容器会把宿主机的CPU 全部占完:

在宿主机使用 dokcer stats 命令查看容器运行状态:

在宿主机查看CPU 限制参数:

宿主机CPU 利用率:

只给容器分配最多1核宿主机CPU 利用率

宿主机cgroup 验证:

当前容器状态:

宿主机CPU利用率:

容器运行状态:

宿主机CPU利用率:

启动两个容器,stress1 的 --cpu-shares 值为1000 , stress2 的 --cpu-shares 为500,观察最终效果, --cpu-shares 值为1000 的 stress1的CPU 利用率基本是 --cpu-shares 为500 的 stress1的 2 倍:

验证容器运行状态:

宿主机cgroups验证:

动态修改CPU shares的值
--cpu-shares 的值可以在宿主机cgroup 动态修改,修改完成后立即生效,其值可以调大也可以减小。

验证修改后的容器运行状态:

docker资源隔离与资源限制

Dockder的namespace

docker资源隔离与资源限制_docker

docker资源隔离与资源限制_docker_02

docker资源隔离与资源限制_docker_03

docker资源隔离与资源限制_docker_04

docker资源隔离与资源限制_docker_05

以上是关于06-Docker资源限制的主要内容,如果未能解决你的问题,请参考以下文章

k8s容器资源限制,资源监控

k8s容器资源限制,资源监控

Kubernetes(k8s)之容器资源限制

14.容器资源需求资源限制及HeapSter

当一个 pod 资源限制没有超过,而单个容器的资源限制超过了,会发生啥?

docker私有仓库registry和cgroup资源限制