Reputation: 1527
I have 4 lambda functions which will be invoked at same time (by SNS), the frequence of SNS's event is 5 minutes.
Each function process the large mount of data and images(~300MB) so I store them on /tmp
folder (500MB limit).
At the beginning of function, I wrote some code to the clean up /tmp
folder, to make sure it's not out of memory (Because I've known that AWS lambda sometimes reuses previous container to improve performance).
I check it manually (create message and publish by SNS to 4 lambda functions), it worked fine.
But when it runs automatically (invoked each 5 minutes) the result is not as my expectation. The first execution is fine, but the next times after, 1 of 4 or even 4 lambda functions throw out the error related to "out of memory": "No space left on device", cannot load lib, ...
Previous, I use nodejs(4.3) it worked fine both case.
But I have to change to python for some reason, the main flow and the mount of created data is the same. But it's failed when run automatically.
I think that the issue came from the cache of previous container (reused container), I checked the /tmp
after clean (ls -alh /tmp
) there's no files but when check the storage (df /tmp
) it show that used is 77%.
Any suggestion to make clean /tmp
folder or work around solution is very appreciate. Thank!
Edited: Code I use to clean /tmp
folder:
from subprocess import call
...
call('rm -rf /tmp/*', shell=True)
Upvotes: 39
Views: 39222
Reputation: 175
Warning rm -rf /tmp/*
don't remove all files (hidden files or dir will not be deleted).
For a real clean of /tmp dir you should use : rm -rf /tmp/..?* /tmp/.[!.]* /tmp/*
For a complete explanation read: https://unix.stackexchange.com/a/77313/66488
Upvotes: 1
Reputation: 53
I tried to replicate this issue using lambdash, a great function to test out commands in your "dev" account. It allows you to run arbitrary UNIX commands in the Lambda environment.
I ran this command repeatedly, and did not see the issue appear. Note: The commands are not actually in the deployed code so this test does not fully replicate the potential issue.
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"
Upvotes: 3
Reputation: 271
Yes, lambda being a managed service; they do reuse the same underlying resource if the lambda is getting invoked repeatedly. This was a production problem we faced and fixed by deleting the /tmp. On a separate note AWS should mention this in their FAQs.
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)
Upvotes: 26
Reputation: 6333
Containers are often reused, but not concurrently. Clean up your temp directory when the function finishes and see if issue resolves.
Upvotes: 2