docker内存限制
默认docker容器可以使用宿主机所有的内存和CPU,我们可以通过 docker run 来限制内存和CPU的使用。
有的系统内核不支持 Linux capabilities. 可以通过 docker info 命令来检查,如果系统内核不支持,会有如下报错
WARNING: No swap limit support
在linux主机上,如果kernel发现没有足够的内存了,会报出OOME或者Out Of Memory Exception,并且会kill 进程来释放内存,任何的进程都有可能会被kill,包括docker,这可能引起整个系统的宕机。
docker尝试通过调整docker守护进程的OOM优先级来减轻风险,以便它比系统上的其他进程更不可能被杀死。
选项 | 描述 |
-m or --memory= |
容器可使用最大内存,最小内存为4m,单位可以为 b,k,m,g |
--memory-swap * |
容器可用于交换到硬盘的最大内存 |
--memory-swappiness | 默认情况下,容器的内核可以交换出一定比例的匿名页,设置为从 0 到 100,0表示关闭 |
--memory-reservation | 内存预留 |
--kernel-memory | 核心内存限制。最小为 4M |
--oom-kill-disable | 是否阻止 OOM killer 杀死容器,默认没设置 |
--memory-swap
介绍
只有当--memory设置之后,--memory-swap 才会生效
1、如果--memory-swap
设置为正整数,那么这两个--memory
和 --memory-swap
必须设置。--memory-swap
表示可以使用的内存和交换总量,并--memory
控制非交换内存使用的数量。因此,如果--memory="300m"
和--memory-swap="1g"
,容器可以使用300m的内存和700m(1g - 300m
)交换。
2、如果--memory-swap
设置为0
,则忽略该设置,并将该值视为未设置。
3、如果--memory-swap
设置为与值相同的值--memory
,并且--memory
设置为正整数,则不使用swap。
4、如果--memory-swap
未设置并且--memory
已--memory
设置,则如果主机容器配置了交换内存,则容器可以使用两倍于设置的交换。例如,如果--memory="300m"
和--memory-swap
未设置,容器可以使用300m的内存和600m的交换。
5、如果--memory-swap
明确设置为-1
,则允许容器使用无限制交换,最多可达主机系统上可用的数量。
防止容器使用交换
如果--memory
和--memory-swap
设置为相同的值,则可以防止容器使用任何交换。这是因为--memory-swap
可以使用的组合内存和交换量,而--memory
只是可以使用的物理内存量。
--memory-swappiness
细节
- 值为0将关闭匿名页面交换。
- 值100将所有匿名页面设置为可交换。
- 默认情况下,如果未设置
--memory-swappiness
,则值将从主机继承。
--kernel-memory
细节
内核内存限制以分配给容器的总内存表示。请考虑以下方案:
- 无限内存,无限内核内存:这是默认行为。
- 无限内存,有限内核内存:当所有cgroup所需的内存量大于主机上实际存在的内存量时,这是合适的。您可以将内核内存配置为永远不会覆盖主机上可用的内容,而需要更多内存的容器需要等待它。
- 有限的内存,无限的内核内存:整体内存有限,但内核内存不受限制。
- 有限的内存,有限的内核内存:限制用户和内核内存对于调试与内存相关的问题非常有用。如果容器正在使用意外数量的任一类型的内存,则它会耗尽内存而不会影响其他容器或主机。在此设置中,如果内核内存限制低于用户内存限制,则内核内存不足会导致容器遇到OOM错误。如果内核内存限制高于用户内存限制,则内核限制不会导致容器遇到OOM。
当您打开任何内核内存限制时,主机会根据每个进程跟踪“高水位线”统计信息,因此您可以跟踪哪些进程(在本例中为容器)正在使用多余的内存。通过/proc/<PID>/status
在主机上查看,可以在每个过程中看到这一点。
最新文章
- iOS小知识:使UIButton中的图片和文字实现左对齐
- 深入理解DOM事件机制系列第四篇——事件模拟
- 原生js-日历插件
- 【GPS】 数据围栏
- nginx配置中文域名解析
- 【干货】.NET开发通用组件发布(三) 简易数据采集组件
- LeetCode OJ 235. Lowest Common Ancestor of a Binary Search Tree
- linux常用命令 、查看日志、web排查
- 2、Libgdx配置你的开发环境(Eclipse,Intellij IDEA,NetBeans)
- Java基础 -- 深入理解Java类型信息(Class对象)与反射机制
- python3+selenium框架设计05-配置文件和浏览器引擎类
- Hash算法和一致性Hash算法
- 【awesome-dotnet-core-learning】(1)-Sprache-解析器构建库
- java transient 知识点学习
- 学JS的心路历程Day28 - PixiJS -基础(二)
- Inside NGINX: How We Designed for Performance &; Scale
- iOS 优秀开源框架 开源包 开发包 from : Podfile of chatsecure ---待完善
- Java模拟双色球彩票
- unity, 人物与移动跳台的交互
- C# 序列化详解,xml序列化,json序列化对比
热门文章
- Rainbond通过插件整合ELK/EFK,实现日志收集
- mac学习Python第一天:安装、软件说明、运行python的三种方法
- 【错误】NetBeans2007:Cannot find nbproject/build-impl.xml
- Counterfactual VQA: A Cause-Effect Look at Language Bias
- Obfuscated Gradients Give a False Sense of Security: Circumventing Defenses to Adversarial Examples
- oralce索引中INDEX SKIP SCAN 和 INDEX RANGE SCAN区别
- Java高级程序设计作业目录(作业笔记)
- SpringBoot中如何优雅的使用多线程
- dos 之 for循环(小“病毒”)
- 初识python: random 模块