Использование heapy для отслеживания утечек памяти в приложении Django

Я читал отличный пост здесь, как настроить heapy с помощью Django: http://www.toofishes.net/blog/using-guppy-debug-django-memory-leaks/

Я командовал 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

А что теперь? Что я должен понять из этого вывода? Как мне начать отслеживать, где находятся эти объекты 'str' и 'tuple'?

С 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...

Правильно ли предположение, что сейчас у Джанго утечка памяти? Но что это за диктанты, у которых нет владельца?

1 ответ

У меня нет опыта работы с heapy, но по моему опыту, Django (и большинство других программ на Python) не пропускают память, но они также не очищают память так, как хотелось бы некоторым.

Кроме того, у Django есть настройки, которые заставляют его использовать память по диагностическим причинам. Например, установка DEBUG=True может заставить его удерживать все запросы SQL, поэтому чем дольше выполняется процесс, тем больше памяти он использует.

ОБНОВЛЕНИЕ: Ваша проблема не в вашем коде Python. Посмотрите на резюме, которое дает вам heapy: общий объем представленной памяти составляет 1,5 МБ! Когда программы на Python действительно имеют утечку, наиболее распространенной причиной является расширение с утечкой. У вас есть какие-либо расширения C, которые вы запускаете в процессе Django?

Другие вопросы по тегам