Кешированные HTTP-соединения
Как-то на кухне зашел разговор за потерю времени на установление HTTP-соединения. Всем вроде понятно что на инициализацию тратится время. Но мне стало интересно сколько именно и я набросал маленький скрипт-бенчмарк:
- форкаю процесс и запускаю в нем HTTP-сервер
- шлю запросы в течении какого-то времени
- считаю всякое и делаю странные выводы...
Сервера
В качестве серверов для теста я выбрал следующие:
Webrick
в отдельном процессеWebrick
в докереThin
в отдельном процессеNginx
в докере- какой-то HTTP-сервер в локалке
- и
google.com
Режим each
В этом режиме каждый запрос выполняется в цикле в отдельном соединении:
Режимsingle
Тут открывается одно соединение и через него гонятся все запросы:
Поехали!
В каждом режиме есть еще два варианта - однопоточный и многопоточный. В данном случае я выбрал 5 потоков. Запускаем и ждем выхлопа...
Когда я первый раз получил результаты я немного растерялся и пришлось добавить несколько итераций, усреднение, подсветку.... Но ничего не помогло :)
Как видно из картинки Webrick
в отдельном процессе работает медленнее при одном кешированном соединении, чем при открытии на каждое. При этом тот жеWebrick
в докере работает как полагается (функцияstart
зовётся после форка):
Моё предположение заключается в том чтоWebrick
как-то странно обрабатывает закрытие соединений, а когда попадает под докер, то ситуация улучшается за счет промежуточного слоя докеровских сетей и какой-то тёмной магии внутри, но раскапывать это у меня нет ни желания ни времени.
Если у кого-то есть идеи почемуWebrick
ведёт себя именно так - можете написать в коментах. И вообще можете написать в коментах. Скачать скрипт можно тут. Запуск с моими настройками длится несколько минут и не забудьте изменить адрес сервера в локалке.
Заключение
В целом я свой интерес удовлетворил - кешировать соединения надо :)