2012-02-19 9 views
6

次のコードは、ブロブストアからファイルに何らかの処理を実行するタスクを追加し、それはB2 バックエンド上で動作しますので、それは何のタイムアウト制限がありません:appengine、python:taskqueue.add()にメモリリークがありますか?

for task in tasks: 
    tools.debug("add_tasks_to_process_files", "adding_task") 

    taskqueue.add(\ 
      name=("Process_%s_files---%s--%s--%s--%s" % \ 
         (len(tasks[task]), task[1], task[0], task[2], int(time.time()))),\ 
      queue_name="files-processor",\ 
      url="/analytics/process_files/",\ 
      params={"processing_task": json.dumps({"profile": task, "blobs_to_process": tasks[task]})}) 

タスクは、次のような形式で辞書です:

{ 
    (x1,y1,z1): ["blob_key", "blob_key"... (limited to 35 keys)], 
    (x2,y2,z2): ["blob_key", "blob_key"...], 
    . 
    . 
    . 
} 

X1、Y1、Z1は、すべての文字列である

tools.debugは(私は20メートルを待つ必要はありません、私はそれがUrlFetchのを使用して、私のローカルサーバにメッセージを送る書いた関数でありますで)ログを読み取ることができるようにする:

def debug(location, message, params=None, force=False): 
    if not (settings.REMOTE_DEBUG or settings.LOCALE_DEBUG or force): 
     return 

    if params is None: 
     params = {} 

    params["memory"] = runtime.memory_usage().current() 
    params["instance_id"] = settings.INSTANCE_ID 

    debug_message = "%s/%s?%s" % (urllib2.quote(location), urllib2.quote(message), "&".join(["%s=%s" % (p, urllib2.quote(unicode(params[p]).encode("utf-8"))) for p in params])) 

    if settings.REMOTE_DEBUG or force: 
     fetch("%s/%s" % (settings.REMOTE_DEBUGGER, debug_message)) 

    if settings.LOCALE_DEBUG or force: 
     logging.debug(debug_message) 

tools.debugはコードではありませんでしたので、それは最初に失敗したとき、私は確かに知っている、それはメモリの問題の原因ではありません。私は上記の行せずにコードのためにそれを受け、再び

/_ah/stop 500 110ms 0kb 
Exceeded soft private memory limit with 283.406 MB after servicing 1 requests total 

/add_tasks_to_process_files/ 500 98812ms 0kb instance=0 AppEngine-Google; (+http://code.google.com/appengine): 
    A serious problem was encountered with the process that handled this request, causing it to exit. This is likely to cause a new process to be used for the next request to your application. If you see this message frequently, you may have a memory leak in your application. (Error code 201) 

そして右のそれの後:

が、私はこのエラーを得た今 tools.debug("add_tasks_to_process_files", "adding_task")

、私を聞かせてデバッガに表示される内容を表示します。

1 2012-1-19 14:41:38 [processors-backend] processors-backend-initiated instance_id: 1329662498, memory: 18.05078125, backend_instance_url: http://0.processors.razoss-dock-dev.appspot.com, backend_load_balancer_url: http://processors.razoss-dock-dev.appspot.com 
2 2012-1-19 14:41:39 [AddTasksToProcessFiles] start instance_id: 1329662498, files_sent_to_processing_already_in_previous_failed_attempts: 0, memory: 19.3828125 
3 2012-1-19 14:41:59 [AddTasksToProcessFiles] add_tasks_to_process_files-LOOP_END total_tasks_to_add: 9180, total_files_added_to_tasks: 9184, task_monitor.files_sent_to_processing: 0, total_files_on_tasks_dict: 9184, instance_id: 1329662498, memory: 56.52734375 
4 2012-1-19 14:42:0 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 57.81640625 
5 2012-1-19 14:42:0 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 57.81640625 
6 2012-1-19 14:42:1 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 57.9375 
7 2012-1-19 14:42:2 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 57.9375 
8 2012-1-19 14:42:2 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 58.03125 
. 
. 
. 
2183 2012-1-19 14:53:45 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 280.66015625 
2184 2012-1-19 14:53:45 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 280.66015625 
2185 2012-1-19 14:53:45 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 281.0 
2 186 2012-1-19 14:53:46 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 281.0 
2187 2012-1-19 14:53:46 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 281.0 
2188 2012-1-19 14:53:46 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 281.3828125 

フルトレース:http://pastebin.com/CcPDU6s7

taskqueue.add()にメモリーリークがありますか?

おかげ

+0

どのようにメモリ使用量を評価しますか? – proppy

+0

タスクからBLOBstore APIコールを削除すると、同様のメモリ使用パターンがありますか? – proppy

+0

こんにちはproppy:私は原因を見つけた:appstatsが有効になった...とにかくおかげで – theosp

答えて

3

これはあなたがバッチでタスクを追加するQueueを試してみました、あなたの特定の質問に答えていませんが?

http://code.google.com/appengine/docs/python/taskqueue/queues.html#Queue_add

一度に100のタスクまで追加することができます。

http://code.google.com/appengine/docs/python/taskqueue/overview-push.html#Quotas_and_Limits_for_Push_Queues

未テストコード。

queue = taskqueue.Queue(name="files-processor") 
while tasks: 
    queue.add(taskqueue.Task(...) for k,v in (tasks.popitem() for _ in range(min(len(tasks),100)))) 

あなたはまだ他の場所でtasksを使用したい場合は、少しこの構造を変更(またはコピーを作成)する必要があると思います。

+0

私はしなかったが、私は間違いなく!ありがとうございました – theosp

+0

元のコードをこれに置き換えて問題を解決しました(現在サポートしている最大負荷で動作します)。 queue.addの呼び出しが少なくて済むかもしれません。私は100以上のタスクを送信することで元の問題が発生するかどうかを確認しようとしなかった。時間が足りず、この量のタスクを生成する負荷を計画していない。 – theosp

+0

そして、質問:xrange()の代わりにrange()を使う理由がありますか? – theosp

関連する問題