【问题标题】:How to fix memory leak in my application?如何修复我的应用程序中的内存泄漏?
【发布时间】:2017-09-22 07:37:40
【问题描述】:

在我的 GAE 应用中,我将行添加到 Google 电子表格。

taskqueue.add(url='/tabletask?u=%s' % (user_id),
retry_options=taskqueue.TaskRetryOptions(task_retry_limit=0),
                            method='GET')

class TableTaskHandler(webapp2.RequestHandler):
    def get(self):
        user_id = self.request.get('u')
        if user_id:
            try:
                tables.add_row(
                    user_id
                )
            except Exception, error_message:
                pass



def get_google_api_service(scope='https://www.googleapis.com/auth/spreadsheets', api='sheets', version='v4'):
    ''' Login to Google API with service account and get the service
    '''
    service = None
    try:
        credentials = AppAssertionCredentials(scope=scope)
        http = credentials.authorize(httplib2.Http(memcache))
        service = build(api, version, http=http)
    except Exception, error_message:
        logging.exception('Failed to get Google API service, exception happened - %s' % error_message)
    return service

def add_row(user_id, user_name, project_id, question, answer, ss_id=SPREADSHEET_ID):
    service = get_google_api_service()
    if service:
        values = [
            [
                user_id, user_name, project_id, question, answer # 'test1', 'test2'
            ],
            # Additional rows ...
        ]
        body = {
            'values': values
        }
        # https://developers.google.com/sheets/api/guides/values#appending_values
        response = service.spreadsheets().values().append(
            spreadsheetId=ss_id,
            range='A1:E1000',
            valueInputOption='RAW',
            body=body).execute()

我添加了许多具有不同行值的任务。

在总共处理 5 个请求后,我收到严重错误“超过 128 Mb 和 158 Mb 的软私有限制”。

这里有什么问题?

【问题讨论】:

  • 这里有几篇关于任务队列引起的内存问题的帖子。这相当复杂,所以我建议查看这些帖子,然后在需要时更新您的问题。这是一个例子:stackoverflow.com/questions/33036334/…
  • @JeffO'Neill,这个问题是关于 NDB 而不是任务队列。而且我只在遇到内存泄漏时才实现任务队列(在任务队列使用之前有它)。
  • 我遇到了与 service.spreadsheets().values() 类似的内存泄漏,如果范围大于 100,则获取或附加。您是否设法解决此问题? @LA_
  • @BorkoKovacev,不,我还没有修复它 - 我已移至 Google Fusion Tables
  • @LA_ 你有融合表吗?我想知道,因为我遇到了与您完全相同的问题。

标签: google-app-engine memory-leaks


【解决方案1】:

乍一看,您的代码中没有什么特别之处可能导致内存泄漏。 我认为没有人能找到它,除非他非常熟悉使用的 3rd 方库及其现有的错误。所以我会这样处理这个问题:

  1. 首先让我们找出确切内存泄漏的位置以及它是否完全泄漏。

    请参阅tracemallocmemory_profilerheapy 或您熟悉的任何其他内容。大多数可用的分析器都列在这里Which Python memory profiler is recommended?

    预期结果:你清楚地知道哪里内存泄漏,直到代码行/python表达式

  2. 如果问题出在第 3 方代码中,请尝试深入挖掘其代码并找出其中的原因

  3. 取决于第 2 页的结果

    一个。发布另一个 SO 问题,例如“为什么这个 python 代码摘录会导致内存泄漏”——理想情况下,它应该是一个独立的代码 sn-p,它会导致没有任何第三方库的奇怪行为,并且可以在本地重现。环境规范 - 至少是 python 版本,不胜感激

    b.如果问题出在第 3 方库中并且您已经找到问题所在,请在 github/目标项目所在的任何地方打开错误报告

    c。如果问题显然出在第 3 方库中并且您无法找到原因,请打开一张工单,描述该案例并附上分析器的报告

【讨论】:

    【解决方案2】:

    您似乎正在运行实例类 B1 或 F1,其内存限制为 128 MB。

    一个可能的解决方案是使用更高的instance class。但请记住,选择不同的实例类会影响您的定价和配额。

    【讨论】:

    • 谢谢,Michael,这正是我所做的,但即使使用 B4 实例,我也会出现内存泄漏。
    猜你喜欢
    • 2017-06-28
    • 2020-05-25
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    相关资源
    最近更新 更多