【问题标题】:Clearing out tmp folder from AWS Lambda从 AWS Lambda 中清除 tmp 文件夹
【发布时间】:2019-01-16 21:30:31
【问题描述】:

您好,我有一个 AWS Lambda 环境,其中临时目录已满,我得到以下信息:

java.lang.RuntimeException: java.nio.file.FileSystemException: /tmp/out3786803744412914689: No space left on device

它是无服务器的,所以我不能简单地登录该框并删除目录的内容。

除了部署代码更改以在重启时清除临时文件夹之外,还有其他方法可以解决此问题吗?

【问题讨论】:

    标签: amazon-web-services aws-lambda


    【解决方案1】:

    当触发 AWS Lambda 函数时,会创建一个临时容器。然后 Lambda 函数在容器中运行。

    如果多次触发 Lambda 函数,可能会创建多个容器。例如,如果函数运行时间为 5 秒,并且在一秒内触发了 10 个函数,则可能会预配 50 个容器。

    此外,一旦函数完成执行,如果再次触发 Lambda 函数,容器可能会被保留并再次使用。

    因此,没有用于 Lambda 函数的单一“服务器”。它可能很多,也可能是一个被重复使用的。

    建议函数在结束执行前从/tmp 中删除它们的临时文件。这样,空间将可用于下一次执行。

    相反,您可能希望在容器中有意保留一些数据,以便下次执行时起到缓存的作用。比如函数下载了一些引用数据,如果容器被复用,下次就不需要重新下载数据了。

    底线:编写函数自行清理。

    【讨论】:

    • 那么有bug吗?因为清理会删除我使用的文件(dbl。在退出前检查 w/stat)仍然可用磁盘空间在下一次调用时消失
    【解决方案2】:

    要添加到@John Rotenstein 的答案,我们的 lambda 会下载一个大型 ML 模型并在调用开始时移至 /tmp。

    在 python 中,我们按照以下方式做一些事情:

    if not os.path.isdir(f'/tmp/{self.model}'):
        self.download_model()
    

    对于我们的用例,这比在 lambda 运行结束时清除 /tmp 目录要好,因为它减少了 s3 所需的调用和下载次数,从而提高了热启动的性能。这也意味着 lambda 将更快地完成,因为它们不需要清理。这里需要注意的是我们的模型是静态的,所以我们不需要担心缓存失效。如果您需要加载频繁更改的数据,那么当然要清除 /tmp 目录。

    【讨论】:

      【解决方案3】:

      您可以使用(或模拟)github lambdash 项目将 Lambda shell 构建到您的 Lambda 函数中。

      这将允许您使用一组特定的参数调用 Lambda,这些参数将触发 Lambda shell 功能并执行您传递给它的任何 shell 命令,例如“rm /tmp/*”。我个人只会考虑在开发环境中这样做,而不是在生产环境中。

      也就是说,“正确”的答案是@John Rotenstein 的答案。

      【讨论】:

        【解决方案4】:

        我相信您可以删除 /tmp 文件夹的内容,因为它将与您的实例隔离,这意味着 /tmp 文件夹中的所有内容都是由您的 lambda 创建的。

        如果这些数据仍然相关,您还可以将所有这些数据卸载到某种类型的存储中。

        • S3
        • 迪纳摩
        • Redis

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-22
          • 2021-11-05
          • 1970-01-01
          • 2021-12-10
          • 2021-03-18
          • 2019-03-30
          • 1970-01-01
          • 2019-08-13
          相关资源
          最近更新 更多