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