スレッドが有効になっている python27 ランタイムでバッチ処理バックエンド (B4) を使用しています。unpickle/pickle や Numpy/array などの処理を行います。
最近、バックエンド料金がはるかに高くなっていて、ほぼ毎回クォータに達していることに気付きました。「バックエンドが削除されています」という通知を見たので、それが解決するかもしれないと考えて、モジュール (これも B4) に移行しました。ただし、まだ同じ問題が発生します。
クォータが使い果たされるまで、最後 (常に最後) の memcache 書き込みでコードがハングアップするようです。/_ah/stop 呼び出しが (クォータのために) 行われた瞬間に、バックエンドは再び起動して処理を再開し、シャットダウン要求のために終了します。
関連するすべてのログは次のとおりです。
2013-08-05 15:23:33.962 /BatchRankings 500 19413478ms 0kb インスタンス = 0 AppEngine-Google; (+http://code.google.com/appengine) 私は 2013-08-05 10:00:04.118 meleerumble 開始時のメモリ使用量: 24.55078125MB ...さらに多くのログ... 私は 2013-08-05 10:01:03.550 ボットを 18 のセクションに分割する 私は 2013-08-05 15:23:03.086 564 個のボットを memcache に書き込みました E 2013-08-05 15:23:33.962 バックエンドのシャットダウンに時間がかかりすぎたため、プロセスが終了しました。
分割と memcache への書き込みの間のタイムスタンプを確認します。これには数秒かかるはずですが、5 時間以上かかります (このコードがループされる他のすべての時間もそうです)。
さらに、実際のリクエスト ハンドラのすぐ下にある私のログには、次のように表示されます。
2013-08-05 15:23:02.938 /_ah/stop 200 5ms 0kb インスタンス=0
したがって、私が知る限り、memcache の書き込み中にバックエンドがハングしているように見え、クォータに達すると /_ah/stop がバックエンドを起動します。
これら 2 つのログ ポイント間の関連コードは次のとおりです。
client = memcache.Client()
if len(botsdict) > 0:
splitlist = dict_split(botsdict,32)
logging.info("split bots into " + str(len(splitlist)) + " sections")
for d in splitlist:
rpcList.append(client.set_multi_async(d))
logging.info("wrote " + str(len(botsdict)) + " bots to memcache")
18 回の set_multi_async 呼び出しに 5 時間 23 分かかる方法がわかりません。ここでログを信頼できますか? 実際のコードは完成しているのに、どういうわけか出口が登録されず、ロギングが問題だったのでしょうか? このため、バックエンド処理を無効にする必要があります。これは、投げた分だけクォータを消費するためです。
ここで一体何が起こっているのかについての助けをいただければ幸いです。