Асинхронные бенчмарки HTTP в PyPy3
(мой перевод, оригинал - https://morepypy.blogspot.ru/2017/03/async-http-benchmarks-on-pypy3.html) Асинхронные бенчмарки HTTP в PyPy3
Всем привет, мы упорно трудились с того момента, как Mozilla сделала пожертвование проекту PyPy, для того, чтобы предоставить вам работающую реализацию Python 3.5
Мы почти готовы выпустить альфа версию PyPy3.5. Наша цель - выпустить релиз почти сразу после спринта (прим. - тут говорится о Leysin Sprint, который проводится разработчиками PyPy почти каждый год). Множество модулей было портировано, и PyPy3.5 уже может запускать множество Python 3 программ. Мы будем рады получить любые отзывы после предстоящего релиза.
Чтобы показать, что сердце (asyncio) Python 3 уже может работать, мы приготовили несколько бенчмарков. Они были сделаны Paweł Piotr Przeradowski, twitter @squeaky_pl . Их цель - проверить производительность HTTP с несколькими асинхронными IO библиотеками, а именно относительно новыми asycnio и curio, и протестированными в бою tornado, gevent, и Twisted. Исходный код доступен на https://github.com/squeaky-pl/zenchmarks, и инструкции о воспроизведении результатов могут быть найдены в README.md. «Сырые» результаты могут быть взяты из https://github.com/squeaky-pl/zenchmarks/blob/master/results.csv
Цель представленных бенчмарков - показать, что предстоящий релиз PyPy3 уже может работать с кодом, который работает на CPython 3.5, без изменений. PyPy3 так же способен улучшить скорость этого кода.
Бенчмарки состоят из HTTP серверов, реализованных на основе упомянутых библиотек. Все сервера однопоточны, и зависят от лежащих в основе циклов событий (event loop'ов) для обеспечения параллелизма (concurrency). Логгирование доступа было выключено, чтобы исключить производительность терминального I/O из результатов. Код вьюшек (прим. - view code - не смог нормально перевести) состоит из поиска в словаре, который соотносит ASCII буквы к строкам из популярного Zen of Python. Если строка найдена - вьюшка её возвращает, а иначе отдаётся ответ 404 Not Found. Ошибки 400 Bad Request и 500 Internal Server Error так же обрабатываются.
Нагрузка была сгенерирована с помощью утилиты для бенчмаркинга HTTP - wrk. Она была запущена в одном потоке, открывающем до 100 одновременных подключений на 2 секунды, и повторяла нагрузку 1010 раз для последовательных результатов (прим. - большей частью для разогрева PyPy). Так же использовался Lua скрипт, который инструктирует wrk постоянно посылать 24 разных запроса, которые достигают разные пути исполнения (execution paths) (200, 404, 400) в коде вьюшек. Стоит отметить, что wrk посчитал только 200 ответов, как успешные, т.е. фактическое кол-во запросов в секунду выше.
Для вашего удобства все использованные версии библиотек находятся в репозитории. Там так же имеется скомпилированная портативная версия wrk, которая должна работать на любом более-менее современном (как максимум - 10 лет) Linux x86_64 дистрибутиве. Бенчмарк был запущен на публичном облаке scaleway - x86_64 сервере, запущенном в парижском дата центре. Сервер использовал Ubuntu 16.04.01 LTS и сообщал о процессоре Intel(R) Xeon(R) CPU D-1531 @ 2.20GHz. CPython 3.5.2 (есть по умолчанию в Ubuntu) был протестирован против снапшота pypy-c-jit-90326-88ef793308eb-linux64 из ветки совместимости с Python 3.5.
Мы хотим поблагодарить Mozilla за поддержку нашего дела!
С уважением, fijal, squeaky_pl и команда PyPy
P.S: Графики есть в оригинальном посте и в репозитории.