AWS lambda - 每次执行后释放 /tmp 存储
Posted
技术标签:
【中文标题】AWS lambda - 每次执行后释放 /tmp 存储【英文标题】:AWS lambda - Release /tmp storage after each execution 【发布时间】:2017-10-21 20:47:19 【问题描述】:我有 4 个将同时调用的 lambda 函数(由 SNS),SNS 事件的频率是 5 分钟。
每个函数都处理大量数据和图像(~300MB),所以我将它们存储在/tmp
文件夹中(500MB 限制)。
在函数的开始,我写了一些代码到清理/tmp
文件夹,以确保它没有内存不足(因为我知道AWS lambda有时会重用以前的容器来提高性能)。
我手动检查(创建消息并通过 SNS 发布到 4 个 lambda 函数),它工作正常。
但是当它自动运行(每 5 分钟调用一次)时,结果并不如我所愿。第一次执行很好,但接下来的时间,4 个甚至 4 个 lambda 函数中的 1 个抛出与“内存不足”相关的错误:“设备上没有剩余空间”,无法加载 lib,...
以前,我使用 nodejs(4.3) 它在两种情况下都可以正常工作。
但是由于某种原因我不得不改成python,主要流程和创建数据的mount是一样的。但是自动运行就失败了。
我认为问题来自前一个容器(重用容器)的缓存,我在清理后检查了/tmp
(ls -alh /tmp
)没有文件但是当检查存储时(df /tmp
)它显示使用是 77%。
非常感谢任何有关清理 /tmp
文件夹或解决方案的建议。谢谢!
已编辑:我用来清理 /tmp
文件夹的代码:
from subprocess import call
...
call('rm -rf /tmp/*', shell=True)
【问题讨论】:
能否添加用于删除/tmp
中文件的代码?
我添加了用于清理 /tmp 文件夹的代码。
嗨,我也面临同样的问题。你解决了你的问题吗?如果是这样,你能分享你的解决方案吗?提前致谢!
这是 AWS 在无服务器服务中的废话。我认为每次执行后应该自动清理 /tmp 目录。
您有没有找到解决方案,如何在 AWS lambda 上永久删除 /tmp 或 /tmp 中的文件夹?
【参考方案1】:
是的,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)
【讨论】:
他们在常见问题解答中确实提到了这一点:“为了提高性能,AWS Lambda 可能会选择保留您的函数实例并重用它来服务后续请求,而不是创建新副本。学习有关 Lambda 如何重用函数实例的更多信息,请访问我们的documentation。您的代码不应假设这会一直发生。” 感谢您的帮助。【参考方案2】:容器经常被重复使用,但不能同时使用。函数完成后清理临时目录并查看问题是否解决。
【讨论】:
我试过了,我在代码中清理了开头和结尾的/tmp。 我今天在节点 10 容器上确认了这个错误。我确实删除了所有 /tmp 文件(和目录),但每次调用后可用磁盘空间都在缩小【参考方案3】:我尝试使用lambdash 复制这个问题,这是一个很好的功能来测试你的“开发”帐户中的命令。它允许您在 Lambda 环境中运行任意 UNIX 命令。
我反复运行此命令,并没有看到问题出现。注意:这些命令实际上并不在部署的代码中,因此此测试并未完全复制潜在问题。
lambdash "echo Checking:;file /tmp/nullfile;rm -f /tmp/nullfile;df -h /tmp;dd if=/dev/zero bs=1024 count=88888 >> /tmp/nullfile; echo ==========;df -h /tmp"
【讨论】:
虽然本身不是解决方案,但这是非常有用的信息。谢谢。以上是关于AWS lambda - 每次执行后释放 /tmp 存储的主要内容,如果未能解决你的问题,请参考以下文章
使用 python 写入 aws lambda 中的 /tmp 目录
AWS Lambda:将可执行文件与 python 一起使用