使用heapy来跟踪Django应用程序中的内存泄漏

时间:2021-02-24 19:20:30

I've followed excellent post here how to setup heapy with Django: http://www.toofishes.net/blog/using-guppy-debug-django-memory-leaks/

我在这里发表了如何使用Django设置heapy的优秀帖子:http://www.toofishes.net/blog/using-guppy-debug-django-memory-leaks/

I've commanded hp.setref() and now after awhile I get also data with hp.heap():

我已经命令了hp.setref(),现在一段时间后我也得到了hp.heap()的数据:

>>> hp.heap()
Partition of a set of 12075 objects. Total size = 1515496 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0   4048  34   339656  22    339656  22 str
     1   3112  26   269368  18    609024  40 tuple
     2    171   1   169992  11    779016  51 dict (no owner)
     3   1207  10   144440  10    923456  61 list
     4     49   0   102040   7   1025496  68 dict of module
     5    591   5    66984   4   1092480  72 unicode
     6    498   4    59760   4   1152240  76 function
     7    433   4    51960   3   1204200  79 types.CodeType
     8     57   0    50480   3   1254680  83 type
     9     36   0    31584   2   1286264  85 dict of class

But what now? What I should understand from this output? How I should start tracking down where those 'str' and 'tuple' objects belong?

但现在呢?从这个输出我应该理解什么?我该如何开始追踪'str'和'tuple'对象所属的位置?

With get_rp, I get following output:

使用get_rp,我得到以下输出:

>>> hp.heap().get_rp()
Reference Pattern by <[dict of] class>.
 0: _ --- [-] 12000 (0xd1d340 | 0xd88b50 | 0xf63f00 | __builtin__.Struct | __...
 1: a      [-] 137 dict (no owner): 0x761c30*160, 0x7655d0*1491, 0x781640*9...
 2: aa ---- [-] 45 dict of django.db.models.options.Options: 0xcf3110...
 3: a3       [-] 45 django.db.models.options.Options: 0xcf3110, 0xf0bb10...
 4: a4 ------ [-] 140 dict of django.db.models.related.RelatedObject: 0x10bec...
 5: a5         [-] 140 django.db.models.related.RelatedObject: 0xf14450...
 6: a6 -------- [-] 63 dict of django.db.models.fields.related.ForeignKey: 0x...
 7: a7           [+] 63 django.db.models.fields.related.ForeignKey: 0xf0e690...
 8: a5b ------- [-] 7 dict of django.db.models.fields.related.OneToOneField: ...
 9: a5ba         [+] 7 django.db.models.fields.related.OneToOneField: 0x15447...

Is the correct assumption now that it's Django that is leaking memory? But what are those dict's who don't have owner?

现在正确的假设是Django正在泄漏内存吗?但那些没有拥有者的那些词是什么?

1 个解决方案

#1


0  

I don't have any experience with heapy, but in my experience, Django (and most other Python programs) don't leak memory, but they also don't clean up memory as pristinely as some would like.

我没有任何堆积的经验,但根据我的经验,Django(以及大多数其他Python程序)不会泄漏内存,但它们也不会像某些人想要的那样原始地清理内存。

Also, Django has settings that cause it to consume memory for diagnostic reasons. For example, setting DEBUG=True can cause it to hold on to all SQL queries, so the longer the process runs, the more memory it uses.

此外,Django具有导致其出于诊断原因消耗内存的设置。例如,设置DEBUG = True可以使其保持所有SQL查询,因此进程运行的时间越长,它使用的内存就越多。

UPDATE: Your problem isn't in your Python code. Look at the summary heapy is giving you: the total size of memory represented there is 1.5Mb! When Python programs truly leak, the most common cause is a leaky C extension. Do you have any C extensions that you are running under your Django process?

更新:您的问题不在您的Python代码中。看看堆栈给你的摘要:表示的内存总大小是1.5Mb!当Python程序真正泄漏时,最常见的原因是泄漏的C扩展。你有没有在你的Django进程下运行的C扩展?

#1


0  

I don't have any experience with heapy, but in my experience, Django (and most other Python programs) don't leak memory, but they also don't clean up memory as pristinely as some would like.

我没有任何堆积的经验,但根据我的经验,Django(以及大多数其他Python程序)不会泄漏内存,但它们也不会像某些人想要的那样原始地清理内存。

Also, Django has settings that cause it to consume memory for diagnostic reasons. For example, setting DEBUG=True can cause it to hold on to all SQL queries, so the longer the process runs, the more memory it uses.

此外,Django具有导致其出于诊断原因消耗内存的设置。例如,设置DEBUG = True可以使其保持所有SQL查询,因此进程运行的时间越长,它使用的内存就越多。

UPDATE: Your problem isn't in your Python code. Look at the summary heapy is giving you: the total size of memory represented there is 1.5Mb! When Python programs truly leak, the most common cause is a leaky C extension. Do you have any C extensions that you are running under your Django process?

更新:您的问题不在您的Python代码中。看看堆栈给你的摘要:表示的内存总大小是1.5Mb!当Python程序真正泄漏时,最常见的原因是泄漏的C扩展。你有没有在你的Django进程下运行的C扩展?