gpt4 book ai didi

python - Google App Engine/Datastore/Flask/Python 应用程序中的内存泄漏

转载 作者:行者123 更新时间:2023-12-04 11:30:28 29 4
gpt4 key购买 nike

我构建了一个简单的新闻聚合器站点,其中我所有 App Engine 实例的内存使用量不断增长,直到达到限制并因此被关闭。
我已经开始消除我的应用程序中的所有内容,以获得一个最小的可重现版本。这就是我现在所拥有的:


app = Flask(__name__)

datastore_client = datastore.Client()

@app.route('/')
def root():

query = datastore_client.query(kind='source')
query.order = ['list_sequence']
sources = query.fetch()

for source in sources:
pass

统计数据显示了典型的锯齿模式:在实例启动时,它会达到 190 - 210 Mb,然后在某些请求(但不是所有请求)时,内存使用量增加 20 - 30 Mb。 (顺便说一下,这大致对应于查询结果的估计大小,虽然我不能确定这是相关信息。)这种情况一直发生,直到超过 512 Mb,当它被关闭时。它通常发生在对“/”的第 50 - 100 个请求左右。在此期间,不会对其他任何事物提出其他请求。
现在,如果我消除了“for”循环,只剩下查询,问题就会消失,内存使用量保持在 190 Mb 平坦,即使在 100 多个请求之后也没有增加。
最后的 gc.collect() 没有帮助。我还尝试查看函数开头和结尾处 tracemalloc 统计信息的差异,但没有发现任何有用的信息。
请问有人遇到过类似的吗?任何想法这里可能会出现什么问题?您可以推荐哪些额外的测试/调查?这可能是我无法控制的 Google App Engine/Datastore 问题吗?
谢谢你。
enter image description here

最佳答案

Now, if I eliminate the "for" cycle, and only the query remains, the problem goes away, the memory usage remains at 190 Mb flat, no increase even after 100+ requests.

query.fetch()返回一个迭代器,而不是一个实际的结果数组
https://googleapis.dev/python/datastore/latest/queries.html#google.cloud.datastore.query.Query.fetch
查看源代码,看起来这个迭代器具有获取查询的下一页的代码。所以你 for 循环强制它获取结果的所有页面。事实上,在您开始迭代之前,我认为它实际上不会获取任何东西。所以这就是为什么删除你的 for 循环会有所作为
不幸的是,除此之外我不确定,因为当您深入挖掘源代码时,您很快就会遇到 GRPC stub ,并且不清楚问题是否出在那里。
有一个与您类似的问题,提问者发现与实例化 datastore.Client() 有关的内存泄漏.
How should I investigate a memory leak when using Google Cloud Datastore Python libraries?
这最终与 GRPC 中的一个问题有关,如果 GRPC 没有关闭,它就会泄漏
https://github.com/grpc/grpc/issues/22123
希望这为您指明了正确的方向

关于python - Google App Engine/Datastore/Flask/Python 应用程序中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63898397/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com