首页 Docker教程docker-容器资源限制

Docker compse实战案例-实现单机版的Haproxy+Nginx+Tomcat

docker-可视化容器管理工具Portainer

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

docker 的资源限制

docker 资源限制

容器资源限制介绍

官方文档:https://docs.docker.com/config/containers/resource_constraints/

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

可通过修改内核参数消除以上警告

官方文档:https://docs.docker.com/install/linux/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities

范例:

OOM (Out of Memory Exception)

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

范例:OOM发生后的日志信息

docker-容器资源限制插图

产生 OOM 异常时, Dockerd尝试通过调整 Docker 守护程序上的 OOM 优先级来减轻这些风险,以便它比系统上的其他进程更不可能被杀死但是容器 的 OOM 优先级未调整, 这使得单个容器被杀死的可能性比 Docker守护程序或其他系统进程被杀死的可能性更大,不推荐通过在守护程序或容器上手动设置– oom -score-adj为极端负数,或通过在容器上设置 — oom-kill-disable来绕过这些安全措施

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 + 、存活时间 (uptime – start time) 和 oom_adj 计算出的进程得分 ,消耗内存越多得分越高,容易被宿主机 kernel 强制杀死

范例:

容器的内存限制

Docker 可以强制执行硬性内存限制,即只允许容器使用给定的内存大小。可以强制执行硬性内存限制,即只允许容器使用给定的内存大小。
Docker 也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了

内存相关选项

以下设置大部分的选项取正整数,跟着一个后缀bkmg,,表示字节,千字节,兆字节或千兆字节

选项 描述
-m--memory= 容器可以使用的最大内存量,硬限制,此选项最小允许值为4m(4 MB),此项较常用
--memory-swap* 允许此容器交换到磁盘的内存量
--memory-swappiness 设置容器使用交换分区的倾向性,值越高表示越倾向于使用swap分区,范围为0-100,0为能不用就不用,1000为能用就用
--memory-reservation 允许 指定小于 — memory 的软限制 ,当 Docker 检测到主 机上的争用 或内存不足时会激活该限制,如果使– memorymemory-reservationreservation,则必须 将其设置为低于 — memory 才能使其优先。 因为它是软限制,所以不能保证容器不超过限制
--kernel-memory 容器可以使用的最大内核内存量,最小为 4m,由于内核内存与用户空间内存隔离,因此无法与用户空间内存直接交换,因此内核内存不足的容器可能会阻塞宿主主机资源,这会对主机和其他容器或者其他服务进程产生影响,因此不要设置内核内存大小此项设置
--oom-kill-disable 默认情况下,如果发生内存不足(OOM)错误,则内核将终止容器中的进程。要更改此行为,请使用该--oom-kill-disable选项。仅在设置了该-m/--memory选项的容器上禁用OOM。如果-m未设置该标志,则主机可能会用完内存,内核可能需要终止主机系统的进程以释放内存

范例:

范例:

swap限制

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

范例:

stress-ng 压力测试工具

docker-容器资源限制插图(1)

stress-ng是一个压力测试工具,可以通过软件仓库进行安装,也提供了docker版本的容器

docker-容器资源限制插图(2)

范例:软件包方式安装

范例:容器安装

范例:查看帮助

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

范例:默认一个works 分配256M内存,2个即占512M内存

范例:指定内存最大值

范例:

范例:OOM

范例:查看内存限制

范例:内存限制200m

范例:内存大小软限制:

关闭OOM 机制:

范例:关闭OOM机制

交换分区限制:

范例:

kubernets 对swap的要求

K8s 1.8.3更新日志:
宿主机开启交换分区,会在安装之前的预检查环节提示相应错误信息: https://github.com/kubernetes/kubernetes/blob/release-1.8/CHANGELOG-1.8.md

docker-容器资源限制插图(3)

容器的CPU限制

容器的CPU限制介绍

官方文档说明:https://docs.docker.com/config/containers/resource_constraints/

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

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

服务器资源密集型

  • CPU 密集型的场景:优先级越低越好,计算密集型任务的特点是要进行大量的计算,消耗CPU 资源,比如计算圆周率、数据处理、对视频进行高清解码等等,全靠CPU 的运算能力。
  • IO 密集型的场景:优先级值高点,涉及到网络、磁盘IO 的任务都是IO 密集型任务,这类任务的特点是 CPU 消耗很少,任务的大部分时间都在等待 IO 操作完成(因为 IO 的速度远远低于 CPU 和内存的速度),比如 Web 应用,高并发,数据量大的动态网站来说,数据库应该为IO 密集型

CFS原理
cfs定义了进程调度的新模型,它给cfs_rq(cfs的run queue)中的每一个进程安排一个虚拟时钟,vruntime。如果一个进程得以执行,随着时间的增长,其vruntime将不断增大。没有得到执行的进程vruntime不变, 而调度器总是选择vruntime跑得最慢的那个进程来执行。这就是所谓的“完全公平”。为了区别不同优先级的进程,优先级高的进程vruntime增长得慢,以至于它可能得到更多的运行机会。
CFS的意义在于, 在一个混杂着大量计算型进程和IO交互进程的系统中,CFS调度器相对其它调度器在对待IO交互进程要更加友善和公平。

范例:查看磁盘调度算法

配置默认的CFS调度程序

默认情况下,每个容器对主机的CPU周期的访问都是不受限制的。您可以设置各种约束,以限制给定容器对主机CPU周期的访问。大多数用户使用并配置 默认的CFS调度程序。在Docker 1.13及更高版本中,还可以配置 realtime scheduler

CFS是用于常规Linux进程的Linux内核CPU调度程序。几个运行时标志允许您配置对容器拥有的CPU资源的访问量。使用这些设置时,Docker会在主机上修改容器cgroup的设置。

选项 描述
--cpus= 指定一个容器可以使用多少可用的CPU资源。例如,如果主机有两个CPU,如果设置了--cpus="1.5",则可以保证容器最多使用1.5个的CPU(如果是4核CPU,那么还可以是4核心上每核用一点,但是总计是1.5核心的CPU)。这相当于设置--cpu-period="100000"--cpu-quota="150000"。此设置可在Docker 1.13及更高版本中可用,目的是替代–cpu-period和–cpu-quota两个参数,从而使配置更简单,但是最大不能超出宿主机的CPU总核心数(在操作系统看到的CPU超线程后的数值),此项较常用
--cpu-period= 指定CPU CFS调度程序周期,必须与--cpu-quota一起使用 。默认为100微秒。大多数用户不会更改默认设置。如果您使用Docker 1.13或更高版本,请改用--cpus
--cpu-quota= 在容器上添加 CPU CFS 配额,计算方式为 cpu-quota / cpu-period的结果值,docker1.13 及以上版本通常使用–cpus 设置此值
--cpuset-cpus 用于指定容器运行的 CPU 编号,也就是所谓的CPU绑定。如果一个或多个CPU,则容器可以使用逗号分隔的列表或用连字符分隔的CPU范围。第一个CPU的编号为0。有效值可能是0-3(使用第一,第二,第三和第四CPU)或1,3(使用第二和第四CPU)
--cpu-shares 用于设置 cfs 中调度的相对最大比例权重,cpu-share 的值越高的容器,将会分得更多的时间片(宿主机多核 CPU 总数为 100%,假如容器 A 为1024,容器 B 为 2048,那么容器 B 将最大是容器 A 的可用 CPU 的两倍 ),默认的时间片 1024,最大 262144。这是一个软限制。
使用stress-ng测试cpu配置

范例:查看关于cpu的帮助

范例:不限制容器CPU

docker-容器资源限制插图(4)

范例:限制使用CPU

docker-容器资源限制插图(5)

范例:限制CPU

范例:绑定CPU

docker-容器资源限制插图(6)

范例:多个容器的CPU利用率比例

范例:动态调整cpu shares值

本文链接:http://www.yunweipai.com/34981.html

Docker compse实战案例-实现单机版的Haproxy+Nginx+Tomcat

docker-可视化容器管理工具Portainer

网友评论comments

发表评论

电子邮件地址不会被公开。

暂无评论

Copyright © 2012-2020 YUNWEIPAI.COM - 运维派
扫二维码
扫二维码
返回顶部