序言
我正在写一个小小的演示文稿来列出使用Docker时的一些“陷阱”,而且我遇到了我自己的一个。
在解释让Docker在没有内存限制的情况下运行的危险时,我发现它的行为与我的预期不符。
我使用PHP脚本创建了一个docker镜像,该脚本将递归创建数组以耗尽内存,报告当前使用的内存量。如果没有内存限制,脚本将以1GB的速度自杀。
您可以在此处获取图片:https://hub.docker.com/r/gisleburt/my-memory-hog
您可以在此处查看源代码:https://github.com/Gisleburt/my-memory-hog
我的期望是以下内容会阻止脚本超过128mb的内存。
docker run -it --memory=128m --memory-swap=0 gisleburt/my-memory-hog
但是,在OSX(使用虚拟盒驱动程序的本机和docker-machine)上,docker实际上是250mb之前的脚本 。在Ubuntu上,脚本达到1GB并自行终止。
Weirder仍然,如果我们检查docker stats
发生了什么,我们可以看到容器实际没有超过它的内存限制。实际上,在Ubuntu上使用--memory=4m
运行时,docker stats
仍然表示它不会使用超过4mb,即使脚本以1gb完成。在Mac上,限制为4mb会使脚本在5-6mb标记周围杀死。
我认为我错过了关于内存分配方式的一些内容,但我无法弄清楚它是什么。
问题
为什么docker容器中的脚本似乎比docker容器使用更多内存?容器内部和外部的内存发生了什么?
版本信息
Mac客户端:
Client:
Version: 1.12.3
API version: 1.24
Go version: go1.6.3
Git commit: 6b644ec
Built: Thu Oct 27 00:09:21 2016
OS/Arch: darwin/amd64
Experimental: true
Mac Native:
Server:
Version: 1.12.3
API version: 1.24
Go version: go1.6.3
Git commit: 6b644ec
Built: Wed Oct 26 23:26:11 2016
OS/Arch: linux/amd64
Mac虚拟盒机:
Server:
Version: 1.12.3
API version: 1.24
Go version: go1.6.3
Git commit: 6b644ec
Built: Thu Oct 27 00:09:21 2016
OS/Arch: linux/amd64
Experimental: true
Ubuntu客户端:
Client:
Version: 1.12.3
API version: 1.24
Go version: go1.6.3
Git commit: 6b644ec
Built: Wed Oct 26 22:01:48 2016
OS/Arch: linux/amd64
Ubuntu引擎:
Server:
Version: 1.12.3
API version: 1.24
Go version: go1.6.3
Git commit: 6b644ec
Built: Wed Oct 26 22:01:48 2016
OS/Arch: linux/amd64
答案 0 :(得分:2)
在我们技术部门的一些人的帮助下,特别是我们的平台运营团队的一名成员,我们确定了正在进行的工作, 中提及 reference guide。
--memory-swap
总内存限制(内存+交换,格式:< number> [< unit>])。 Number是正整数。单位可以是b,k,m或g之一。
明确地说,--memory-swap
是可用的内存总量,包括驻留和交换。
为了获得所需的效果,您必须运行:
docker run -it --memory=128m --memory-swap=128m gisleburt/my-memory-hog
在此示例memory = 128mb
中,memory + swap = 128mb
因此swap = 0
。
有意义的是,您无法为--memory-swap
指定大于0但小于--memory
的数字。
此外,虽然--memory-swap=-1
为您提供了无限的"通过交换的内存量,由于某种原因,设置--memory-swap=0
似乎使内存和交换相同的大小,给你的内存总量是你期望的两倍。
您还可以使用--memory-swappiness=0
关闭交换。尽管可能会创建交换文件,但它不会被写入,因此不会占用比空文件更多的磁盘空间。
<强> TL; DR:强>
--memory = RES
--memory-swap = VIRT = RES + SWAP