Cloud Run 上的容器内存管理和 OOM

Posted

技术标签:

【中文标题】Cloud Run 上的容器内存管理和 OOM【英文标题】:Container memory management and OOMs on Cloud Run 【发布时间】:2020-11-02 18:26:21 【问题描述】:

在了解运行容器时如何计算内存利用率方面需要帮助。

假设我们有一个基于 Ubuntu 18.04 的容器,我们在另一个 Ubuntu 18.04 中运行该容器,该操作系统与相同的操作系统。有以下选项 -

docker run -it -p 8080:8080 --cpus 2 --memory 2048m

现在的问题是,当我们使用容器在本地机器上运行时,相同的进程在没有 OOM 的情况下运行良好。但是,当我们将相同的容器和进程放入谷歌云运行时,容器内存不足。所以这里的问题是

    google cloud run 上的内存使用量是如何计算的? 如果我们在同一个主机操作系统上运行同一个客户操作系统,我们会获得什么优势吗?

在 cloudrun 上运行时,我们是否可以通过将系统更改为任何其他平台来解决此问题?

【问题讨论】:

我知道学习起来很奇怪,但这就是我们现在正在发生的事情。 【参考方案1】:

    正如@Dustin 所说,如果您将文件写入/修改到 Cloud Run 上的本地磁盘,它将计入您的可用内存。这很可能是问题所在。

    但是,如果您的代码(或您导入的模块,例如 Google Cloud 客户端库)在您的笔记本电脑和已部署的应用程序上遵循不同的代码路径,这也可能是 OOM 的原因。

    容器不运行操作系统。基于ubuntu:18.10 图像的容器图像不提供内存优化(或利用共享动态库缓存)。

    它只是让您的应用使用该基础映像上可用的二进制文件和动态库,并使用该发行版的包管理器。同样,您无法控制 Cloud Run 在其上运行容器的主机。

另请注意,Cloud Run 上的当前内存限制为 2 GB,但很快就会增加到 4 GB。

【讨论】:

感谢您的详细回答。我们现在正在修改我们的方法。似乎 gradle 下载一堆 jar 导致内存爆炸。我们正在评估其他选项。 如果我更改我的 Dockerfile 以预取所有依赖项会发生什么?或者 2gb 限制是初始大小加上运行时间的总和? Docker 映像中的任何内容都不计入内存。但是,如果您稍后下载它们,它会这样做。 好的。谢谢。例如,我在执行过程中安装 tensorflow,这会导致 OOM。我可以肯定地说,如果我将这个 tensorflow 安装移动到映像构建中,它会减少内存占用吗?【参考方案2】:

没有看到有关您的映像或应用程序的任何详细信息,很难确定,但 Cloud Run 与您的本地计算机之间的一大区别是,在 Cloud Run 上,内存和“磁盘上”文件消耗相同的配额。

来自https://cloud.google.com/run/docs/tips/general#deleting_temporary_files:

在 Cloud Run(全托管)环境中,磁盘存储是内存中的文件系统。写入磁盘的文件会消耗服务可用的内存,并且可以在调用之间持续存在。未能删除这些文件最终会导致内存不足错误和随后的冷启动。

【讨论】:

以上是关于Cloud Run 上的容器内存管理和 OOM的主要内容,如果未能解决你的问题,请参考以下文章

docker容器的内存问题排查(“内存丢失”)

JVM内存管理:深入Java内存区域与OOM

Spring Cloud 微服务内存使用情况

OOM和频繁GC预防方案

内存溢出(Oom)和内存泄露(Memory leak)

Docker容器生产实践1——永远设置容器内存限制