Использование heapy для отслеживания утечек памяти в приложении Django - PullRequest
5 голосов
/ 07 августа 2011

Я следил за отличным постом здесь, как настроить 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 Ответ

0 голосов
/ 07 августа 2011

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

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

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

...