用python写了个守护进程调用django的models定时去查询数据库信息

后来发现进程运行之后内存持续增长,怀疑是内存泄漏,于是google一下,发现了两个有用的库 gc和objgraph



在可疑处代码中引入

import gc
import objgraph

### 强制进行垃圾回收
gc.collect()

### 打印出对象数目最多的 50 个类型信息
objgraph.show_most_common_types(limit=50)

查看输出发现dict类型的对象持续增长


[root@localhost templates]# tailf /tmp/main.log|grep '^dict' 

dict                                 5154

dict                                 5172

dict                                 5190

dict                                 5208

dict                                 5226

dict                                 5244

dict                                 5262

dict                                 5280

dict                                 5298

dict                                 5316

dict                                 5334

dict                                 5352

dict                                 5370

dict                                 5388


继续排查将一些代码暂时屏蔽掉,最终锁定在调用django的orm查询部分,查库的游标没被释放引起的

在官方文档https://docs.djangoproject.com/en/dev/faq/models/ 找到了方法


在每次定时查询完成后调用reset_queries()释放连接

from django.db import reset_queries
reset_queries()