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