7

Tôi đang yêu cầu dữ liệu từ API bên ngoài và đang ghi trực tiếp vào tệp Cloud Storage. Các dữ liệu viết tốt, nhưng khi tôi mở rộng quy mô, tôi đang chạy vào các vấn đề bộ nhớ và nhấn giới hạn 1024 MB trên các trường hợp GAE.Bộ nhớ GAE Rò rỉ khi ghi vào Cloud Storage, tôi có thể phát trực tuyến không?

Đây là những lỗi nghiêm trọng tôi nhận được:

Exceeded soft private memory limit of 1024 MB with 1425 MB after servicing 46 requests total 

Đây là một bản tóm tắt của mã Tôi đang sử dụng:

import cloudstorage as gcs 
import urllib2 

# Example file path 
filePath = '/bucket/dir/file.gzip' 

def deferrableTask(filePath, api_url, post_body): 
    with gcs.open(filePath, 'w') as f: 
     request = urllib2.Request(api_url, post_body) 
     try: 
     response = urllib2.urlopen(request, timeout = 600) 
     except urllib2.HTTPError, e: 
     raise customError(e) 
     else: 
     while True: 
      chunk = response.read(16 * 1024) 
      if not chunk: break 
      f.write(chunk) 
     f.close() 
     del f 
    gc.collect() 

Nhiệm vụ trên được thực hiện cho được deferrable sử dụng hàng công việc. Có thể có tới 40 trong số chúng chạy đồng thời trong một hàng đợi. Trong số app.yaml của tôi, tôi có các cài đặt sau:

instance_class: F4_1G 
automatic_scaling: 
    max_concurrent_requests: 4 

Mã này hoạt động để ghi dữ liệu api vào lưu trữ đám mây. Đó là khi tôi bắt đầu thực hiện hàng trăm yêu cầu mà tôi bắt đầu gặp phải vấn đề về bộ nhớ.

Các tệp gzip được yêu cầu có kích thước từ 300 kb đến 10-20 Mb và tôi nghĩ rằng bằng cách sử dụng gc.collect(), kết hợp với giới hạn số lượng yêu cầu đồng thời, sẽ đủ để cắt giảm rò rỉ bộ nhớ. Tôi cũng biết rằng urllib2 chỉ là trình bao bọc cho urlfetch của công cụ ứng dụng, nhưng việc tìm nạp không phải là vấn đề, đó là mở rộng quy mô.

Bộ nhớ biến đổi bao nhiêu f? Có thể truyền trực tiếp tới Google Cloud Storage, thay vì tải dữ liệu vào bộ nhớ mẫu đầu tiên không?

+0

Tôi gặp vấn đề tương tự. Ứng dụng web của chúng tôi đang cố gắng "ghi" một tệp vào GCS chỉ có 20 MB và yêu cầu không thành công thường xuyên với lỗi: 'Vượt quá giới hạn bộ nhớ riêng tư 128 MB với 216 MB sau khi hoàn thành 0 yêu cầu tổng số'. –

+0

Tôi không sử dụng bất kỳ loại quy mô nào. Tôi cũng không sử dụng các máy F4_1G, tôi đang sử dụng các F1 mặc định. Tôi không nghĩ rằng vấn đề này có bất cứ điều gì để làm với các lớp thể hiện hoặc cài đặt mở rộng quy mô. Tôi nhận được các lỗi bộ nhớ trên một cá thể F1 đơn lẻ, sau khi chỉ thử 1 yêu cầu. Phải có điều gì đó sai với lib cloudstorage'? –

+0

Tôi nghĩ đó là trường hợp. Ngay cả với việc thu gom rác cưỡng bức, các cá thể vẫn giữ lại quá nhiều nhiệm vụ vào bộ nhớ, điều này khiến tôi tin rằng có cái gì đó sai với chính App Engine. Công việc duy nhất xung quanh là gửi các tác vụ không thành công đến hàng đợi lặp lại để thử lại sau, nhưng ngay cả khi đó một số tác vụ lớn hơn sẽ không bao giờ kết thúc. – Jabberwockey

Trả lời

0

Có một cách để bạn có thể ghi dữ liệu trực tiếp vào GCS từ ứng dụng Bên ngoài, bạn phải thay đổi ACL của nhóm thành công khai và sau đó với sự trợ giúp của dữ liệu ghi API lưu trữ đám mây cái xô.

Ngoài ra, hãy cho tôi biết bạn đã bỏ lỡ bất kỳ chi tiết nào về cấu hình chia tỷ lệ tự động trong câu hỏi của bạn. Nếu có thì vui lòng chỉ định các chi tiết đó.

+0

Dữ liệu là bí mật và độc quyền, có nghĩa là thùng không bao giờ được công khai. – Jabberwockey

Các vấn đề liên quan