我在一个非常简单的表中有一个非常简单的查询:
def get_defaults(domain):
defaults = BaseDefaults.query.filter_by(domain=domain).first()
return defaults该表有3行(不开玩笑),有34列,1 PK,1唯一,2 FK。属于下列类型:
Timestamp: 2 Cols
Integer: 5 Cols
Booleans: 8 Cols
VarChar(100) & Varchar(250): 19 Cols通常,这些列中大约有5-8个具有空值。这个函数运行在一个芹菜任务的上下文中,这个任务在内存中爆炸(1.2Gb),而另一个正在运行的任务大约使用110 in。
所以我用memory_profiler分析了代码,结果是这个特定的函数defaults = get_defaults(domain)消耗了大约800到900 no的内存,这是完全没有意义的。
我在本地看不到同样的行为--它只发生在Kubernetes集群(托管在DigitalOcean上)中,因此很难理解可能发生了什么。
该函数查询托管在RDS上的Postgres DB,它似乎运行良好(来自本地pc或SQL客户端的查询仅工作不到200 on )。
我还发现,大部分高内存消耗发生在第一次运行查询时,在第二次运行查询(另一个任务运行)时,同一行的使用量增加了大约120 of,这似乎更有道理。同样,芹菜中的中的会话管理也会受到阻碍。
它消耗了集群中大量的RAM,并威胁到节点的健康。如果我把豆荚的消耗限制在512 If以内,豆荚就会被创建,但在那之后就会死掉。
关于如何排除、优化、修复这个问题,有什么想法吗?
发布于 2021-02-13 00:15:49
对于正在经历类似事件的人,我在backref模型声明中修复了backref的问题。
在数据库中的一个完全不同的表开始快速增长之前,这并不是一个问题--我们使用的是lazy='joined',它将自动连接每个具有BsaeDefaults声明的关系的表。
通过使用lazy=True,您只加载了所查询的表,因此吊舱中的内存消耗从1.2Gb降至140 to。
https://stackoverflow.com/questions/66173740
复制相似问题