Обновить
23
0

Системный программист и реверсер

Отправить сообщение

Вот тут представлено сравнение "скорости" чистого Flask (на самом деле через werkzeug) и фласков с бустом в виде сторонних WSGI-серверов:
https://github.com/jamesroberts/fastwsgi/blob/main/performance_benchmarks/PERFORMANCE.md#requests-per-second-1
Я сейчас провёл тест на свежем Flask 3.1.3 и вот что вышло.
1) Flask + werkzeug

> ./wrk -t8 -c100 -d10s http://127.0.0.1:5000/hw
Running 10s test @ http://127.0.0.1:5000/hw
  8 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    28.94ms    0.85ms  32.04ms   96.47%
    Req/Sec   415.43     50.91   484.00     35.75%
  33108 requests in 10.01s, 5.84MB read
Requests/sec:   3308.02
Transfer/sec:    597.64KB

2) Flask + FastWSGI

> ./wrk -t8 -c100 -d10s http://127.0.0.1:5000/hw
Running 10s test @ http://127.0.0.1:5000/hw
  8 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     9.94ms  575.16us  19.17ms   97.64%
    Req/Sec     1.21k    40.10     1.33k    80.38%
  96582 requests in 10.01s, 16.21MB read
Requests/sec:   9652.05
Transfer/sec:      1.62MB

3) Чистый FastWSGI (FastPySGI):

> ./wrk -t8 -c100 -d10s http://127.0.0.1:5000/hw
Running 10s test @ http://127.0.0.1:5000/hw
  8 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   736.81us   71.25us   6.70ms   92.91%
    Req/Sec    16.34k   788.94    19.81k    81.41%
  1312189 requests in 10.10s, 202.73MB read
Requests/sec: 129925.07
Transfer/sec:     20.07MB

Во всех тестах используется 1 воркер (python 3.9)


как итог вышло так:36к запросов на 2 потока (воркера), 0 ошибок, 0.6 сек задержка в среднем, 100 одновременных в сек.

у меня по итогу тестов получилось разогнать Python Flask на одном ядре до 50к+ запросов в секунду при RPS 98... это очень много

А почему без Flask всего 36к, а с оным - 50к+ ?
50к+ через Flask на 1 воркере ну никак не получить (pypy не считается). Либо как-то неправильно проводился тест.

Последнее время есть ещё интересные движения в сторону rsgi-серверов на Rust

Вот результаты тестов wrk на реальном железе:
https://www.techempower.com/benchmarks/#section=test&runid=1d5bfc8a-5c4a-4fb2-a792-ad967f1eb138&test=json&l=zik0zj-pa6


RSGI даёт выигрыш только в самом granian.
Но если использовать очень быстрый ASGI сервер FastPySGI (это форк FastWSGI), то никакого преимущества от RSGI мы не получим.
Вот я как раз на днях зарелизнул в PyPI свежий FastPySGI.

Мне в руки даже железка попадала на 99% такая же, которая все эти бенчи выполняет (только сетевушка была не на 40, а на 25). И даже там я не стал разворачивать полноценный репо FrameworkBenchmarks. Просто отдельно потестил на нём несколько движков.

Вот гляньте на показатели fastwsgi - он в топе в каждом типе бенча. А я просто при формировании PR указал такие же параметры, как и у других движков.

впрочем, насколько можно верить бенчмарку девятилетней давности, не знаю

Я больше доверяю вот этой табличке:

Ссылка на первоисточник: https://www.techempower.com/benchmarks/#section=test&runid=3ab00ae1-17aa-44e6-ae83-137d797d0817&test=json&l=zik0zj-cn2&w=oedrsv-v2qiv3-zik0zj-zik0tr&a=2

Ну зачем же. Я у себя локально этот бенч и не разворачивал. Просто добавил PR для fastwsgi и blacksheep - эти движки теперь в репо.

Сначала нужно подождать добавления PR (обычно не более 7 дней). Затем дождаться окончания текущей задачи бенча и след. задачи, в которую уже обязан попасть ваш PR/commit.

Отслеживать можно тут: https://tfb-status.techempower.com/

Надо сравнивать два хорошо настроенных в одинаковых условиях эксплуатации.

Условия одинаковые. Настраивают сами авторы движков (в редких случаях умельцы).

Основные выводы:

  1. ASGI-серверы значительно превосходят WSGI по производительности

Вывод неверный.
ASGI-серверы быстрее при асинхронном выполнении запроса (БД и т.п.).
В полностью синхронных запросах WSGI протокол быстрее, т.к. проектировали ASGI протокол "странные" люди.
Вот пруфы:

Запросы, которые просто формируют из статики JSON-текст
Запросы, которые просто формируют из статики JSON-текст
Запросы с обращением к БД
Запросы с обращением к БД

Можно заметить, что на второй картинке вообще нету WSGI-движков, т.к. wsgi просто бесполезен при запросах к БД.

Granian показывает лучшие результаты как по скорости, так и по потреблению памяти

Для этого вывода нужна выборка по более. А у вас она маленькая.

Лучшие результаты смотрите тут: https://www.techempower.com/benchmarks/#section=test&runid=3ab00ae1-17aa-44e6-ae83-137d797d0817&l=zik0zj-cn2

  • Granian:

    • ASGI: ~0.7-1.2 мс (средняя задержка).

    • WSGI: ~1.5-2.5 мс (средняя задержка).

Вывод по задержкам: Даже в WSGI-режиме Granian превосходит традиционные серверы по этой метрике.

У вас какие-то странные результаты тестирования. Почти всегда у ASGI-серверов задержка больше, чем у WSGI.

И это подтверждается вот этой картинкой:

Средняя задержка при синхронных запросах
Средняя задержка при синхронных запросах

Явно видно, что все ASGI проигрывают WSGI.

Примечание: именно ради низких задержек я юзаю fastwsgi (и почти весь его переписал)

Разбирался. Всё так и есть. Даже было время, когда на работе 99% такую же железку взял и установил там некоторые бенчи и лично проверил:

https://github.com/TechEmpower/FrameworkBenchmarks/issues/7402#issuecomment-1482918369

Получил довольно близкие цифры.

Раньше у них стояли 10Gbit сетевухи, а теперь уже 40Gbit. Мне на работе удалось проверить только 10Gbit и 25Gbit.

Вот точный конфиг: https://github.com/TechEmpower/FrameworkBenchmarks/issues/8736#issuecomment-1973835104

Например, в спецификации описано, как работает конвейеризация HTTP, но, если вы попробуете задействовать эту фичу «на местности», то сами напрашиваетесь на проблемы и… всё окончится грустно.

Верно подмечено. Я изучал имплементацию pipelining'а на примере некоторых топовых фреймворков из списка TechEmpower FrameworkBenchmarks. Разрабы делают реализацию просто в лоб и тупо. К примеру, если скорость приёма сервера больше, чем его отдача, то просто пожирается память на выделение всё новых буферов в памяти.

Вот тут я немного возмущался: https://github.com/TechEmpower/FrameworkBenchmarks/discussions/8048

Я же в проекте fastwsgi сделал эту часть HTTP-сервера по умному. Т.е. сервер умеет притормаживать чтение входящих запросов, в зависимости от состояния части, отвечающей за отправку данных.

---------------

Ну и ссылочка на топик, где я сетую на то, что в Python-лидерах находится "поделка", которая просто базовые требования TCP-сервера не соблюдает, не то что HTTP:

https://github.com/TechEmpower/FrameworkBenchmarks/issues/9055

Вот такие чудеса на виражах.

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

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

Мде. Походу челы ваще не понимают как нативный код работает, коли ждут от Сишечки проверок.

Я вот тоже недавно решил сделать open source утилиту для вывода инфы о железе и его параметрах. Решил делать именно на питоне, т.к. порог вхождения контрибьютеров будет поменьше. Да и не нужен нативный код для таких задач.

Для работы с оборудованием использую не устаревший winring0, а cpuidsdk(cpuz.sys), на который антивири не ругаются.

Пока основное направление - тайминги DDR5.

Поиск сорцов по названию: pyhwinfo

Недостаток типов float4 и float8 данных в том, что добавление к большому числу маленького числа эквивалентно добавлению нуля

Что за ересь то? У вас в примере изначально указано число, которое не может хранится во float8 без потери точности. Сложение тут вообще не причём.

Эта статья уровня школьных рефератов. Да ещё 4 плюсика уже есть... за что?

PyByteArray_Resize(PyObject *self, Py_ssize_t requested_size)

Знакомый код.

Вот и вспомнилось сразу, как пришлось костыль делать в проекте FastWSGI. На самом деле при написании кода под WSGI интерфейс возникло очень много вопросов к авторам сия придумки. Довольно затратны процессы сериализации/десериализации.
Сразу вспоминается HTTP-протокол: HTTP 1.x придумали псевдо-программисты, а HTTP 2.x (и далее) - настоящие программисты.

Так вот, одной из проблем WSGI является использование BytesIO. И добавить в поток байтиков можно только Py-объект (для этого используется функция _io_BytesIO_write).

А функцию для добавления сразу "сырого" куска из памяти (char * bytes) в CPython не завезли.

И вот пришлось самому конструировать этот механизм вот таким образом: https://github.com/jamesroberts/fastwsgi/blob/5572bb31b859d690be225707b9e7e25af397544b/fastwsgi/pyhacks.c#L148-L154

Хотя много где в CPython есть методы, которые позволяют передавать им "сырые" куски памяти через char *, но вот в bytesio.c такие забыли завести.

Вот с чем может быть связана такая забывчивость?

И можно ли было обойтись без костылей, реализованных в pyhacks.c ?

PS.: нагуглил тут похожую проблему и на чистом питоне https://stackoverflow.com/questions/78399639/how-to-use-io-bytesio-in-python-to-write-to-an-existing-buffer

Среди китайцев есть ptpt52, который довольно активно коммитит в офиц. репозиторий OpenWrt.
И у него есть и свой форк OpenWrt: https://downloads.x-wrt.com/rom/
Сборки X-WRT отличаются от офиц. сборок.

У меня как то язык не повернётся назвать это "сборкой китайского васяна".

Asus RT-AX53U и теперь он оказывается этих денег не стоит.

Так и в статье 2023 года @itdog писал такое:

про AX6S (mt7622B):

На данный момент - это лучший вариант... диапазон цен 4500-5500р

про RT-AX53U (mt7621A):

Находится в том же диапазоне цен, но железо чуть слабее. У Redmi выше тактовая частота, а значит, он в теории будет лучше справляться с шифрованием данных. Для роутера в наших реалиях - это в первую очередь туннели OpenVPN, Wireguard итд.
По бенчмаркам MT7622B лучше почти в два раза

Видимо вы неверный вывод сделали из статьи 2023 года.

Появление в 2023 году устройств с mt7622 и mt7981b изменило расклад. Старый чип mt7621 явно стал не актуален.
Да и в 2024 году почти каждому стал нужен шифрованный туннель в роутере.

Среди Кинетиков только сейчас появились модели на mt7981b (в 2023 году там правил балом mt7621 и его клоны).

Наверное стоило упомянуть, что у ASUS TUF-AX6000 есть полная копия в виде ASUS TX-AX6000 (просто другой корпус, продаётся только на китайском рынке).На озоне его продавали зимой за 13500руб.

ASUS TX-AX6000 занял в одном из китайских тестов первое место по соотношению цена/производительность:

TOP1: ASUS TX-AX6000
TOP1: ASUS TX-AX6000

Источник: https://youtu.be/Z72ooqxaYb8?t=506

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность