Docker的 - 内存开关无法正常工作

时间:2016-11-08 11:07:15

标签: memory memory-management docker

序言

我正在写一个小小的演示文稿来列出使用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

1 个答案:

答案 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