Найти - Пользователи
Полная версия: Низкий RPS в twisted.web+web.py (WSGI)
Начало » Web » Низкий RPS в twisted.web+web.py (WSGI)
1 2
john123
Всем здравствовать!

Недавно начал разбираться в twisted.web с целью использования его как веб-сервера.
В качестве фреймворка взял web.py. Чтобы состыковать web.py и twisted, использую WSGI.

Решив погонять тесты с помощью ab и httperf, увидел удручающие результаты: 30-40 rps, в то время как apache, запущенный с гигантским приложением на CodeIgniter, выдает 180-200 в httperf и около 7000 в ab.

Приложение на twisted такое:
#!/usr/bin/python
# encoding: utf-8
from twisted.web.wsgi import WSGIResource
from twisted.internet import reactor
import web
urls = ('/', 'Index')
class Index:
    def GET(self):
        return 'Hello, world!'
application = web.application(urls, globals()).wsgifunc()
resource = WSGIResource(reactor, reactor.getThreadPool(), application)

Запускаю так:
twistd web --wsgi tw.application --logfile=/dev/null
tw.py - имя файла.

Т.е., как видно, пока что это обыкновенный хэловорлд. Но даже на таком коде, количество RPS рекордно мало.

Запускаю тест:
ab -c 100 -n 5000 127.0.0.1:8080/
Requests per second: 37.31 (mean)

В httperf, в общем-то, такая же картина.
Вопрос - что я делаю не так? Может быть стоит использовать какой-то нестандартный реактор для WSGI? Или может быть надо настроить какие-то параметры типа Thread_pool и т.д.?
o7412369815963
Зачем вам твистед? Запустите через uwsgi, будет больше rps.
Да и вместо web.py можно что-нибудь более “мейнстимовое”.
bw
Ну давайте я буду писать веб-приложение на Python, а вы на Apache, думаю ваши приоритеты очень быстро изменятся и RPS в 7000 не сильно вам поможет.
Запустите 8 копий и на 8-ми ядерном CPU получите 280 RPS. В любом случае, когда начнёте делать что-либо сложнее “Hello world” ваш RPS упадёт (в зависимости от квалификации) до 1 или до 0.1 и никакой framework тут не поможет. Так что на мой взгляд такое тестирование ни о чём.

p.s. У меня ваш код показал 97.69. Linux? Twisted из местной репы ставился? Руками? Сишные зависимости собрались?

..bw
bismigalis
по-моему twisted и tornado не про rps, а про количество соединений, хотя регулярно встречаются типы хотящие ускорить джангу торнадкой.
john123
bw
Ну давайте я буду писать веб-приложение на Python, а вы на Apache, думаю ваши приоритеты очень быстро изменятся и RPS в 7000 не сильно вам поможет.
Вы случайно на руби(раби-раби) не пишете? А то злой Вы какой-то))

Запускаю на Linux (Ubuntu 12.04), twisted из стандартных репозиториев.
Вообще смысл того, что я взял твистед в том, что хочу в качестве “домашнего задания” сделать comet-чат с веб-интерфейсом и хочу чтобы это всё очень легко развертывалось, т.е. не надо было устанавливать веб-сервер отдельно и кучу других компонентов.

o7412369815963
Да и вместо web.py можно что-нибудь более “мейнстимовое”.
Мейнстримовое в моем случае не требуется, по причине простоты планируемого веб-интерфейса. Тут не будет кучи бизнес-логики, не будет продвинутых ORM и т.д.

bismigalis
по-моему twisted и tornado не про rps, а про количество соединений, хотя регулярно встречаются типы хотящие ускорить джангу торнадкой.
У меня нет необходимости что-то ускорять. Просто интересно посмотреть на что способен твистед в качестве веб-сервера и можно ли его использовать в таком виде на продакшне. В общем-то я немного расстроен низким RPS и решил обратиться за помощью к более опытным коллегам, чтобы разобраться с этим вопросом, т.к. только начал разбираться с фреймворком, а в документации ничего подобного не нашел.
bw
Я извиняюсь что сразу не посмотрел код внимательно, голодный был :-).
Сейчас вот поел и думаю, какого рожна там Webpy делает, зачем тогда Twisted?
Сделал более каноничный пример (из официальной, кстати, документации):
# tw2.py
# twistd -nol /dev/null web --class=tw2.HelloResource
import twisted.web.resource as _twr
class HelloResource(_twr.Resource):
    isLeaf = True
    def render_GET(self, request):
        return 'Hello, world!'

“ab” показал 2136.56.

p.s. На Ruby не пишу :-).

..bw
john123
bw
Я извиняюсь что сразу не посмотрел код внимательно, голодный был :-).Сейчас вот поел и думаю, какого рожна там Webpy делает, зачем тогда Twisted?Сделал более каноничный пример (из официальной, кстати, документации):

Приведенный Вами код показал результат 2956.92 rps, но стоит отметить, что это не WSGI. Я пробежал по документации twisted по части web, попробовал пару примеров и понял что писать на twisted.web веб-интерфейс будет не так удобно, нежели чем на специализированном фреймворке. Собственно, по этому попытался использовать web.py.
Twisted Web is a web server, and a framework for doing things with the web - although it shares some components in common with frameworks like Django, it's not a “web framework” in the same sense.

Тогда задам еще вопрос: использовать какой-либо веб-фреймворк + twisted WSGI это плохо? Почему?

P.S. Вопрос без подвоха, просто хочу разобраться что такое хорошо, а что такое плохо , чтобы понять какие у twisted могу быть области применения по части web и какое решение лучше подойдет для меня.
s0rg
1. Твистед очень быстро равивается, ставить его лучше через pip.
2. Твистед не для wsgi, он просто его умеет .
3. Если нужен именно высокий rps смотрите на nginx + uwsgi соединенные чере unix-сокеты.
4. Как правильно заметил bismigalis, твистед скорее для количества соединений, чем для rps
john123
Благодарю за ответ! Кое-что для меня прояснилось

Также я выяснил (из оффициальной документации, в которой не заметил этой строки), что:
Note that WSGIResource is a multithreaded WSGI container. Like any other WSGI container, you can't do anything asynchronous in your WSGI applications, even though this is a Twisted WSGI container.
Выходит в случае с WSGI, Twisted работает в многопоточном режиме и, как я понимаю, причина низкого значения RPS именно в CPython GIL.

В общем-то пока забил на веб-фреймворки, попробую поколдовать с twisted.web, т.к. всё-таки необходимый мне функционал там есть, хоть и не очень всё удобно.
Singularity
john123
а чего торнадо никто не советует ? https://github.com/facebook/tornado/tree/master/demos/chat
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB