超出 Docker 内存限制

标签 docker docker-compose

我有以下 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/

相关文章:

docker - 为什么 docker hub 上的某些存储库没有 dockerfile?

java - Docker - 在 Java 应用程序中获取绑定(bind)端口

docker - F# 类型是否可以与容器化 (Docker) 资源一起使用?

docker - 将docker服务容器中的应用程序连接到在外部网络docker容器上运行的数据库

ruby-on-rails - Docker Compose无法找到Gemfile或.bundle/目录

docker - 从没有 gcloud 的 Google Container Registry 中提取私有(private) docker 镜像

docker "invalid reference format: repository name must be lowercase"

docker - 启动后不久,沙盒代理容器就会崩溃

docker - 如何在 Dockerfile 中复制配置文件?

docker - 在 docker-compose.yml 中定义卷