утечка памяти — gunicorn django mysqldb

#python #django #memory-leaks #mysql-python #gunicorn

#python #django #утечки памяти #mysql-python #gunicorn

Вопрос:

У меня утечка памяти в моем gunicorn django 1.5.1 mysqldb. Я начинаю изучать свой код с помощью gc и objgraph

когда рабочий gunicorn превысил 300 МБ, я собрал некоторую статистику:

 data['sum_leak'] = sum((getsizeof(o) for o in objgraph.get_leaking_objects()))  #2 mb
data['total_objects_length'] = sum((getsizeof(o) for o in gc.get_objects()))    #6 mb 
  

итак, где только 2 6 = 8 мб, в то время как рабочий gunicorn превышает 300 мб.

Поэтому я думаю, что проблема не в коде python, она глубже.

У меня есть: gunicorn == 0.17.2 mysqldb == 1.2.4

Я обновляю whem до 19.0.0 и 1.2.5 с помощью pip install, но pip frreze показывает старые версии, в то время как gunicorn -v и mysqldb.version_info показывают последнее обновление.

Итак, я думаю, как полностью переустановить gunicorn и mysqldb, чтобы убедиться, что они полностью удаляют старые (может быть, некоторые старые рудименты создают проблему)?

Также я получаю с помощью pmap некоторую информацию:

 pmap -x 805
805:   /usr/bin/python /usr/local/bin/gunicorn engine.wsgi:application -b 127.0.0.1:9005 --workers=2
Address   Kbytes     RSS   Dirty Mode   Mapping
08048000       0    1444       0 r-x--  python2.7
0829e000       0       4       4 r----  python2.7
0829f000       0     204     120 rw---  python2.7
082f4000       0      44      44 rw---    [ anon ]
09947000       0    3360    3360 rw---    [ anon ]
09c91000       0  253204  253204 rw---    [ anon ]
b5500000       0       4       4 rw---    [ anon ]
b5521000       0       0       0 -----    [ anon ]
b56d5000       0       0       0 -----    [ anon ]
b56d6000       0    1552    1552 rw---    [ anon ]
b6257000       0      12       0 r-x--  libpcre.so.3.12.1
  

кажется, здесь утечка — 09c91000 0 253204 253204 rw — [ аноним]

но я не знаю, что с этим делать.

Нужна помощь с некоторыми способами устранения этой утечки?

Комментарии:

1. У вас есть DEBUG=True в настройках Django? Это часто является причиной утечки памяти.

2. У меня DEBUG= False, все объекты python, собранные с помощью sum((getsizeof(o) для o в gc.get_objects())), имеют только 8 МБ во время утечки (3000 МБ), поэтому я думаю, что проблема не в коде python

3. Какой класс курсора вы используете? Я сталкивался с утечками памяти MySQLdb при использовании SSDictCursor .

Ответ №1:

Если вы считаете, что проблема вызвана работниками gunicorn, есть простой способ проверить гипотезу:

Запустите рабочие с параметром --max-requests *some positive number*

Это заставит gunicorn перезапустить каждого работника после того, как он обслужит указанное количество запросов.

В документации говорится: This is a simple method to help limit the damage of memory leaks.