Python

индекс
250,37

Сравнение нагрузки — PyCurl vs HTTPClientFactory+Deferred

В процессе разработки одного проекта на Python+Twisted (распределителя СМС запросов) пришлось переписать вызов URL различных сервисов с разных серверов c блокирующего вызова через PyCurl на неблокирующий (client.HTTPClientFactory + deferred). Чтобы иметь перед глазами реальные данные, решил дать нагрузку и посмотреть на результаты


Описание теста


Использовался Jakarta Jmeter

В 200 потоков прогнано 100 запросов на один и тот же сервер, но со случайными данными (чтобы исключить кэширование). Прогонялось на обыкновенной рабочей машине с GUI — так для примерной оценки.

Результаты теста




Одна ошибка — не справилась база, так что погрешностью можно пренебречь


Графики распределения



Блокирующий (PyCurl)




Неблокирующий (deferred)



Итоги


Как видно из результата — у defered минимальное значение отклика сервера почти в 2.5 раза меньше (из-за отказа базы), а максимальное — меньше в два раза, чем у блокирующего. Среднее также меньше в 2 раза.

Америку я, конечно, не открыл, но по-крайней мере — теперь на руках конкретные цифры. Надеюсь, кому-нибудь они пригодятся.
+13
4 мая 2010, 12:34
10

комментарии (17)

+2
fledgling #
А curl multi?
+1
MichaelXIII #
Простой.

Спасибо, забыл про него — нужно будет проверить
+1
fledgling #
Кстати, в торнадо как раз есть AsyncHTTPClient, использующий CURL Multi.

Это я так, чтобы время лишнее не тратили.
0
MichaelXIII #
Спасибо
0
anight #
curl multi для этого случая подходит.

но если в программе уже есть свой event loop, то использовать curl multi не получится.
0
MichaelXIII #
reactor засчитывается как event loop?
0
anight #
да, rector это pattern. суть — event loop.
0
MichaelXIII #
Да я в курсе, просто уточнить, что мы имеем ввиду одно и тоже.

То есть получается что curl multi — в пролете?

и
— либо httplib
— либо deferred?
0
niksite #
> а максимальное — в два раза, чем у блокирующего.

Советую перечитывать статьи перед публикацией.
0
MichaelXIII #
Согласен, исправил
0
ExxY #
Я один не понял что на графиках?
Зачем делать 100 запросов в 200 потоках?
И вообще так понял что вы сравниваете несколько последовательных запросов на PyCurl с несколькими одновременными на Twisted? Это как-то бессмысленно получается. Или PyCurl разнесли на несколько тредов?
0
MichaelXIII #
Нет, в одном треде (если я правильно понял)
+2
yoihj #
Какой смысл использовать PyCurl для множества запросов без PyCurl.Multi? После таких «тестов» все будут думать, что PyCurl отстой, когда он может тысячи запросов в секунду делать. Только (ВАЖНО!!) PyCurl Multi должен быть скомпилирован с библиотекой (c-ares) — это очень важно. По скорости можно сказать так: PyCurl обычный (медленно), PyCurlMulti (быстрее, но все еще медленно из-за синхронных DNS запросов), PyCurl+c-ares (предесльно быстро).

Дело в том, что на DNS запросы тратится тоже время и в синхронном режиме DNSы обычно (из опыта) могут выдавать только десятки ответов в секунду. В асинхронном режиме запросов (чем и занимается c-ares!) DNSы могут выдавать сотни и под тысячу ответов. Так что скорость растет в десяток раз минимум.

Важно: по умолчанию PyCurl под linux скомпилированы без c-ares. Проверка 'import pycurl; print pycurl.version' — если в выдаваемой строке есть 'c-ares' -скорость будет максимальной при использовании PyCurl.Multi. (Я дико долго искал почему винда на домашнем компе делает сотни запросов в секунду, а сервер в датацентре только десятки — разница была в наличии «c-ares») Под виндой .exe установщик обычно включает в себя c-ares.

PyCurl.Multi тоже не так прост, как кажется — даже в официальном multi_get примере есть ошибка (не помню точно ее суть, но по-моему он не будет качать больше 100 запросов — очередь неправильно реализована). Можете воспользоваться для теста моей функцией multi_get (простой интерфейс к PyCurl.Multi)

0
yoihj #
Совсем забыл — там же по ссылке — указание как скомпилировать pycurl+c-ares под linux/freebsd.
+3
MichaelXIII #
Спасибо, не знал

P.S. Ну после того как выложишь — сразу куча информации появится ;-) Это нормально
0
siasia #
Просветите неандертальца, чем PyCurl лучше нативной httplib? Это относится и к данному конкретному случаю.
0
MichaelXIII #
Мне PyCURL показался несколько более «конфигурируемым», чем httplib, хотя посмотрел ОЧЕНЬ по диагонали, так что не факт

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.