LINUX.ORG.RU

python-falcon 37k req/s

 , ,


1

5

Написал тривиальную заглушку:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import falcon

class Api:
        def on_get(self, req, resp):
                resp.body = ""

app = falcon.API()
app.add_route("/",Api())
Запустил в 25 нитей:
gunicorn -w 25 -b 127.0.0.1:8000 test:app

Проверил с помощью apache2-utils:

ab -n20000 -c20 http://127.0.0.1:8000/

Выдало 3000 req/s, 6,7 ms/req.

Если сделать подобное на Flask:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from flask import Flask

app = Flask(__name__)

@app.route('/', methods=["GET"])
def index():
  return ""

from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)

if __name__ == "__main__":
  app.run(host = "127.0.0.1", port = 5500)
То запуск
gunicorn -w 25 -b 127.0.0.1:5500 test:app
и
ab -n20000 -c20 http://127.0.0.1:5500/
даёт 2000 req/s и задержку 10 ms/req.

Откуда официальный бенчмарк с CPython даёт 37 тыс req/s? https://falconframework.org/
и рост производителности Flask -> Falcon в 10 раз. У меня получился рост числа запросов в полтора раза.

Ответ на: комментарий от makoven

Плюсую. А, вообще, тесты типа 'return «„' бессмысленны.

pawnhearts ★★★★★
()
Ответ на: комментарий от makoven

Меня удивляет приведённая ими цифра > 300 тыс req/s, и рост по сравнению в Flask в 10 раз. Это у них какая-то фича фреймворка, hardware-специфичная? Тестировали на мощном железе? С сайта они убрали спеки железа, на котором гонялся бенчмарк.

Mirage1_
() автор топика
Ответ на: комментарий от pawnhearts

Локально на статике Nginx может и 50 тысяч в секунду выдать на одном воркере.

i-rinat ★★★★★
()

кстати, в рамках теста, можете еще протестить демо-пример на Торнадо?

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()
bvn13 ★★★★★
()
Ответ на: комментарий от bvn13

Перезапустил ещё раз,

flask

gunicorn -w 25 -b 127.0.0.1:5500 test:app
ab -n2000 -c20 http://127.0.0.1:5000/
Requests per second:    1745.58 [#/sec] (mean)
Time per request:       11.458 [ms] (mean)
Time per request:       0.573 [ms] (mean, across all concurrent requests)
Transfer rate:          271.04 [Kbytes/sec] received

falcon

gunicorn -w 25 -b 127.0.0.1:8000 test:app
ab -n2000 -c20 http://127.0.0.1:8000/ 
Requests per second:    2500.55 [#/sec] (mean)
Time per request:       7.998 [ms] (mean)
Time per request:       0.400 [ms] (mean, across all concurrent requests)
Transfer rate:          405.36 [Kbytes/sec] received

tornado

./test.py
ab -n2000 -c20 http://127.0.0.1:8888/
Requests per second:    1193.95 [#/sec] (mean)
Time per request:       16.751 [ms] (mean)
Time per request:       0.838 [ms] (mean, across all concurrent requests)
Transfer rate:          241.36 [Kbytes/sec] received

Mirage1_
() автор топика
Ответ на: комментарий от Mirage1_

поправочка,

gunicorn -w 25 -b 127.0.0.1:5500 5000 test:app

Mirage1_
() автор топика
Ответ на: комментарий от bvn13

В реальности же, при пинге бенчмарка на удалённой VDS в Москве по 4G, получается порядка 70-240 req/s. Локально на VDS для falcon, 1400-1700 req/s (но такой вариант не интересен). По выделенке пока не проверял, но вроде там было порядка 290 req/s до Москвы. Уральский регион.

Mirage1_
() автор топика
Ответ на: комментарий от makoven

Что интересно, pypy серьёзного прироста вообще не дал.

gunicorn -w 25 -b 0.0.0.0:8000 test:app
#!/usr/bin/pypy
# -*- coding: utf-8 -*-

import falcon

class Api:
        def on_get(self, req, resp):
                resp.body = ""

app = falcon.API()
app.add_route("/",Api())

from wsgiref import simple_server
if __name__ == '__main__':
        httpd = simple_server.make_server('0.0.0.0', 8000, app)
        httpd.serve_forever()

Два запуска

ab -n2000 -c20 http://127.0.0.1:8000/ 

Requests per second:    2862.50 [#/sec] (mean)
Time per request:       6.987 [ms] (mean)
Time per request:       0.349 [ms] (mean, across all concurrent requests)
Transfer rate:          464.04 [Kbytes/sec] received
и
Requests per second:    2428.08 [#/sec] (mean)
Time per request:       8.237 [ms] (mean)
Time per request:       0.412 [ms] (mean, across all concurrent requests)
Transfer rate:          393.61 [Kbytes/sec] received
Как разработчики falcon получили 37-345к req/s, не понятно.

Mirage1_
() автор топика
Ответ на: комментарий от Mirage1_

И правда странно. Отправь разработчикам фалькона все свои выкладки, спроси почему у них больше выходит

makoven ★★★★★
()
Ответ на: комментарий от makoven

Я ещё раз проверю, может pypy неправильно юзаю.

Mirage1_
() автор топика

1. фалкон для буста использует Си расширения. они у тебя скомпилились при установке?
2. фласк поумолчанию использует werkzeug который быстрым назвать сложно. мой написанный на коленке сервер с темже фласком работает на 20% быстрее плюс под нагрузкой в 5к не проседает до сумасшедших задержек.
3. исключи из теста единорога, чтобы не оказалось что он криво сконфигурирован.
4. а сколько на твоей системе выдает нгинкс или lighttp?
5. какие спеки системы то? вдруг ты там на малинке вообще тестиш

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

genryRar ★★
()

pip3 install gunicorn flask falcon meinheld
gunicorn -w 3 -b 127.0.0.1:8000 --worker-class=meinheld.gmeinheld.MeinheldWorker test:app
wrk -d20s -t10 -c200 http://127.0.0.1:8000


Falcon:
Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
Requests/sec: 24241.74
Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz
Requests/sec: 60649.34

Flask:
Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz
Requests/sec: 17903.59

Всё понятно?

iSlava
()
Последнее исправление: iSlava (всего исправлений: 1)
Ответ на: комментарий от iSlava

Всё понятно?

Да, спасибо.

Falcon:
Intel(R) Pentium(R) CPU N3540 @ 2.16GHz
9638.82 req/s

Flask:
Intel(R) Pentium(R) CPU N3540 @ 2.16GHz
3834.14 req/s

Mirage1_
() автор топика
Ответ на: комментарий от iSlava

На VDS у меня производительность за счёт meinheld и уменьшения до 3 потоков выросла с 1700 req/s до 2800-3200 req/s. Это по локалке между нодами

Там одно ядро
Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz

Если локально на Xeon'е всё это крутить на 127.0.0.1, то 5200-6200 req/s. Но у меня ab, а не wrk.
Утилита wrk на 127.0.0.1 даёт 9400 req/s.

У тебя, наверное, два ядра Xeon'а?

Mirage1_
() автор топика
Ответ на: комментарий от Mirage1_

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

iSlava
()

ab

Оно же непригодно для бенчмарков. Есть wrk.

x3al ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.