Exceeded soft private memory limit
App Engine のさまざまなリクエスト ハンドラで時折エラーが発生します。このエラーは、インスタンスで使用されている RAM が割り当てられた量を超えたことを意味し、それが原因でインスタンスがシャットダウンすることを理解しています。
エラーの考えられる原因を理解したいと思います。まず、アプリ エンジンの Python インスタンスがメモリを管理する方法を理解したいと思います。私の初歩的な仮定は次のとおりです。
- F2 インスタンスは 256 MB から始まります
- 起動すると、アプリケーション コードが読み込まれます - 30 MB としましょう
- リクエストを処理するとき、226 MB が利用可能です
- そのリクエストが 226 MB (+ エラーのマージン) を超えない限り、リクエストはエラーなしで完了します
- 226 MB + マージンを超えた場合、インスタンスはリクエストを完了し、「ソフト プライベート メモリ制限を超えました」というエラーをログに記録してから終了します。ステップ 1 に戻ります。
- そのリクエストが返されると、それによって使用されていたメモリが解放されます。未使用の RAM は 226 MB に戻ります
- インスタンスにリクエストが渡されるたびに、ステップ 3 ~ 4 が無期限に繰り返されます。
それがうまくいくと私が推測した方法ですが、かなり幅広いリクエストハンドラーのセットでこのエラーが時々見られることを考えると、今はよくわかりません. 私の質問は次のとおりです。
a) ステップ 4 は実行されますか?
b) それが起こらない原因は何ですか? または完全に起こらない?たとえば、リクエスト間でどのようにメモリ リークが発生する可能性があるでしょうか。
c) モジュール レベル変数のストレージがメモリ使用量のリークを引き起こす可能性はありますか? (私は故意にモジュールレベルの変数をそのように使用していません)
d) より多くのデータを取得するには、どのようなツールや手法を使用できますか? たとえば、要求ハンドラへのエントリでメモリ使用量を測定しますか?
回答/コメントでは、可能であれば、gae ドキュメントにリンクしてください。
[編集] 追加情報: 私のアプリはthreadsafe: false
. これが答えに関係している場合は、それが何であるかを述べてください。threadsafe: true
近々乗り換える予定です。
[編集]明確化:この質問は、メモリ管理のための gaeの予想される動作に関するものです。そのため、'call gc.collect()
' のような提案は、関連する問題の部分的な解決策になる可能性がありますが、この質問に完全に答えるわけではありません。gae がどのように動作することが期待されるかを理解するまでは、使用gc.collect()
はブードゥー教のプログラミングのように感じます。
最後に:これがすべて逆になっている場合は、事前に謝罪します-これに関する有用な情報があまり見つからないため、ほとんど推測しています..