AWS lambda - 每次执行后释放/ tmp存储

Ngo*_*ran 20 python node.js aws-sdk aws-lambda

我有4个lambda函数,将同时调用(由SNS),SNS事件的频率为5分钟.每个函数处理大量数据和图像(~300MB),因此我将它们存储在/tmp文件夹中(500MB限制).

在函数开始时,我在清理/tmp文件夹中写了一些代码,以确保它不会内存不足(因为我已经知道AWS lambda有时会重用以前的容器来提高性能).

我手动检查它(创建消息并通过SNS发布到4个lambda函数),它工作正常.

但是当它自动运行(每5分钟调用一次)时,结果并不像我期望的那样.第一次执行很好,但接下来的时间,4个甚至4个lambda函数中的1个抛出与"内存不足"相关的错误:"设备上没有空间",无法加载lib,...

以前,我使用nodejs(4.3)它两种情况都很好.

但由于某种原因我必须更改为python,主流和创建数据的挂载是相同的.但它在自动运行时失败了.

我认为这个问题来自前一个容器(重用容器)的缓存,我检查了/tmpclean(ls -alh /tmp)之后没有文件但是当检查存储(df /tmp)时它显示使用的是77%.

任何关于制作干净/tmp文件夹或解决方案的建议都非常感谢.谢谢!

编辑:我用来清理/tmp文件夹的代码:

from subprocess import call
...
call('rm -rf /tmp/*', shell=True)
Run Code Online (Sandbox Code Playgroud)

小智 15

是的,lambda 是一个托管服务;如果 lambda 被重复调用,它们确实会重用相同的底层资源。这是我们面临并通过删除 /tmp 解决的生产问题。另外,AWS 应该在他们的常见问题解答中提到这一点。

if os.path.exists(tmp_file_path):
        os.remove(tmp_file_path)
        print("Removed the file %s" % tmp_file_path)     
else:
    print("Sorry, file %s does not exist." % tmp_file_path)
Run Code Online (Sandbox Code Playgroud)

  • 他们确实在常见问题解答中提到了这一点:“为了提高性能,AWS Lambda 可能会选择保留您的函数实例并重用它来为后续请求提供服务,而不是创建一个新副本。要了解有关 Lambda 如何重用函数实例的更多信息,请访问我们的 [文档](http://docs.aws.amazon.com/lambda/latest/dg/lambda-introduction.html)。您的代码不应假设这会一直发生。” (2认同)

omu*_*thu 2

容器经常被重复使用,但不会同时重复使用。函数完成后清理临时目录并查看问题是否解决。