Pymongo,运动内存泄漏



背景:我使用龙卷风+电机,发现mem_usage增加。

然后我编写test.py。db。任务"size": 12192854 (10+ m)。1分钟后,MEM USAGE/LIMIT为1.219GiB/8GiB

env:

python 3.7.5
  • 电机2.5.0(升级前2.1.0)
  • multidict 4.7.5
  • pymongo 3.12.0

这是我的代码

import os
import gc
import time
import logging
import asyncio
import uvloop
import pdb
import pymongo
import base64
from tornado.platform.asyncio import AsyncIOMainLoop
from guppy import hpy
from motor import motor_asyncio

mongo_auth = 'xxxxx='
runtime_mongos = arch_mongos = {
"host": f"mongodb://{base64.b64decode(mongo_auth).decode()}@" + ','.join(
[
"1xxx:27024",
"2xxx:27024",
"3xxx:27024",
]),
"readPreference": "secondaryPreferred"
}
table = motor_asyncio.AsyncIOMotorClient(**runtime_mongos)["db"]["tasks"]
async def get_data():
return await table.find().sort([
("priority", pymongo.ASCENDING),
("start_uts", pymongo.ASCENDING),
]).to_list(None)
async def test():
while True:
a = await get_data()
print(len(a))
await asyncio.sleep(1)
gc.collect() # no use!
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(test())

最后,我发现python进程有很多线程,然后我得到了关于电机'ThreadPoolExecutor'的线索。

电机2.1代码:

if 'MOTOR_MAX_WORKERS' in os.environ:
max_workers = int(os.environ['MOTOR_MAX_WORKERS'])
else:
max_workers = tornado.process.cpu_count() * 5
_EXECUTOR = ThreadPoolExecutor(max_workers=max_workers)

我设置MOTOR_MAX_WORKERS=1, mem_usage保持在低水平

我在docker中部署我的项目。但是,容器的cpu不是排他的。我想这就是"max_workers"不合理的原因。

我的错……

最新更新