rails
February 25, 2021

Кешированные HTTP-соединения

Как-то на кухне зашел разговор за потерю времени на установление HTTP-соединения. Всем вроде понятно что на инициализацию тратится время. Но мне стало интересно сколько именно и я набросал маленький скрипт-бенчмарк:

  • форкаю процесс и запускаю в нем HTTP-сервер
  • шлю запросы в течении какого-то времени
  • считаю всякое и делаю странные выводы...

Сервера

В качестве серверов для теста я выбрал следующие:

  1. Webrick в отдельном процессе
  2. Webrick в докере
  3. Thin в отдельном процессе
  4. Nginx в докере
  5. какой-то HTTP-сервер в локалке
  6. иgoogle.com

Режим each

В этом режиме каждый запрос выполняется в цикле в отдельном соединении:

Цикл и на каждой итерации Net::HTTP.start + http.get

Режимsingle

Тут открывается одно соединение и через него гонятся все запросы:

Один Net::HTTP.start на весь цикл http.get

Поехали!

В каждом режиме есть еще два варианта - однопоточный и многопоточный. В данном случае я выбрал 5 потоков. Запускаем и ждем выхлопа...

Повелитель, на границе что-то странное творится...

Когда я первый раз получил результаты я немного растерялся и пришлось добавить несколько итераций, усреднение, подсветку.... Но ничего не помогло :)
Как видно из картинки Webrick в отдельном процессе работает медленнее при одном кешированном соединении, чем при открытии на каждое. При этом тот жеWebrick в докере работает как полагается (функцияstart зовётся после форка):

Webrick нормального человека
Webrick докер-курильщика

Моё предположение заключается в том чтоWebrick как-то странно обрабатывает закрытие соединений, а когда попадает под докер, то ситуация улучшается за счет промежуточного слоя докеровских сетей и какой-то тёмной магии внутри, но раскапывать это у меня нет ни желания ни времени.

Если у кого-то есть идеи почемуWebrick ведёт себя именно так - можете написать в коментах. И вообще можете написать в коментах. Скачать скрипт можно тут. Запуск с моими настройками длится несколько минут и не забудьте изменить адрес сервера в локалке.

Заключение

В целом я свой интерес удовлетворил - кешировать соединения надо :)