我有以下 docker-compose 文件:
version: "2.4"
services:
auto_check:
image: python
mem_limit: 97M
启动时运行以下 python 脚本:
x = 'a' * (2 * 10 ** 8)
正如预期的那样,docker 失败,错误代码为 137。
但是,当我设置 mem_limit: 98M
时,错误不会重现。
知道为什么 docker 允许这种极端的内存限制违规吗?
图片大小为135MB(ubuntu20+python3)。
(在 WSL2-ubuntu:20.04 上运行)
感谢您的帮助!
最佳答案
发生这种情况是因为 memswap_limit
默认为 mem_limit
的值,这意味着您将获得 mem_limit
常规内存和另一个 memswap_limit ( == mem_limit)
的交换内存,总共是 2x mem_limit
。
您可以将 mem_limit
设置为实际所需限制的一半,或者您可以设置 memswap_limit: 0M
以完全禁用交换。
运行
/usr/bin/time --verbose python3 -c "x = 'a' * (2 * 10 ** 8)" 2>&1 1>/dev/null | grep 'Maximum resident'
在我的机器上我们可以看到
Maximum resident set size (kbytes): 203708
此 Python 脚本在其高峰期使用内存。在 MiB 术语中是 203708000/1024/1024 ~ 194MiB
。其中一半是 ~97MiB
。这就是您观察到的 98-99M 限制的来源。常规内存~98MiB,swap~98MiB,一共~194MiB,这是~python3 -c "x = 'a' * (2 * 10 ** 8)"
的峰值内存消耗>
关于超出 Docker 内存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64270202/