gpt4 book ai didi

python - 调试 asyncio 内存泄漏

转载 作者:行者123 更新时间:2023-12-01 07:01:24 35 4
gpt4 key购买 nike

如何调试 asyncio(使用 aiohttp)应用程序以查找内存泄漏?

应用程序:100 个异步协程,从 Redis 读取消息,进行一些外部 API http 调用,并将结果保存到数据库中。

问题就在这里:在更大的消息数量(10k-20k)上,应用程序使用的 RAM 内存在每条消息之后都会增加。

使用 objgraph 进行调试,例如:

print(objgraph.show_growth(limit=100))

每条新消息后都显示完全相同的结果:

weakref                        6163        +4
dict 19192 +3
builtin_function_or_method 1911 +3
tuple 16880 +2
function 25375 +1
method 496 +1
Event 8 +1
Condition 8 +1
deque 14 +1
SplitResult 15 +1
Context 15 +1
Thread 7 +1

这一切都不是我亲手创建的,所以这都是第三方依赖项。

还发现了有趣的项目:其中一本字典(来自 show_growth)是:

{'_context': <ssl.SSLContext object at 0x10a4ce228>, 
'_server_side': False,
'_server_hostname':
'my.host.name',
'_state': 'SHUTDOWN',
'_incoming': <_ssl.MemoryBIO object at 0x10a620b30>,
'_outgoing': <_ssl.MemoryBIO object at 0x10a620b10>,
'_sslobj': <ssl.SSLObject object at 0x10a664ac8>,
'_need_ssldata': True,
'_handshake_cb': <bound method SSLProtocol._on_handshake_complete of <asyncio.sslproto.SSLProtocol object at 0x10a664630>>,
'_shutdown_cb': <bound method SSLProtocol._finalize of <asyncio.sslproto.SSLProtocol object at 0x10a664630>>
}

正如您所看到的,这就像调用或响应的结果。有没有可能,所有响应都在这里,因此它保存每个响应并且 RAM 正在增加?

如何处理?或者你能建议另一种方法来找到应用程序的薄弱环节吗?

最佳答案

不断增长的字典是_SSLPipe asyncio内部类的__dict__

你会尝试uvloop , Шt 是具有不同 SSL 传输实现的替​​代事件循环。

此外,该错误可能取决于所使用的 Python 版本。你检查过最新的Python(目前是3.8)吗?

关于python - 调试 asyncio 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58616723/

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