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
(我知道这个问题已经有一段时间没有更新了,发布这个问题是因为我过去也一直想知道这种行为。)
我有一段时间遇到了同样的问题,并最终在 ndb 的问题跟踪器上打开了一个问题。此行为是一个错误ndb。
这个问题已在 2.2.0 版本中得到修复,在此之前,根据修复作者的说法,“在某些情况下,[ndb] 不尊重use_cache查询”。
| 归档时间: |
|
| 查看次数: |
896 次 |
| 最近记录: |