http://iakov.davydov.name/blog/tag/django/Iakov Davydov blog blog posts with tag intersection django2008-12-28T01:00:20ZIakovdjango-atompubhttp://iakov.davydov.name/blog/2008/12/28/stress-test/Стресс-тест2008-12-28T01:00:20Z2008-12-28T00:19:32Z<p>Напомню, что недавно я столкнулся с тем, что в какой-то момент сервер затыкался и переставал отдавать данные наружу. Перезагрузка <a href="http://httpd.apache.org/">Apache</a>, как правило,&nbsp;помогала. </p> <p>Мои наблюдения показали, что дело было в расходе оперативной памяти. <a href="http://iakov.davydov.name/blog/2008/12/27/lighttpd/">Постфактум</a> я попытался удостовериться, что правильно диагностировал&nbsp;проблему. </p> <p>Сначала решил попробовать <a href="http://www.hpl.hp.com/research/linux/httperf/">httperf</a> от <a href="http://hp.com"><span class="caps">HP</span></a>, но нагрузка, которую он создаёт, слишком далека от реальной (вероятно, можно что-то сделать, чтобы приблизить условия к боевым, но сходу ничего не&nbsp;придумалось). </p> <p>Решил сделать свой небольшой&nbsp;стресс-тест: </p> <pre><code>#!/bin/sh COUNT=5 for site in $@; do for num in `seq $COUNT`; do out=`mktemp -d -p .` wget --append-output=log --no-verbose --mirror -P $out $site <span class="amp">&amp;</span> done done </code></pre><p>Этот скрипт на каждый <span class="caps">URL</span>, переданный ему в качестве параметра, создаёт <code>COUNT</code> <a href="http://www.gnu.org/software/wget/">Wget&#8217;ов</a>, рекурсивно выкачивающих сайт. Никакой статистики скрипт не отдаёт, но можно в живую понаблюдать за расходом памяти, например, при помощи <a href="http://htop.sourceforge.net/">htop</a>. </p> <p>На моём сервере крутится <a href="http://www.xkcd.ru">архив переводов</a> (два экземпляра), этот блог и несколько редко используемых legacy <a href="http://php.net"><span class="caps">PHP</span></a> скриптов. На всё это отводится 294&nbsp;Mb. </p> <p>Для тестирования я передавал скрипту 3 <span class="caps">URL</span>&#8217;а: архив, блог и один из <span class="caps">PHP</span> скриптов. Итого 15 Wget&#8217;ов. Помимо этого я периодически при помощи <a href="http://mozilla.org">Firefox&#8217;а</a> проверял, откликается ли&nbsp;сервер. </p> <p>Итак, что же показал тест? При работе Apache через 5 минут свободная память заканчивалась, и начинал расти своп. На запросы сервер отвечал, но иногда с огромной задержкой. В том случае, если в качестве сервера выступал <a href="http://lighttpd.net">lighty</a>, максимум, которого мне удалось достичь &mdash; это 142&nbsp;Mb. </p> <p>В общем, ничего удивительного. Насколько я понимаю, высокое потребление памяти<br /> <a href="http://www.modpython.org/">mod_python</a> &mdash; это общеизвестный факт. И, наверняка, есть масса способов уменьшить потребление памяти в Apache. С другой стороны, мне нужно лишь небольшое подмножество функций Apache, так что переход на lighttpd &mdash; это неплохо: там и конфигурация чуть более очевидная, и ресурсов ему нужно меньше, и со статикой он работает&nbsp;лучше. </p>http://iakov.davydov.name/blog/2008/12/27/lighttpd/lighttpd2008-12-27T18:40:22Z2008-12-27T18:28:28Z<p>За некоторое время <a href="http://mysql.com">MySQL</a> и <a href="http://httpd.apache.org/">Apache 2</a> съедали всю доступную память. Решил вопрос радикально: установил <a href="http://www.lighttpd.net/">lighttpd</a> с <a href="http://www.fastcgi.com/drupal/">FastCGI</a>. </p> <p>Потребление памяти радикально уменьшилось. Посмотрим, что будет под нагрузкой. В <a href="http://hostingfu.com/article/nginx-vs-lighttpd-for-a-small-vps">статье</a> пишут, что lighty&nbsp;течёт. </p> <p>Документация по настройке <a href="http://djangoproject.com">django</a>+lighttpd есть, но она не подробная и не&nbsp;актуальная. </p> <p>mod_rewrite у lighttpd не так крут, но мне его&nbsp;хватило. </p>http://iakov.davydov.name/blog/2008/10/14/archive-update/Обновление архива2008-10-14T13:12:10Z2008-10-14T12:04:20Z<p>Очередное небольшое обновление&nbsp;архива. </p> <p>Список&nbsp;изменений: </p> <ul> <li> <a href="http://odnaknopka.ru/">Кнопка</a> добавления в&nbsp;закладки. </li> <li> Теперь кликнув на непереведённый комикс можно попасть на страничку с ним. Только для&nbsp;залогиненных. </li> </ul> <p>И самое главное, <a href="http://dir01.org">Андрей</a> любезно согласился выделить нам домен <a href="http://xkcd.ru">xkcd.ru</a>. </p> <p><strong>Спасибо</strong>,&nbsp;Андрей! </p>http://iakov.davydov.name/blog/2008/10/07/archive-update/Обновление архива2008-10-07T19:56:55Z2008-10-07T19:26:29Z<p>Сегодня был свободный час, так что я обновил <a href="http://xkcd.myths.ru">архив переводов xkcd</a>. </p> <p>Список&nbsp;изменений: </p> <ul> <li> По умолчанию теперь показывается последний переведённый&nbsp;комикс. </li> <li> Как побочный эффект, теперь записи в <span class="caps">RSS</span> сортирются по дате публикации. Вероятно, пользователи некоторых <span class="caps">RSS</span>-читалок это&nbsp;заметят. </li> <li> Кстати, <span class="caps">RSS</span> фид теперь указывает на <a href="http://xkcd.myths.ru">правильный адрес архива</a>. </li> <li> Убрана дурацкая <a href="http://ru.wikipedia.org/wiki/xkcd">ссылка на википедию</a> из меню&nbsp;навигации. </li> <li> Теперь старые ссылки на неопубликованные переводы (вида <code>http://xkcd.myths.ru/777/1223398281/</code>) продолжают работать после публикации&nbsp;перевода. </li> </ul> <p>Время простоя, как всегда, маленькое. На этот раз несколько секунд (с момента изменения таблицы до перезапуска&nbsp;Apache). </p>http://iakov.davydov.name/blog/2008/09/14/7-minutes/7 минут2008-09-14T15:53:41Z2008-09-14T15:08:50Z<p>Во время переезда на новый хостинг сервер не работал около семи минут. На сервере находятся две версии <a href="http://xkcd.myths.ru">архива</a>: обычная и отладочная. Естественно, они используют разные базы данных. Поэтому можно довольно свободно экспериментировать с отладочной версией, не боясь поломать основную. Когда отладочная версия работает хорошо, можно сделать <code>hg pull path_to_dev &amp;&amp; hg update</code>, и обычная версия обновится до&nbsp;отладочной. </p> <p>Процедура переезда была&nbsp;такова: </p> <ol> <li> Копирование исходников обеих версий на новый&nbsp;сервер. </li> <li> Изменение исходников отладочной версии до рабочего состояния (в основном исправление путей к файлам и путей на&nbsp;сервере). </li> <li> Отключение возможности записи в базу данных на старом сервере. Да, это довольно грубый хак, но в рассылке все были предупреждены. В <a href="http://www.mysql.com/">MySQL</a> это делается приблизительно так: <code>mysql&gt; REVOKE INSERT,DELETE,UPDATE on db.* from 'usr'@'localhost'; flush privileges;</code> </li> <li> Создание на новом домене (<span class="caps">DNS</span> запись которого была предусмотрительно переведена на новый сервер) новой рабочей копии архива. Для этого на старом сервере делаем: <code>python manage.py dumpdata &gt; backup.json</code>. Затем на новом <code>python manage.py syncdb</code>, <code>python manage.py</code> (вывод передаём в ваш любимый клиент) и <code>python manage.py loaddata backup.json</code>. </li> <li> Создание редиректа при помощи <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">mod_rewrite</a> со старого сервера на новый (несколько простых правил). Собственно, на этом пункте и возник простой. Он длился точно не более 7 минут, а скорее всего меньше. Если бы я не поленился и отладил правила для mod_rewrite на другом сервере, то задержка составляла бы несколько&nbsp;секунд. </li> <li> Поднятие виртуального хоста для старого домена на новом&nbsp;сервере. </li> <li> Изменение <span class="caps">DNS</span> старого домена на новый&nbsp;сервер. </li> </ol> <p>Вся процедура заняла около двух часов спокойной работы (включая не быстрое перекачивание всех картинок со старого сервера на&nbsp;новый). </p>