TinySQL

Данное тестирование  содержит данные о работе python-фреймворков и сравнение «цены асинхронности» с синхронным WSGI-решениями.

Простое решение

для небольших сайтов

  • 100% переносимость
  • Простой интерфейс
  • Скорость ограничена только возможностями HDD
  • API для тех, кто желает разнести UI и ServerSide (в разработке)

Python web-фреймворки

Данное тестирование  содержит данные о работе python-фреймворков и сравнение «цены асинхронности» с синхронным WSGI-решениями.

Участники тестирования (описания взяты с сайтов)

  • Aiohttp 0.16.3 - асинхронный фреймворк базирующийся на Asyncio;
  • Bottle 0.12.8 - быстрый, простой и легковесный WSGI микрофреймвок;
  • Django 1.8.2 - веб-фреймворк для перфекционистов с горящими сроками;
  • Falcon 0.3.0 - высоко-производительный фреймворк для построения облачных API;
  • Flask 0.10.1 - микрофреймворк основаный на Werkzeug, Jinja2 и хороших намерениях;
  • Muffin 0.0.88 - асинхронный фреймворк на основе  Asyncio и Aiohttp;
  • Pyramid 1.5.7 - небольшой, быстрый и понятный веб-фреймворк;
  • Tornado 4.2 - асинхронная сетевая библиотека и веб-фреймворк;

Методика тестирования

Тесты проводились на Amazon EC2 t2.medium сервере. Для создания нагрузки использовалась утилита WRK запущенная на том же сервере с параметрами:

wrk -d30s -t12 -c400 

Все приложения (кроме Tornado) запускались при помощи Gunicorn (2 процесса на каждое). Для синхронных WSGI библиотек использовался Meinheld worker.

Приложение на Tornado запускало 2 процесса, используя средства самого фреймворка.

Все тесты производились с использованием Python 2.7.6.

Каждое приложение тестировалось по трем основным сценариям:

  • JSON-тест - закодировать небольшой объект в JSON и вернуть клиенту.
  • Remote-тест - загрузить ответ от другого сервера и вернуть его клиенту.
  • Complete-тест - с помощью ORM загрузить коллекцию объектов из базы, добавить к ней еще один и отрендерить список в шаблоне.

Первый сценарий это простейший «Hello World!» немного усложненный кодированием в JSON и показывает скорость обработки HTTP-запросов.

Второй сценарий показывает насколько хорошо фреймворк справляется с длительными операциями ожидания во время обработки запроса.

Третий сценарий - комплексный тест и имитирует реальную жизнь, а именно использование базы данных, ORM, работу шаблонизатора.

В качестве базы данных использовался Postgresql с дефолтными настройками.

Исходники приложений - на Github.

Результаты

Encode an object to JSON and return result

Name50% (ms)75% (ms)Avg (ms)Req/s
Falcon19.2419.8119.1920677.13
Bottle24.7726.2325.0615761.45
Pyramid41.7543.4941.639402.69
Flask64.3271.5965.686023.4
Aiohttp91.67103.1108.014093.41
Django103.2112.19103.363696.9
Muffin108.07115.09171.563575.36
Tornado138.24149.84136.872829.72

В первом простом тесте на первых местах синхронные фреймворки. Асинхронные фреймворки в аутсайдерах.

 

Load a response from remote server and return as response

Name50% (ms)75% (ms)Avg (ms)Req/sTimeouts
Aiohttp358.08369.08338.941120.27 
Muffin372.95428.75376.981019.76 
Tornado1994.392069.251928.31194.37 
Pyramid3295.110518.926673.7819.35338
Falcon3196.2312976.846696.1719.28328
Flask3306.8811690.86824.8819.16363
Bottle3363.749911.846403.9219.09335
Django3317.6412954.236918.6418.96300

Для понимания результатов этого теста необходимо пояснить, что приложения обращались к nginx настроенному на ответ с задержкой 100ms. Из-за этого результаты синхронных фреймворков очень близки.

 

Load data from database with ORM and render to template

Name50% (ms)75% (ms)Avg (ms)Req/sTimeouts
Aiohttp151.78156.9254.751004.82236
Muffin420.14485.41552.7819.62 
Bottle613.5630.171062.86451.34178
Tornado937.37988.86910.06418.36 
Falcon766.75805.351457.99350.2681
Pyramid562.44601.49812.43248.42235
Flask1032.631649.891465.25222.78496
Django1610.461976.442632.3688.5742

Создание сайта и поддержка проекта - ООО "Сайт!"