【问题标题】:Pymongo, Motor memory leakPymongo,电机内存泄漏
【发布时间】:2021-08-05 14:49:34
【问题描述】:

背景:我用tornado + motor,发现mem_usage增加了。

然后我编写 test.py 代码。 db.tasks “大小”:12192854 (10+M)。一分钟后,MEM USAGE / LIMIT 为 1.219GiB / 8GiB

环境:

  • 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())

【问题讨论】:

  • a 仍然持有对数据的引用。当您运行垃圾收集器时,a 仍在作用域内,因此不会被清理。如果您在调用gc.collect() 之前添加del a,它是否可以正常工作。
  • @dirn 'a' 会持有一些mem,但实际上,我编码“await get_data()”,mem 仍然增加。最后,我尝试“del a”,问题依旧存在

标签: python-3.x pymongo python-asyncio tornado


【解决方案1】:

最后,我发现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'不合理的原因。

我的错……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-15
    • 2015-08-16
    • 2017-07-14
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多