我的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) 处理此请求后,发现处理此请求的进程使用了太多内存并被终止。这可能会导致新进程用于您的应用程序的下一个请求。如果经常看到此消息,则可能是应用程序中存在内存泄漏。
以下是两个日志的完整输出:
输出只是在这两个日志之间交替显示。请注意,我已经在模型的定义中禁用了缓存,所以不应该在每次函数调用时重置内存使用情况吗?