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
在主机上查看,可以在每个过程中看到这一点。