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

时间:2017-04-12 10:29:18

标签: 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)

在cron.yaml中我有:

- description: Test cron
  url: /test_cron
  schedule: every 1 mins from 00:00 to 23:00

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

  

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

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

来终止进程
  

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

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

Log 1 (doesn't break soft memory limit yet)

Log 2 (breaks soft memory limit)

输出只是在这两个日志之间交替显示。请注意,我已经在模型的定义中禁用了缓存,所以不应该在每次函数调用时重置内存使用情况吗?

0 个答案:

没有答案