Docker容器生产实践1——永远设置容器内存限制
背景
在默认情况下,docker容器并不会对容器内部进程使用的内存大小进行任何限制。对于PaaS系统而言,或者对于直接使用docker的用户而言,这非常危险。如果哪个业务容器,出现了内存泄漏;那么它可能会危害到整个主机系统,导致业务app容器所在的主机出现oom。本文将介绍着眼于docker对内存资源的使用,解释背后的原理。同时也给出k8s上如何配置内存限制的方法。
docker run、create时刻对容器使用内存大小进行限制
-m硬限制容器使用的内存
通过下面参数可以为容器设置一个内存使用量硬大小,当超出这个大小时刻,linux系统会根据配置设置决定是否进入oom-killer状态。docker run --name zxy-docker -m 1g -it busybox bash
单位为:b,k,m和g
如果设置了-m参数,通常情况下如果容器使用内存量超过了设置的硬水线,那么linux的oom-killer触发,它将根据oom-score对容器内部进程进行oom kill。但是不影响宿主机上其他进程。
--oom-kill-disable
这个参数设置一定需要在容器run或者create过程中使用了-m参数才可以设置。设置了-m参数,如果容器使用内存超限了,那么oom-kill将触发。如果设置了--oom-kill-disable,那么容器不会oom,但是此时容器内部申请内存的进程将hang,直到他们可以申请到内存(容器内其他进程释放了内存)。
绝对不要在没有使用-m的时候设置--oom-kill-disable 因为这会影响到宿主机的oom-killer
背后的原理
docker 设置容器的-m是通过设置memory cgoup的memory.limit_in_bytes实现的。在没有设置-m的时候这个值为-1,表示容器使用的内存不受限制。
例如:
`bash>docker run --name zxy-memorylimit -it -m 1g docker-build:12.06 bash
bash>docker inspect zxy-memorylimit|grep -i pid
“Pid”:24360
bash>cat /proc/24360/cgroup|grep memory
9:memory:/docker/xxxxx
bash>cd /sys/fs/cgroups/memory/docker/xxxx
bash> cat memory.limit_in_bytes
1073741824`
--oom-kill-disable参数实际设置的就是这是了同级目录之下的memory.oom_control,设置此参数就相当于做了如下动作bash> echo 1 >memory.oom_control
对linux memory cgroup感兴趣的朋友可以参考:
https://segmentfault.com/a/1190000008125359 一文
--memory-reservation 软限制容器使用的内存
在上一节中,我们介绍了-m硬限制容器使用的内存资源。一旦设置了这个-m参数,那么容器内进程使用量超过这个数值,就会被杀或者hang住。docker还提供了一种soft limit就是--memory-reservation,单位和-m一致。当设置了这个参数以后,如果宿主机系统内存不足,有新的内存请求时刻,那么linux会尝试从设置了此参数的容器里回收内存,回收的办法就是swap了。那么如果此容器还在继续使用内存,那么此容器会遇到很大的性能下降。
通常实践是设置--memory-reservevation 的值小于-m的值。
背后的原理
和-m参数一致,此参数docker也是借助于memory cgroup的memory.soft_limit_in_bytes 实现。
其他内存资源参数
- --memory-swap
配置容器可以设置的swap大小。此值为-m值加上能达到的swap区大小,例如--memory-swap = 500M
-m =300M,意味着真正的swap大小可以的到200M。默认情况下容器可以得到最大swap大小为-m参数设置的两倍,此参数设置为0,为无效参数。如果--m和--memory-swap相等,相当于关闭容器的swap。值-1表示swap大小为不限 - --memory-swappiness
配置容器的swappiness属性,从0到100。0表示无论何种情况下都不要启动swap,100表示只要有可能就启动swap。
此参数和系统的/proc/sys/vm/swappiness
含义一致,不过它设置的容器所在memory cgroup的swappiness。
默认情况下容器的此值继承自主机侧的swappiness配置。对于centos系统和ubuntu系统,内存充裕可以设置为10.
swappiness设置的是匿名页(anonymous page,也就是malloc和mmap以map_anonymous方式申请的内存)是否愿意交换出去
docker做了什么
docker做的工作实际上是由runc完成的,docker 创建的hostconfig.json文件(也就是oci接口文件)中,有如下字段描述-m,--memory-reservation等内存资源限制参数:memory MemoryReservation MemorySwap MemorySwappiness
docker生产实践
- 永远需要设置-m
- 不要轻易设置--oom-kill-disable,memory-swappiness,memory-swap和memory-reservation,因为一半情况下,你不太容易理解它们真正如何作用于系统。
k8s如何使用docker限制内存的参数
下文节选自https://mp.weixin.qq.com/s/j2FfqUHSRTzczNcfPuwRQw
K8s资源限制是通过每个容器containerSpec的resources字段进行设置的,它是v1版本的ResourceRequirements类型的API对象。每个指定了"limits"和"requests"的对象都可以控制对应的资源。目前只有CPU和内存两种资源。大多数情况下,deployment、statefulset、daemonset的定义里都包含了podSpec和多个containerSpec。这里有个完整的v1资源对象的yaml格式配置:
`resources:
requests:
cpu: 50m
memory: 50Mi
limits:
cpu: 100m
memory: 100Mi
`
其中limits节限制memory设置的就是docker 容器的-m,而且k8s仅仅使用了-m参数其他参数都没有使用。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
白话为什么需要虚拟机和云计算有什么关系
近来我们一直在说云计算,有人就会问究竟什么叫云计算,或许从狭义讲企业级的云计算就是将业务服务放在云主机上运行,而云主机实际是互联网机房中的虚拟机(VM)。虚拟机又是什么? 虚拟机是通过硬件虚拟化技术将一台物理服务器分割成了多个逻辑隔离的单元,每个单元都是一个虚拟的计算机,和真实的计算机一样它也有CPU、主板、内存、硬盘等等设备组成,可以为这台虚拟的计算机安装操作系统。一台物理服务器通过虚拟化技术可以同时运行多台虚拟机即多个操作系统(及其业务系统)。不仅节省了硬件采购成本与电能消耗,也降低了维护工作量。因此虚拟机技术也是云计算平台的最基础元素。 早期做运维的一些朋友起初对虚拟机并不感兴趣。对于资金并不充余的用户会选择把多个服务(业务)都放在一台服务器上运行。比如:DHCP、DNS、WEB 共用一台服务器;SAP 和 OA 共用一台服务器… 等这样处理可以节省至少一半的服务器。对于资金不紧张的用户而言,可以为每一个业务事务系统都配置一台甚至多台服务器;比如:DHCP 、DNS、WEB、MIS、SAP、OA 等都有独立的服务器,有的中小企业都会因此而配有十多台服务器填满几个机柜。其实这两类情...
- 下一篇
基于Ubuntu16.04和kubeadm部署kuernetes
1.部署环境: 2台虚拟机,Ubuntu16.04系统。设定A虚拟机的IP 为A-IP,B虚拟机的IP为B-IP,并A虚拟机作为master。 2. A、B两台虚拟机都需要做的部署操作: 建议以root用户执行下列操作。 a. 跟新系统apt包: apt-get update -y apt-get upgrade -y b. 关闭开启Swap的设备,kubernetes是建议关闭的: Swapoff -a 上述命令,可以临时关闭,机器重启之后需要重新设置。 具体的swap扩展信息,可参考http://www.runoob.com/linux/linux-comm-swapoff.html c. 安装Docker,kubernetes需要机遇Docker环境运行: apt-get install apt-transport-https -y curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - apt-get install docker.io -y 查看docker版本及启动do...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8编译安装MySQL8.0.19
- CentOS关闭SELinux安全模块
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池