2012-02-19 26 views
6

Đoạn mã sau thêm nhiệm vụ thực hiện một số chế biến trên các tập tin từ blobstore, nó chạy trên một B2 backend nên nó không có giới hạn thời gian chờ:appengine, python: Có rò rỉ bộ nhớ trong taskqueue.add() không?

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]})}) 

nhiệm vụ là một từ điển trong các hình thức sau đây:

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

x1, y1, z1 là tất cả các chuỗi

tools.debug là một chức năng tôi đã viết rằng gửi tin nhắn để sever địa phương của tôi sử dụng tìm nạp url (vì vậy tôi sẽ không phải chờ đợi 20m trong để có thể đọc các bản ghi):

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) 

từ tools.debug đã không có trong mã khi nó lần đầu tiên thất bại, tôi biết chắc chắn nó không phải là nguyên nhân cho các vấn đề bộ nhớ.

Tôi đã nhận lỗi này:

/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) 

Và ngay sau khi nó:

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

lần nữa, tôi nhận được nó cho mã trên mà không có dòng: tools.debug("add_tasks_to_process_files", "adding_task")

Bây giờ, hãy để tôi hiển thị cho bạn những gì tôi thấy trong trình gỡ lỗi của tôi:

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 

toàn bộ dấu vết: http://pastebin.com/CcPDU6s7

Có rò rỉ bộ nhớ trong taskqueue.add() không?

Cảm ơn

+0

Bạn đánh giá mức sử dụng bộ nhớ như thế nào? – proppy

+0

Bạn có mẫu sử dụng bộ nhớ tương tự không nếu bạn xóa cuộc gọi api blobstore khỏi công việc của mình? – proppy

+0

Xin chào proppy: Tôi đã tìm được nguyên nhân: các appstats đã được kích hoạt ... thanks anyway – theosp

Trả lời

3

Trong khi điều này không trả lời câu hỏi cụ thể của bạn, bạn đã thử Queue để thêm các công việc theo lô?

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

Bạn có thể thêm lên đến 100 nhiệm vụ cùng một lúc.

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

Mã chưa được kiểm tra.

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)))) 

Nếu bạn vẫn muốn sử dụng tasks ở nơi khác, bạn phải thay đổi cấu trúc này một chút (hoặc sao chép).

+0

Tôi đã không, nhưng tôi sẽ chắc chắn sẽ! cảm ơn bạn – theosp

+0

Thay thế mã ban đầu bằng cách này đã giải quyết được sự cố cho chúng tôi (Hiện tại, nó hoạt động cho tải tối đa mà chúng tôi muốn hỗ trợ). Có thể là do ít cuộc gọi đến queue.add. Tôi đã không cố gắng xem liệu việc gửi thêm x100 nhiệm vụ sẽ gây ra vấn đề ban đầu: thiếu thời gian, và chúng tôi không có kế hoạch tải của chúng tôi để sản xuất số lượng nhiệm vụ ... cảm ơn rất nhiều! – theosp

+0

Và, một câu hỏi: có lý do nào bạn quyết định sử dụng dải ô() thay vì xrange() không? – theosp