Зменшення використання пам'яті Django. Низько висячі фрукти?


136

Моє використання пам'яті з часом збільшується, і перезапуск Django не є добрим для користувачів.

Я не впевнений, як проаналізувати використання пам'яті, але деякі поради щодо початку вимірювання були б корисні.

У мене є відчуття, що є кілька простих кроків, які можуть призвести до великих прибутків. Переконайтеся, що "налагодження" встановлено на "False", це очевидно велике значення.

Чи може хтось запропонувати іншим? Скільки покращення буде кешування на сайтах з низьким трафіком?

У цьому випадку я працюю під Apache 2.x з mod_python. Я чув, що mod_wsgi трохи швидше, але було б складно переключитися на цьому етапі, якщо я не знаю, що прибутки будуть значними.

Редагувати: Дякую за пораду поки що. Будь-які пропозиції, як дізнатися, що використовує пам'ять? Чи є посібники з профілювання пам'яті Python?

Також, як згадувалося, є кілька речей, які зроблять складним перехід на mod_wsgi, тому я хотів би мати деяке уявлення про виграші, які я міг очікувати, перш ніж орати вперед у цьому напрямку.

Редагувати: Карл опублікував трохи більш детальну відповідь тут, яку варто прочитати: Розгортання Джанго: Розрізання накладних витрат Апача

Редагувати: Стаття Грем Дамплтон - найкраще, що я знайшов у матеріалах, що стосуються MPM та mod_wsgi. Я дуже розчарований, що ніхто не міг надати будь-яку інформацію про налагодження використання пам'яті в самому додатку, хоча.

Остаточне редагування: Ну, я обговорював це з Webfaction, щоб побачити, чи можуть вони допомогти з перекомпіляцією Apache, і це їхнє слово з цього питання:

"Я дійсно не думаю, що ви отримаєте велику користь, перейшовши на налаштування MPM Worker + mod_wsgi. Я вважаю, що ви зможете зекономити близько 20 МБ, але, мабуть, не набагато більше."

Так! Це повертає мене до мого первісного питання (з якого я все ще не мудріший). Як можна визначити, де лежать проблеми? Це загальновідома максимум, що ви не оптимізуєте без тестування, щоб побачити, де вам потрібно оптимізувати, але в навчальних посібниках щодо вимірювання використання пам'яті Python в пам'яті дуже мало, і жодна спеціальна для Django.

Дякую за допомогу усім, але я думаю, що це питання все ще залишається відкритим!

Ще одна остаточна редакція ;-)

Я запитав це в списку Джанго-користувачів і отримав деякі дуже корисні відповіді

Чесно кажучи останнє оновлення будь-коли!

Це було щойно випущено. Можливо, найкраще рішення: Профілювання розміру об'єкта Django та використання пам'яті за допомогою Pympler

Відповіді:


50

Переконайтеся, що ви не зберігаєте глобальних посилань на дані. Це перешкоджає збору сміття пітона вивільнити пам'ять.

Не використовуйте mod_python. Він завантажує перекладача всередині apache. Якщо вам потрібно використовувати apache, використовуйте mod_wsgiзамість цього. Не складно переключитися. Це дуже просто. mod_wsgiце спосіб простіше налаштувати на джанго, ніж мертвий mod_python.

Якщо ви зможете зняти апаш із своїх вимог, це було б ще краще для вашої пам’яті. spawningЗдається, це новий швидкий масштабований спосіб запуску веб-додатків python.

EDIT : Я не бачу, як перехід на mod_wsgi може бути " хитрим ". Це має бути дуже легким завданням. Будь ласка, докладно розгадайте проблему, яка виникає з комутатором.


4
@Josh: розквіт і використання пам'яті апачі є дурним, якщо ви не використовуєте лише функції apache. Це просто зайвий шар.
nosklo

3
Django все ще схвалює mod_python, оскільки mod_wsgi все ще досить новий, і вони хочуть бути консервативними. Але якщо ви будете дотримуватися спільноти Джанго, ви побачите людей, які масово переходять на mod_wsgi. Це не пройде багато часу, перш ніж це стане рекомендованим варіантом.
Карл Мейєр

1
@Tiago: apache добре, коли у вас вже багато віртуальних хостів apache, використовуючи SSL з apache і т. Д. У цьому випадку використовуйте mod_wsgi. Якщо ви починаєте заново, використовуйте нерест. НІКОЛИ не використовуйте mod_python.
nosklo

1
Спасибі, носкло. Я дивлюся на нерест .. Мабуть, мало документації. Я спробую дотримуватись інструкцій, які я знайшов у публікаціях блогу, і побачу, куди я можу потрапити.
Тіаго

1
Хм, як хтось тільки починає використовувати Django, я маю на увазі, що я повинен використовувати mod_wsgi.
Powerlord

28

Якщо ви працюєте під mod_wsgi і, імовірно, нерестуєте, оскільки він сумісний з WSGI, ви можете використовувати Dozer , щоб подивитися на використання пам'яті.

Під mod_wsgi просто додайте це внизу вашого сценарію WSGI:

from dozer import Dozer
application = Dozer(application)

Потім наведіть веб-переглядач на http: // domain / _dozer / index, щоб побачити список усіх розподілів пам'яті.

Я також просто додаю свій голос підтримки для mod_wsgi. Це робить різницю у світі щодо продуктивності та використання пам'яті над mod_python. Підтримка Graham Dumpleton для mod_wsgi є видатною, як з точки зору активного розвитку, так і в тому, щоб допомогти людям у списку розсилки оптимізувати їх установки. Девід Креймер на curse.com опублікував кілька діаграм (яких, на жаль, зараз я не можу знайти), де показано різке скорочення використання процесора та використання пам'яті після переходу на mod_wsgi на цьому веб-сайті з високим трафіком. Кілька дияволів джанго переключились. Серйозно, це не без розуму :)


У такому випадку я незабаром надсилаю запитання із запитом, як отримують аутентифікацію на основі файлів cookie для користувачів django, які отримують доступ до статичних файлів ...
Енді Бейкер

15

Ось які мені відомі рішення для профілерів пам'яті Python (не пов'язані з Django):

Відмова: Я маю частку в останньому.

Документація індивідуального проекту повинна дати тобі уявлення про те, як використовувати ці інструменти для аналізу поведінки в пам'яті програм Python.

Далі приємна "історія війни", яка також дає корисні вказівки:


5

Крім того, перевірте, чи не використовуєте ви жодного з відомих витоків. Як відомо, MySQLdb пропускає величезну кількість пам'яті за допомогою Django через помилку в обробці unicode. Крім цього, панель інструментів налагодження Django може допомогти вам відслідковувати свиней.


amix.dk/blog/viewEntry/19420 показує бульдозер, який використовується, щоб показати, що MySQLdb просочується пам'яттю. MySQLdb 1.2.3c1 і пізніші виправлення.
msanders

Як міг django-debug-toolbarдопомогти?
Wtower

4

Окрім того, щоб не зберігати глобальних посилань на великі об’єкти даних, намагайтеся уникати завантаження великих наборів даних у пам'ять взагалі, де це можливо.

Перейдіть на режим mod_wsgi в демон-режимі та використовуйте Apache-робочий mpm замість prefork. Цей останній крок може дозволити вам обслуговувати багато більше одночасних користувачів із значно меншими витратами на пам'ять.


Дивіться також відповідь Карла тут: stackoverflow.com/questions/488864/…
Енді Бейкер

Крім того - в кількох публікаціях, які я прочитав, здається, що справжній приріст полягає у переході на MPM для робітників, а не у використанні mod_wsgi ...
Енді Бейкер

4

На веб-сайті фактично є кілька порад щодо зменшення використання пам'яті джанго .

Основні моменти:

  • Переконайтеся, що для налагодження встановлено значення false (ви вже це знаєте).
  • Використовуйте "ServerLimit" у вашій конфігурації apache
  • Переконайтеся, що в пам'ять не завантажуються великі об'єкти
  • Розглянемо подачу статичного вмісту в окремому процесі або на сервері.
  • Використовуйте "MaxRequestsPerChild" у своїй конфігурації apache
  • Дізнайтеся та зрозумійте, скільки пам'яті ви використовуєте

2
Дякую, я їх уже читав. Це цифри 3 та 6, на які я сподівався трохи детальніше! ;-)
Енді Бейкер

3

Ще один плюс для mod_wsgi: встановіть maximum-requestsпараметр у своїй WSGIDaemonProcessдирективі, і mod_wsgi буде перезапускати процес демон так часто. Для користувача не повинно бути видимого ефекту, окрім повільної завантаження сторінки під час першого потрапляння свіжого процесу, оскільки він завантажує Django та код вашої програми в пам'ять.

Але навіть якщо ви робите є витоку пам'яті, які повинні тримати розмір процесу стає занадто великим, без переривання обслуговування для користувачів.


1
Щось подібне згадується тут: mail-archive.com/django-users@googlegroups.com/msg84698.html лише вони використовували час тактики неактивності замість максимальних запитів.
Томаш Андрле

3

Ось сценарій, який я використовую для mod_wsgi (називається wsgi.py, і вкладається в корінь мого проекту django):

import os
import sys
import django.core.handlers.wsgi

from os import path

sys.stdout = open('/dev/null', 'a+')
sys.stderr = open('/dev/null', 'a+')

sys.path.append(path.join(path.dirname(__file__), '..'))

os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
application = django.core.handlers.wsgi.WSGIHandler()

За необхідності відрегулюйте налаштування myproject.set і шлях. Я переспрямовую весь вихід на / dev / null, оскільки mod_wsgi за замовчуванням запобігає друку. Замість цього використовуйте журнал.

Для апачу:

<VirtualHost *>
   ServerName myhost.com

   ErrorLog /var/log/apache2/error-myhost.log
   CustomLog /var/log/apache2/access-myhost.log common

   DocumentRoot "/var/www"

   WSGIScriptAlias / /path/to/my/wsgi.py

</VirtualHost>

Сподіваємось, це, принаймні, повинно допомогти вам налаштувати mod_wsgi, щоб ви могли бачити, чи це має значення.


1

Кеші: переконайтеся, що вони промиті. Легко щось посадити в кеш, але ніколи не бути GC'd через посилання на кеш.

Код Swig'd: Переконайтеся, що будь-яке управління пам’яттю виконано правильно, його справді легко пропустити в python, особливо з сторонніми бібліотеками

Моніторинг: Якщо ви можете, отримайте дані про використання пам'яті та хіти. Зазвичай ви бачите кореляцію між певним типом запиту та використанням пам'яті.


1

Ми натрапили на помилку в Джанго з великими картами (10 000 предметів). Здається, Джанго намагається завантажити їх у пам'ять під час створення мапи сайту: http://code.djangoproject.com/ticket/11572 - ефективно вбиває процес apache, коли Google відвідує цей сайт.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.