简单的Google App Engine示例中的内存泄漏

Bor*_*rja 5 python google-app-engine app-engine-ndb google-app-engine-python

我的Google App Engine应用程序似乎有内存泄漏,但我无法弄清楚原因.

在缩小了负责的代码行之后,我将问题简化为一个定期运行的简单cron作业,它所做的就是使用查询加载一些实体.

我包括使用的内存使用情况logging.info(runtime.memory_usage()),我可以看到内存使用量从一次调用增加到下一次调用,直到超过软私有内存限制.

以下是我使用过的代码:

class User(ndb.Model):
    _use_cache = False
    _use_memcache = False
    name = ndb.StringProperty(required=True)
    ...[OTHER_PROPERTIES]...

class TestCron(webapp2.RequestHandler):
    def get(self):
        is_cron = self.request.headers.get('X-AppEngine-Cron') == 'true'

        if is_cron:
            logging.info("Memory before keys:")
            logging.info(runtime.memory_usage())

            keys = models.User.query().fetch(1000, keys_only=True)

            logging.info("Memory before get_multi:")
            logging.info(runtime.memory_usage())

            user_list = ndb.get_multi(keys)

            logging.info("Memory after:")
            logging.info(runtime.memory_usage())
            logging.info(len(user_list))

app = webapp2.WSGIApplication([
    ('/test_cron', TestCron)
], debug=True)
Run Code Online (Sandbox Code Playgroud)

在cron.yaml我有:

- description: Test cron
  url: /test_cron
  schedule: every 1 mins from 00:00 to 23:00
Run Code Online (Sandbox Code Playgroud)

每分钟运行此任务时,每2次迭代就必须重新启动一个新实例.第一次以36mb开始,并在完成后说

此请求导致为您的应用程序启动新进程,从而导致您的应用程序代码首次加载.因此,此请求可能需要更长时间,并且比应用程序的典型请求使用更多CPU.

但是在第二次执行时,它开始使用107mb的内存(意味着它没有清除前一次迭代的内存?),它超出了软私有内存限制并通过以下方式终止进程:

在处理完6个请求后超过128 MB的软私有内存限制(134 MB)处理此请求后,发现处理此请求的进程使用了​​太多内存并被终止.这可能会导致新进程用于您的应用程序的下一个请求.如果经常看到此消息,则可能是应用程序中存在内存泄漏.

以下是两个日志的完整输出:

记录1(尚未破坏软内存限制)

记录2(打破软内存限制)

输出只是在这两个日志之间交替.请注意,我已在模型的定义中禁用了缓存,因此在每次调用函数时是否应重置内存使用情况?

小智 1

(我知道这个问题已经有一段时间没有更新了,发布这个问题是因为我过去也一直想知道这种行为。)

我有一段时间遇到了同样的问题,并最终在 ndb 的问题跟踪器上打开了一个问题。此行为是一个错误ndb

这个问题已在 2.2.0 版本中得到修复,在此之前,根据修复作者的说法,“在某些情况下,[ndb] 不尊重use_cache查询”

这是修复此问题的提交的链接