同時に(SNSで)呼び出される4つのラムダ関数があります。SNSのイベントの頻度は5分です。各関数は大量のデータと画像(〜300MB)を処理するので、/tmp
フォルダーに保存します(500MBの制限)。
関数の冒頭で、クリーンアップ/tmp
フォルダーにコードを書き込んで、メモリが不足していないことを確認します(AWS lambdaがパフォーマンスを向上させるために以前のコンテナーを再利用する場合があることがわかっているため)。
私はそれを手動でチェックし(メッセージを作成し、SNSで4つのラムダ関数に公開します)、うまくいきました。
しかし、それが自動的に実行されると(5分ごとに呼び出されます)、期待した結果が得られません。最初の実行は問題ありませんが、次回以降、4つのうちの1つまたは4つのラムダ関数が「メモリ不足」に関連するエラーをスローします:「デバイスにスペースがありません」、libをロードできません...
以前は、nodejs(4.3)を使用していましたが、どちらの場合も問題なく動作しました。
しかし、何らかの理由でpythonに変更する必要があります。メインフローと作成されたデータのマウントは同じですが、自動的に実行すると失敗します。
問題は前のコンテナ(再利用されたコンテナ)のキャッシュにあると思います。/tmp
をクリーン後にチェックしました(ls -alh /tmp
)ファイルがないが、ストレージ(df /tmp
)をチェックしたとき使用率が77%であることを示します。
クリーンな/tmp
フォルダーを作成するか、ソリューションを回避するための提案は非常にありがたいです。感謝!
編集:/tmp
フォルダーのクリーンアップに使用するコード:
from subprocess import call
...
call('rm -rf /tmp/*', Shell=True)
はい、ラムダはマネージドサービスです。ラムダが繰り返し呼び出される場合、同じ基本リソースを再利用します。これは、私たちが直面している生産上の問題であり、/ tmpを削除することで修正されました。別の注記として、AWSはFAQでこれについて言及する必要があります。
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)
私は lambdash を使用してこの問題を再現しようとしました。これは、「dev」アカウントでコマンドをテストするための優れた機能です。 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"
コンテナーはしばしば再利用されますが、同時には行われません。関数が終了したら一時ディレクトリをクリーンアップし、問題が解決するかどうかを確認します。