Django Framework

индекс
178,08

Используем память разумно, или mod_wsgi на 256 мегабайтах

Какое-то время назад потребовалось перенести проекты с выделенного сервера на VPS. Для этих целей был выбран slicehost. В общем и целом контора нравится и готов её рекомендовать всем.

Случилась лишь одна проблема: начали приходить уведомления о слишком сильном использовании диска (чтение/запись). Долгое время проблема не находила решения из-за отсутствия времени, но это вылилось в непонятные отказы, сопровождавшиеся статистикой в >200% CPU usage. После долгих извращений, была найдена проблема, а затем и её решение.

Проблема оказалась в том, что использовался swap. Для справки: у меня 256Mb слайс (т.е. RAM), apache2, mod_wsgi, django, postgresql, всё это на arch linux.

Для несведующих, размер swap можно посмотреть командой free -m (кстати, хорошая статья eng).

Итак, на входе имеем картину:
             total       used       free     shared    buffers     cached
Mem:           256        251          4          0          1         26
-/+ buffers/cache:        224         31                                 
Swap:          511        227        284   


Как видно, swap используется и… это уже плохо. swap — есть ни что иное как попытка компенсировать недостаток ОЗУ за счёт HDD. Т.е. если ОС понимает что данные не влезают в оперативную память, она их свапит на жёсткий диск. Как известно, ОЗУ гораздо… ГОРАЗДО быстрее HDD, но даже не в этом дело — жёсткий диск имеет свой ресурс на чтение/запись (из-за движущихся частей), вот почему слайсхост и подгоняется за использование swap.

Теперь более конкретно. Если вы ещё используете django с mod_python — выкидывайте последний. Если wsgi, то далее подробней.

Тюнинг апач ни к чему адекватному не привёл, поэтому было принято решение копаться в настройках WSGI. Интересовать нас будет директива WSGIDaemonProcess (к слову сказать, находится в VirtualHost). В прстейшем случае, принимает лишь имя процесса, но этого мало для тонкой настройки.

По большей части нас интересует опция stack-size. По-умолчанию она равна 8Мб на поток. Т.е. даже при 15 потоках на 1 процесс мы будем иметь 15*8 = 120 Mb. Согласитесь, не мало. В руководстве к mod_wsgi написано, что в условиях VPS это значние можно уменьшить до 512kb (524288 байт), что уже будет всего 4Mb. Теперь WSGIDaemonProcess будет выглядеть так:
WSGIDaemonProcess mysite maximum-requests=200 stack-size=524288

Здесь maximum-request=200 — количество запросов после которых процесс будет перезапущен. Это помогает при наличии утечек памяти: при перезагрузке память процесса приходит в изначальное состояние.

Вприницпе, я на этом и остановился, поскольку достиг более чем приемлимых результатов

             total       used       free     shared    buffers     cached
Mem:           256        203         53          0          2         29
-/+ buffers/cache:        170         85                                 
Swap:          511          6        505 


Если вам недостаточно и этого, то стоит обратить внимание ещё на пару опций:
  • threads — количество тредов на процесс (по-умолчанию 15)
  • inactivity-timeout — время через которое процесс будет считаться неактивным и будет перезагружен. Подходит для редко посещаемых сайтов, позволяет регулярно чистить память.
  • processes — количество процессов (по-умолчанию 1)

Так же не забываем про
WSGIPythonOptimize 2
т.к. изначально оно равно 0 (т.е. без оптимизации).

Ну вот и всё, комментарии приветствуются :)

via Retta
+32
14 февраля 2009, 19:40
51

комментарии (97)

+5
ExxY #
>Если вы ещё используете django с mod_python — выкидывайте последний.
Вопрос:
Почему на оффсайте написано «Apache with mod_python currently is the preferred setup for using Django on a production server.»?
Без сарказма — интересны ваши мысли по этому поводу…
0
liq #
вот бородатый бенчмарк на эту тему. superjared.com/entry/quick-django-benching/

В общем они когда писали django ориентировались на mod_python
0
crash #
mod_wsgi еще не добрался до «стабильной» 1.0, думаю, когда зарелизится — джангодок порекомендует его :)
0
crash #
а, эт я напутал с версиями, все там стабильно уже
+1
ExxY #
нет, на самом деле это просто гениально ставить в карму минус за такой коммент.
0
marazm #
Прежде всего это PEP, т.е. спешиал фо питон. Соответственно всё что будет нового — только во благо питонистам. Ну и производительность выше. Хотя не могу сказать что apache в этой связке идеальное звено, лучше использовать nginx, но заморачиваться со сборкой кастомного пакета в arch как-то не захотелось :)
0
mkevac #
На production серверах память не так важна — её много. А вот скорость критична.
0
crash #
>maximum-requests=200
а чего так мало?
+1
crash #
Кстати попробовал на своем 256 слайсе, хотя проблем со свопом вроде нет, но запросы/сек упали с 915 до 412 на закешированном memcached проекте.
0
makkintosh #
Спасибо очень интересно. у меня на вебфекшене стоит проект с mod_python. надо попробовать перейти на wsgi. сайтп правда не оч посещаемый… глупы вопрос такой — как понять что от mod_python стало всем плохо?

я вижу сейчас вот такую картину

$ free -m
total used free shared buffers cached
Mem: 4054 3916 137 0 17 452
-/+ buffers/cache: 3447 607
Swap: 1992 369 1622

Мне пора вешаться? :)
+1
MazaFakagro #
Потихоньку да. Написал ниже но повторюсь. nginx+wsgi для VPS самое то. И память экономят и скорость в разы быстрее.
0
darkk #
А можете прокомментировать разницу между nginx+fastcgi и nginx+wsgi?
0
MazaFakagro #
wsgi как я понял(а я пака-что полный новичёк) создавался специально для python, а fastcgi уже для CGI, PHP и питона.
0
vpol #
это несколько разный уровень.
0
MazaFakagro #
Если не трудно разъясните пожалуйста. Сам в этом толком так и не смог разобраться.
0
vpol #
0
MazaFakagro #
Спасибо, теперь всё понял.
0
mocksoul #
исходник mod_wsgi — 1 файл и примерно 8тыс строк. Не смертельно же? Такие вещи вообще полезно разглядывать — умнее станете уж точно ибо Грэхэм — очень достойный и умный мужик. Ну и плюс почитайте pep о wsgi.

www.ohloh.net/accounts/5497

0
makkintosh #
кстати забыл сказать я не на впс… :)
–1
AnatolyB #
Вы с использованием термина ПЗУ уверены, потому что:

«Постоянное запоминающее устройство (ПЗУ) — энергонезависимая память, используется для хранения неизменяемых данных.»

а для файла подкачки используется дисковая память.
–1
AnatolyB #
Вы с использованием термина ПЗУ уверены? Потому что:

0
AnatolyB #
Интересно, за что минусуют. Кто-то может пояснить?
0
marazm #
Вы видели ПЗУ быстрее чем ОЗУ? Или ПЗУ с безграничным ресурсом? Мне было бы интересно узнать :)
–1
AnatolyB #
Я ведь не говорил, что одно быстрее другого. Мне думается, что «ОЗУ гораздо… ГОРАЗДО быстрее HDD» звучит несерьезно, почему бы не привести цифры?
0
marazm #
Зачем вам цифры? Тем более что всё зависит от типа того и другого
0
AnatolyB #
Кто-то прошелся по всем моим комментариям и заминусовал. :)))
Ай-яй-яй, держите себя в руках!
0
marazm #
Может вы слишком умный? :)
–9
AnatolyB #
> ГОРАЗДО быстрее ПЗУ, но даже не в этом дело — жёсткий диск имеет свой ресурс на чтение/запись

Статья была бы лучше, если бы подобные утверждения были подкреплены цифрами.
А так же вывод, что ресурс дисковой памяти важнее ее скорости.
–1
AnatolyB #
И это за что минусуют? Просьба пояснить, почему ресурс дисковой памяти важнее ее скорости.
0
marazm #
Ответ: менять каждый час (утрирую) HDD (вас этот термин устроит? мне «жёсткий диск» ухо режет) не самое удачное и выгодное занятие :)
–1
AnatolyB #
Seagate Cheetah имеет гарантию 5 лет, о каком «каждом часе» вы говорите?
0
marazm #
Vertu имеет пожизненную гарантию. Продолжим?
–1
AnatolyB #
Пожизненная гарантия — это не вечная гарантия и зависит от того, что под этим понимает производитель. Например, пожизненная гарантия может означать:

«с момента приобретения устройства Заказчиком через сеть официальных реселлеров и до истечения срока продолжительностью 1 (один) календарный год с даты снятия данной модели с производства.»

т.е. если модель выпускается в течении двух лет, пожизненная гарантия получается всего три года.
0
marazm #
Боюсь огорчить, но vertu даёт пожизненную гарантию в самом прямом смысле слова.
–1
AnatolyB #
А ссылку можно, подтверждающий этот факт?

На официальном сайте говорится про 2-годичную гарантию:

www.vertu.com/sitemap/en/for-owners/frequently-asked-questions/
+3
vpol #
— Apache2
++ Lighttpd

Ну и django я бы тоже выкинул, ибо комбайны никогда не были экономными.
+2
crash #
ассемблер забыли
0
vpol #
ирония не к месту.
у меня pylons ест в 6 раз меньше памяти при той же нагрузке.
+2
daevaorn #
И таком же приложении?

Можете поподробней рассказать?
0
vpol #
да, признаю. pylons-проект был оптимизирован в 'сильнее некуда'… но даже преимущество по расходу ресурсов и соответственно (в большинстве случаев это так) быстродействию впечатляет.

django — это для 'мне нужно сделать вэб-сайт'
pylons — это когда на процесс проектирования и разработки накладывается масса условий — начиная от 'давайте влезем в middleware и скрестим это все с ...' и заканчивая 'не более 100 мбайт на instance' (надеюсь суть донес).
0
vpol #
s/даже преимущество/даже 30-50%% преимущество/
0
daevaorn #
Да. Спасибо.

Не очень понятно почему теже самые ограничения невозможно наложить на джанговское приложение.

И возможно именно специфика вашей задачи сыграла роль.
–1
vpol #
вот тут начинается самое интересное. внутренности django очень сильно завязаны 'друг на друга'. замена одной компоненты черевата серьезной доработкой (слово неудачное).

в pylons все существенно проще. потратьте неделю-две на изучение внутренностей, и будете дописывать части к фреймворку или заменять существующие на другие с такой же легкостью, с которой разбирается конструктор lego.
0
daevaorn #
Да, вы правы.

Но зачастую наличие готовой среды пусть и достаточно жесткой (хотя то что джанга монолитная — миф) предпочтительней чем набор компонентов и которых ещё надо эту среду построить и к ней адаптироваться. Но тут опять всё упирается в конкретные задачи и цели.
0
vpol #
я ведь не против django. оба продукта из лагеря python, поэтому больше фреймворков, хороших и разных. и да, я согласен с ориентацией на конкретную задачу. лично для меня это обычно вэб приложения/сервисы, и в меньшей степени сайты.
+2
vpol #
Хорошую примирительную цитату нашел. Несмотря на то что мы не ругались :)

In the world of photography, this is the same as the fight between Nikon and Canon. Which is better, you ask one photographer and they will say Canon. Another will say Nikon. And yet another will say neither, because Leica is superior. What most people don't realize is this opinion is just that—an opinion.

Should you rephrase the question as «What camera system is best for me?» you will receive a more diplomatic answer almost universally: choose the system that has the features, ergonomics, and price point you want. The reason for this, of course, is that cameras and web frameworks are tools. If your tool doesn't work the way you want it to, you will resist it. This is why some people simply hate Django or Rails; It doesn't fit into their style or personality.

(отсюда)
0
MazaFakagro #
Вах. Красиво и точно сказано.
0
marazm #
Ну лейку зря приплели, разный класс =)
+1
mocksoul #
однажды я выкинул django templates в пользу jinja2. В другой раз получилось оторвать django.conf в пользу своего менеджера настроек. В другой раз получилось сделать многоуровневые приложения. И вот совсем недавно сделали возможносьт подключать приложения оп нескольку раз.

чуть ниже хорошо прозвучало «то что джанга монолитная — миф». Ну а больше всего меня бесят фразы не подкреплённые фактами. Воздух.
0
ingspree #
Поподробнее про свой менеджер настроек можно?
0
alekam #
Поддерживаю. Тоже интересно услышать про менеджер настроек.
0
z_z #
Ололо, джанга настолько слабо связанная насколько это можно. Потратьте неделю на исследование исходников и сможете сделать все что хотите :)

0
marazm #
То о чём статья, как раз и есть
> 'мне нужно сделать вэб-сайт'
+ стоимостью до 20 тыс. руб (вкл. дизайн). Так что…
0
troorl1985 #
Расход памяти очень сильно зависит от того, каким боком использовался Django. Можно конечно наподключать кучу контрибов и удивляться большому расходу памяти. Но если не делать глупостей, то память расходуется вполне себе экономно и уж точно не в 6 раз больше, чем в любом другом фреймворке. Хотя, если у тебя есть какие-то конкретные данные, может из профайлера или ещё что-то, то я бы на это с интересом посмотрел, а то может действительно джанга начала толстеть в каком-то месте.
+1
mocksoul #
true

джанго без контрибов = простейший маппинг re -> view.

я бы всем новым проектам советовал бы изначально отказываться от django templates в пользу jinja2/mako. На крупных приложениях с 3-уровневым наследованием темплейтов время их выполнения растёт экспотенциально =(.
0
egorinsk #
Apache не разрабатывался с прицлом на производительноть. а на соответствие стандартам, так что товарищ vpol прав.
0
mocksoul #
апач — комбайн. Но если из него вырезать все левое, статически собрать с worker_mpm — он будет в некоторых задачах быстрее lighttpd, в некоторых медленнее. Разница в обе стороны не превышает 1-2%.

У меня бинарник апача со статически собранными модулями внутри весит 1.6мб. В дефолтной поставке было 9мб.

Внутри же — apache — пожалуй я не знаю ни одного opensource приложения с более логичной внутренней структурой. Lighttpd же зашёл в тупик.

Так что все эти разговоры, мол апач не делался с прицелом на производительность — просто незнание принципов его файнтюнинга.
0
egorinsk #
Фраза, если что, была прочитана где-то в документации Апача) НО согласен, вручную настроенный апач явно будет быстрее.
+1
l2k #
Замените слово ПЗУ на НЖМД или HDD, пожалуйста. Слух очень сильно режет, если честно.
Это тоже самое, что Метро называть Электричкой.
–1
AnatolyB #
Вообще, ПЗУ всегда было синонимом ROM
+1
ingspree #
Да ну? Какие новости, однако.
0
AnatolyB #
Ну да, что в этом удивительного? Это азы информатики.
–2
ingspree #
Классная наука, информатика. Это Вас в школе такому учили?

В Википедии, конечно, написано то же самое, но писали статью, видимо, стандартные российсковикипедные авторы.

Есть ОЗУ — оперативное ЗУ. Есть ПЗУ — постоянное ЗУ. Их два вида, ничего посредине нет. Отличаются тем, что ОЗУ при отключении энергии теряет всю информацию, а ПЗУ — нет.
0
AnatolyB #
Это вы сами сочинили? Есть еще ППЗУ.
–1
ingspree #
Чем это противоречит?
+1
l2k #
это показывает отсутствие вашего образования :)
0
l2k #
Вы абсолютно правы.

Как ROM переводится? Read Only Memory!

А автор пишет об Жеских дисках…
–2
ingspree #
Учу читать, 50$ в час.

P.S. Hint: в статье нет слова ROM. И не было.
0
l2k #
Статья была исправленна. Как видишь «HDD» даже выделенно — потому что именно оно и исправлялось.
Вы не правы.
–1
ingspree #
Это Вы не умеете делать правильных выводов. Каким образом из того, что статья была исправлена, вытекает моя неправота? Я говорил, что там не употреблялся термин ROM.

А HDD — это именно ПЗУ. Или Вы хотите сказать, что это ОЗУ?
0
l2k #
Вроде и лет тебе не так мало, чтобы путать такие простые понятия.

На пальцах:
Постоянно запоминающие устройства (ПЗУ, ROM по английски) — называются постоянными потому, что когда отключаешь электроэнергию, память остаётся.
Правильно, на HDD тоже остаётся память, но ты будешь сильно удивлён — она там останется на несколько лет, после чего начнёт размагничиваться. (пока снова не подать питание)
ПЗУ обычно называют микросхемы, которые прошили один раз и забыли о них. Техника на месте не стоит, и уже давно используются микросхемы, которые можно много раз перезаписывать (например, микросхема BIOS).
CD-ROM — это тоже относится к ПЗУ (пробил в нужных местах дырки лазером на CD-диске и используй его, пока читается).
Перфокарты — это тоже ПЗУ.
Даже Flash Memory можно назвать ПЗУ, потому что она делается какраз на микросхемах EEPROM. (заметь, слово оканчивается на ROM не случайно)

Но винчестер (HDD) — это уже не ПЗУ.

Кстати, в en.wikipedia.org/wiki/Read-only_memory есть ссылка на русский… Посмотри — оно тебя перенесет именно на ПЗУ.
0
l2k #
Добавлю лишь, что Flash Memory — это не просто ПЗУ, а Электрически Стираемое Перепрограммируемое ПЗУ (ЭСППЗУ или EPPROM, как уже говорил)
–1
marazm #
Сами бы определились :)
0
AnatolyB #
Вместо HDD было ПЗУ.
–2
ingspree #
ПЗУ — это не ROM.
–1
AnatolyB #
Может, в вашей личной терминологии это и не ROM, а в общепринятой — это ROM.
–2
ingspree #
proof-link?
0
AnatolyB #
Любой учебник информатики, если ссылка из справки Microsoft Windows для вас не авторитет: windowshelp.microsoft.com/Windows/ru-RU/help/cdf9dbcc-1243-4dd4-9077-37e24b1ab9671049.mspx
0
MazaFakagro #
ну тогда уж лучше заодно и nginx+wsgi(fapws3)

william-os4y.livejournal.com/
+1
evilkost #
в продакшен сырую ~бету?
0
MazaFakagro #
Про бету это вы где прочитали? А так если нет доверия то есть и другие WSGI www.wsgi.org/wsgi/Servers

Тут важнее заменить апач!
+1
mocksoul #
fapws внутри просто ЧУДОВИЩЕН. Человек который его пишет лишь экспериментирует с асинхронным прграммированием на си, без должного опыта.

а вот apache… давайте поспорим на пиво что я смогу сделать сборку апача которая будет быстрее nginx, lighttpd и fapws при выплевывании традтиционного hello world посредством питона?

apache очень большой внутри, но и исключительно логичен. Одна только apr чего стоит.
0
daevaorn #
Кстати, да, fapws3 нестабилен, Причем даже более чем тот же flup.

И вообще недавняя некая истерия прокатившаяся по сообществу питонистов/джангистов по поводу асинхронных WSGI серверов явно связана с тотальным непониманием их принципов, недостатков и достоинств.
0
MazaFakagro #
Мдя, прошу прощения. Эти Истерия отразилась и на мне как новичке особенно :-(
0
Xobb #
Интересно было почитать. У самого на слайсхосте VPS с 512 ОЗУ на ubuntu8.04. Там довольно большой магазин на мадженто, так памяти обычно 300 метров занято, остальное добавилось когда там поднял еще несколько проэктов и svn. Да, поддержую, слайсхост достоин рекомендации.
0
alex_blank #
>> Это помогает при наличии утечек памяти: при перезагрузке память процесса приходит в изначальное состояние.

крутой GC, что сказать
0
daevaorn #
Увы, но иногда просто нет возможности отказаться от какой-то текущей сторонней библиотеки и такой вариант лечения вполне к месту.
0
odessky #
У Вашего VPS неудачная система виртуализации, которая не умеет лимитировать дисковую нагрузку
В OVZ например можно выставить медленный IO, и никаких проблем с свопом небудет.

Хотя 256Mb не много, комфорт идет от 380.
0
marazm #
Это значит искуственно затормозить сервер. Всёже БД хранится на HDD.
0
mocksoul #
Дабы не запутывать народ в размышлениях между mod_python и mod_wsgi достаточно напомнить что они созданы одним человеком и после полного прекращения работы наd mod_python он занялся mod_wsgi.

пытаться изо всех сил исключить swap из работы равно непониманию зачем он нужен операционной системе кроме очевидного «когда не влазит». Немаловажным фактором кроме всего прочего является и обеспечение процессам «бесконечной» памяти, когда они просят что то громоздкое.

gentoo + mod_wsgi + python + custom kernel + apache-static = у меня вертится mocksoul.ru на ноуте с 64мб памяти. А так как там лежит музыка — эта связка делает почти 1тб трафика в месяц на 40мбитах и без ощутимых тормозов.

на freebsd можно и в 32мб уложится. Есетственно при этом речь не идёт о сколько бы то ни было мощных приложениях.
0
mocksoul #
очень показательно посмотреть на историю коммитов в mod_python и mod_wsgi от Грэхэма)) www.ohloh.net/accounts/5497
0
ingspree #
Эта фамилия читается как Грэм. :-)
0
rukeba #
использую сам и советую всем: django + nginx. очень экономно к ресурсам.
0
wiz #
А между ними что? вот этот "+", можно про него поподробнее?
0
rukeba #
fastcgi
0
ingspree #
flup?
0
kpblca #
а что регулирует опция WSGIPythonOptimize?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.