На чём запускать Джанго?

Как я и писал в комментариях к предыдущему посту на эту тему, я решил, что тестирование производительности с помощью byteflow — не самая удачная идея, потому как довольно тяжёлая логика мешает веб-серверам показать себя. Потому взял простое приложение на джанго, которое всего и делает, что отдаёт строку “hello world” текстом.

Собственно приложение со скриптами для различных вариантов запуска и подробными результатами можно взять здесь, а вкратце можно сказать, что серверы, которые написаны с использованием C, заметно опережают чисто питоновские (даже те, которые опосредованно юзают сишные библиотеки, типа cogen’а, который использует python-epoll).

Итого в результате у нас есть всего два реальных претендента на то, чтобы их использовать — fapws2 и Apache/mod_wsgi. Первый кушает меньше памяти, но второй как-то привычнее пока. Возможно, я на первый переползу, и тогда поделюсь ощущениями. А пока можно сказать, что flup можно отправлять на свалку истории. И если вы не хотите юзать Apache, то использовать FastCGI — обрекать себя на тормозной путь. ;) Правильнее будет использовать fapws2.

Pingbacks: 1

nginx vs CherryPy
А еще есть Fapws, который тоже довольно быстрый.http://piranha.org.ua/blog/2008/08/28/running-django/http://piranha.org.ua/blog/2008/07/31/wsgi-servers-short/
softwaremaniacs.org, 17:56 (after 244 days)

Comments: 31 (already: 6) Comment post

И если вы не хотите юзать Apache…

а mod_proxy всякие на что?) я сейчас на cherry запускаю + lighttpd, вроде стабильно, но завалить сайт не сложно :) c когеном словил 1 раз баг, но чего-то он больше не повторялся=, так что покачто воздержался от его использования до выяснения обстоятельств=)

slav0nic , 16:02

Ты невнимательно читаешь, похоже. :-)

Alexander Solovyov , 17:14

А как насчет mod_python с апачем?

DM , 21:30

Я его сравнивал раньше, с mod_wsgi, а в этот раз как-то прямо лень стало. Он медленнее и ещё больше памяти ест.

Alexander Solovyov , 06:40 (after 1 day)

главный разработчик mod_python ушёл делать mod_wsgi. Уже более года назад.

Vadim Fint , 15:03 (after 1 day)

А что там с nginx + mod_wsgi ?

kmmbvnr , 11:36 (after 1 day)

Он же блокируется, т.е. для работы с БД вообще не катит. А выделять процесс питона во внешний демон, как апачевский, он так и не научился.

Alexander Solovyov , 11:46 (after 1 day)

а статика? mod_wsgi явно даже ИДЕЙНО лучше.

кстати. ab2 крайне плохо тестирует сайты с шустрыми ответами. Т.е. те, где сама обработка одного запроса у ab2 занимает 20-30% времени всего ответа.

Мелкий бенчмаркер на си уморительно просто написать своими руками. Когда-то разница в результатах для мелких запросов с ab2 повергла меня в ужас. Правда тестил я тогда не питон, а сишный сервер.

Это я все к тому, что автор fapws2 просто несерьёзен.

Vadim Fint , 15:06 (after 1 day)

а статика? mod_wsgi явно даже ИДЕЙНО лучше.

Статика — nginx. Но у меня в любом случае так.

Это я все к тому, что автор fapws2 просто несерьёзен.

Каким образом разница с ab показывает, что автор fapws2 несерьёзен? :)

А то, что ab тупит — ну так это его проблемы, все в равных условиях. fapws2 скушает меньше рамы, чем mod_wsgi — тут же ab ни при чём? Все остальные заметно медленнее — тоже кагбе всё чисто? Не понимаю, чем ты пытаешься возразить. :)

Alexander Solovyov , 15:19 (after 1 day)

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

Vadim Fint , 15:25 (after 1 day)

Ну так тестировал я, а я не разработчик. :-)

Alexander Solovyov , 15:31 (after 1 day)

ну так а я и говорил про “автор fapws2”. :-P

Vadim Fint , 15:57 (after 1 day)

Возникло несколько вопросов:

  • А сколько ядер у машины на которой это всё бегает? Если больше одного, как насчет попробовать запустить для питоновских серверов процессов по количеству ядер а nginx заставить равномерно раскидывать по ним запросы?

  • Почему кстати не тестируется paste.httpserver?

  • Результат CherryPy отличный или я неправильно его интерпретирую?:

Percentage of the requests served within a certain time (ms) 50% 3 66% 3 75% 3 80% 3 90% 3 95% 4 98% 4 99% 5

Sergey Schetinin , 16:53 (after 1 day)

Еще, если возможно, здорово бы увидеть тест на чистом WSGI, без Джанги вообще.

Sergey Schetinin , 17:04 (after 1 day)

какой смысл тестировать без джанги если тестируется джанга? +) см. сабж. на самом деле взяли бы да протестировали, хорош коммандовать.

Vadim Fint , 17:42 (after 1 day)

Тестируется не джанга а серверы.

хорош коммандовать.

В зеркало посмотри.

Sergey Schetinin , 17:45 (after 1 day)

А какой смысл? :) Ну чуть быстрее будут запросики вылетать, а суть-то останется одна и та же. В принципе, не было смысла и с джангой бы тестировать, но просто мне лично интересна именно она, а без неё появляется ещё один конкурент — yield. С джангой у него какие-то несовместимости, а вот сам по себе он по идее должен как самолёт летать. А расстановка всех остальных останется такой же.

Alexander Solovyov , 17:59 (after 1 day)

Саш, если бы ты видел исходник mod_wsgi, ты бы так же сказал про него. А вот в yield как раз просто чудовищная мешанина в коде.

Vadim Fint , 18:03 (after 1 day)

Да, код там невесёлый совсем…

Alexander Solovyov , 18:23 (after 1 day)

Просто мне интересны абсолютные значения мин. времени на обработку запроса сервером. То что порядок не поменяется это понятно.

Sergey Schetinin , 18:10 (after 1 day)

fapws2 — 10,5 тыщ запросов в секунду. Это на таком приложении:

def simple_app(environ, start_response):
    status = '200 OK'
    response_headers = [('Content-type','text/plain')]
    start_response(status, response_headers)
    return ['hello world']
Alexander Solovyov , 18:25 (after 1 day)

А сколько ядер у машины на которой это всё бегает? Если больше одного, как насчет попробовать запустить для питоновских серверов процессов по количеству ядер а nginx заставить равномерно раскидывать по ним запросы?

Два ядра, ну оно так почти в два раза и ускоряется. :-)

Почему кстати не тестируется paste.httpserver?

Потому что код из него использован в cogen, который использует epoll и заведомо быстрее. Ну и плюс я про него просто забыл. :D

Результат CherryPy отличный или я неправильно его интерпретирую?:

Ты знаешь… Я как-то внимание сразу не обратил, а сейчас даже не знаю что сказать. Запустил ещё раз — на глаз видно, что запросы (ab показывает прогресс по 2 тысячи запросов) идут где-то в два раза медленнее, чем у fapws2. Не могу понять, почему такие странные результаты. Надо его чем-то другим погонять будет, может perftest’ом.

Alexander Solovyov , 17:57 (after 1 day)

Два ядра, ну оно так почти в два раза и ускоряется. :-)

Вот. А у mod_wsgi сколько демонов? Может их сразу два, а по факту он проигрывает?

Потому что код из него использован в cogen, который использует epoll и заведомо быстрее.

Ээээ… ну это не факт. Вон Twisted вроде в теории тоже такой быстрый что тушите свет. А тест показал что, по крайней мере при проверенных нагрузках, не так уж он и хорош. Заведомо быстрее, а по факту может оказаться что наоборот. В общем если найдется возможность, потесть пожалуйста.

Насчет результата CherryPy ты запускаешь очень много параллельных запросов и возможно у него там по умолчанию маленький backlog на сокете и он просто столько не успевает параллельно. Ну а это может например заставлять сработать какую-то еще логику в тестировщике и выходит что выглядит как протормоз.

Sergey Schetinin , 18:07 (after 1 day)

у mod_wsgi 0 демонов. А форков — сколько скажешь, столько и будет.

Vadim Fint , 18:24 (after 1 day)

В демон-режиме, имеется в виду. ;-)

Alexander Solovyov , 18:25 (after 1 day)

Я прогнал про ускорение в два раза. Оно ускорялось, когда была тяжёлая логика, а сейчас где-то на 10% изменение идёт. Не уверен, почему так. Кстати, все тесты проводились через nginx (порт 90, в результатах видно), кроме Apache (само собой), Spawning (который и так распределяет нагрузку, сам) и CherryPy (а вот это я завтыкал). Но с CP странная ситуация вообще — я вот сча запускаю, и последние запросы ОООЧЕНЬ тупят (порядка 12 секунд).

А результаты странные не то слово, потому что я ж говорю — на глаз видно, как 2 тысячи запросов проходят медленнее, чем у fapws2. Если б только десяток запросов тормозил, то всё бы пролетало быстро, а потом последние бы тупили (как те, по 12 секунд). Это-то меня и сбивает с толку.

А твистед да, нифига не быстрый. :)

Alexander Solovyov , 18:37 (after 1 day)

а вот так ./manage.py runfcgi socket=/tmp/fcgi.sock method=threaded daemonize=true pidfile=/var/run/django-fcgi.pid с nginx тестировать не пробовали?

Nikita Stupin , 16:36 (after 18 days)

Оно немножко быстрее и картинку общую не изменяет. Ну и плюс течь и помирать оно не перестаёт точно. ;)

Alexander Solovyov , 16:43 (after 18 days)

А что там собственно течет Django или питоновский сборщик мусора? Умирает с коркой или без?

Nikita Stupin , 12:42 (after 19 days)

flup течёт. Он же сдыхает, без корки, иногда просто подвисает. Дурной кусок софта.

Alexander Solovyov , 14:42 (after 19 days)

кстати есть недочёты у теста, в черри не выставлен размер тред пула, в спаун не выключен dev режим + watch

к сожеленью после долгих попыток использования асинхронных серверов для WSGI пришлось признать, что под большой нагрузкйо они не так уж и хороши, проблема заключается в том, что джанга не поддерживает работу с postgres в async = (да, базы могу обрабатывать ряд команд асинхронно, а то ща тролли набегут…=) ) получается что база начинает захлёбываться и апликуха нчиерта не выдаёт, в приложении так сказать, набегает очередь, при тредах просто 500 выдалоб и всё) а тут полная загрузка севрак и тп, + 1 апликейшн == 1 коннект/транзакция к БД, пока не придумал как режить, можно попробовать работать через пулл

slav0nic , 08:48 (after 28 days)

Comment form for «На чём запускать Джанго?»

Required. 30 chars of fewer.

Required.

Comment post