嗨,我有一个AWS Lambda环境,其中的临时目录现在已满,我得到以下信息:
java.lang.RuntimeException: java.nio.file.FileSystemException: /tmp/out3786803744412914689: No space left on device
它是无服务器的,所以我不能简单地登录到该框中并删除目录的内容。
除了部署代码更改以在重新启动时清除temp文件夹之外,还有什么方法可以解决此问题?
答案 0 :(得分:5)
当触发AWS Lambda函数时,将创建一个临时容器。然后,Lambda函数将在容器中运行。
如果多次触发Lambda函数,则可能会创建多个容器。例如,如果该功能需要5秒钟才能运行,并且在一秒钟内触发了10个功能,则可能会配置50个容器。
此外,一旦函数执行完毕,容器可能会保留并在再次触发Lambda函数时再次使用。
因此,没有用于Lambda函数的单个“服务器”。可能很多,也可能是重复使用的。
建议函数在结束执行之前从/tmp
删除其临时文件。这样,该空间将可用于下一次执行。
相反,您可能希望有意保留容器中的某些数据,以便下次执行时像缓存一样。例如,如果该函数下载了一些参考数据,那么如果容器被重用,则下次无需重新下载数据。
底线:对该函数进行编程以使其自洁。
答案 1 :(得分:0)
您可以使用(或模拟)github lambdash项目在Lambda函数中构建Lambda shell。
这将允许您使用一组特定的参数来调用Lambda,这些参数将触发Lambda shell功能并执行传递给它的任何shell命令,例如“ rm / tmp / *”。我个人只会考虑在开发环境中使用此功能,而不是在生产环境中使用。
也就是说,“正确”的答案是@约翰·罗滕斯坦的答案。
答案 2 :(得分:0)
我相信您可以删除/tmp
文件夹中的内容,因为它将被隔离到您的实例中,这意味着/tmp
文件夹中的所有内容都是由您的lambda创建的。
如果还可以,还可以将所有这些数据卸载到某种类型的存储中。
答案 3 :(得分:0)
要添加到@John Rotenstein的答案中,我们的lambda将下载大型ML模型并在调用开始时移至/ tmp。
在python中,我们按照以下方式进行操作:
if not os.path.isdir(f'/tmp/{self.model}'):
self.download_model()
对于我们的用例,这比在lambda运行结束时清除/ tmp目录要好,因为它减少了对s3的调用和下载次数,从而提高了热启动的性能。这也意味着lambda可以更快地完成,因为它们不需要清理。需要注意的是我们的模型是静态的,因此我们不必担心缓存失效。如果您需要加载经常更改的数据,那么请清除/ tmp目录。