Python 小烧瓶SQLAlchemy查询在芹菜任务中占用900Mb内存(Kubernetes群集)
我有一个非常简单的查询,在一个非常简单的表中:Python 小烧瓶SQLAlchemy查询在芹菜任务中占用900Mb内存(Kubernetes群集),python,flask,kubernetes,celery,flask-sqlalchemy,Python,Flask,Kubernetes,Celery,Flask Sqlalchemy,我有一个非常简单的查询,在一个非常简单的表中: def get_默认值(域): defaults=BaseDefaults.query.filter_by(domain=domain).first() 返回默认值 该表有(不是开玩笑的)3行,34列,1 PK,1 Unique,2 FK。属于以下类型: Timestamp: 2 Cols Integer: 5 Cols Booleans: 8 Cols VarChar(100) & Varchar(250): 19 Cols 通常,这
def get_默认值(域):
defaults=BaseDefaults.query.filter_by(domain=domain).first()
返回默认值
该表有(不是开玩笑的)3行,34列,1 PK,1 Unique,2 FK。属于以下类型:
Timestamp: 2 Cols
Integer: 5 Cols
Booleans: 8 Cols
VarChar(100) & Varchar(250): 19 Cols
通常,这些列中大约有5-8列具有空值。
此函数在芹菜任务的上下文中运行,芹菜任务的内存急剧膨胀(1.2Gb),而另一个正在运行的任务的内存约为110Mb
因此,我用内存分析器分析了代码,结果发现这个特定函数defaults=get\u defaults(domain)
消耗了大约800-900Mb的RAM,这完全没有意义
我在本地看不到同样的行为——它只发生在Kubernetes集群内(托管在DigitalOcean上),因此很难理解可能发生的情况
该函数查询托管在RDS上的Postgres DB,该数据库似乎工作正常(来自本地pc或SQL客户端的查询在不到200ms的时间内工作正常)
我还发现,大部分高内存消耗发生在第一次运行查询时,在第二次运行查询时(另一个任务运行),同一行增加了约120Mb的使用量,这似乎更合理。因此,芹菜炼金术中的会话管理也可能成为阻碍
它在集群中消耗大量RAM,并威胁节点的健康。如果我将吊舱的消耗限制在512Mb,吊舱会被创建,但随后就会死亡
关于如何排除故障、优化和修复此问题,有什么想法吗?对于遇到类似问题的任何人,我在backref
模型声明中修复了我的问题,即lazy=True
在数据库中一个完全不同的表开始快速增长之前,这不是一个问题-我们使用的是lazy='joined'
,它将自动连接所有与bsaedfaults
声明了关系的表
使用lazy=True
只加载查询的表,因此pod中的内存消耗从1.2Gb降至140Mb