Самое эффективное единичное изменение для повышения производительности прокси — вовсе не покупка более быстрого прокси, а переиспользование уже установленного соединения. Клиент, открывающий новое соединение на каждый запрос, постоянно платит стоимость его установки, и через прокси эта стоимость удваивается.
Реальная стоимость установки соединения
Эти 200 ms оплачиваются заново при каждом новом соединении. Если вы отправляете 1 000 запросов и каждый раз открываете новое соединение, только на установку уйдёт 200 секунд.
Как работает Keep-Alive?
В HTTP/1.1 соединения по умолчанию постоянны: после получения ответа соединение не закрывается, и следующий запрос отправляется через тот же сокет. Это поведение нарушают три вещи:
- Сервер
Connection: closeотправляет — соединение закрывается. - Клиент создаёт новый объект сессии на каждый запрос — пул не работает вовсе.
- Превышено время простоя — прокси или сервер разрывает соединение.
Создание в коде на каждый запрос нового объекта Session, Client или Agent . Это полностью отключает переиспользование соединений, какой бы ни была ваша конфигурация пула.
Правильная конфигурация
Держите размер пула чуть ниже лимита параллелизма вашего провайдера. При превышении лишние соединения будут устанавливаться и сразу закрываться.
Каков выигрыш?
В приведённом измерении использование пула сокращает общее время примерно втрое. Выигрыш тем больше, чем выше задержка до прокси.
Переиспользование TLS-сессии
Помимо пула соединений есть и второй источник выигрыша: TLS session ticket. При повторном подключении к той же цели вместо полного рукопожатия можно выполнить сокращённое. Большинство современных клиентов делает это автоматически; важно лишь переиспользовать объект клиента.
Если вы пересоздаёте объект клиента на каждый запрос, session ticket теряется и каждый раз выполняется полное рукопожатие.
Баланс времени простоя
Слишком долго держать соединение открытым тоже опасно: прокси или целевой сервер может без уведомления разорвать его, и ваш клиент заметит это только на следующем запросе. Отсюда и берётся шаблон «первый запрос падает, второй проходит».
| Параметр | Рекомендуется | Почему |
|---|---|---|
| keepalive_expiry | 30–60 с | Должно быть меньше серверного тайм-аута |
| Размер пула | Ниже лимита параллелизма | Излишек — рукопожатия впустую |
| Повторная попытка | 1 раз | Компенсирует разорванное соединение |
| Предельный срок жизни соединения | 5–10 мин | Долгоживущие соединения «протухают» |
Держите время простоя меньше серверного тайм-аута. Тогда соединение закрываете вы, и ситуация «сервер закрыл, а я об этом не знаю» не возникает.
Противоречие с ротацией
Переиспользование соединения и ротация IP естественным образом противоречат друг другу: использовать то же соединение — значит оставаться на том же исходящем IP. Это не проблема, а вопрос выбора:
В большинстве сценариев верен второй вариант: переиспользуйте соединение какое-то время (например, 30 запросов или 5 минут), затем обновляйте его.
О стратегиях ротации — в нашей статье о настройках ротации можно посмотреть.
Резюме
Keep-alive и пул соединений — самый мощный единичный рычаг в производительности прокси. Создайте объект клиента один раз и переиспользуйте его, держите размер пула ниже лимита провайдера, задайте время простоя меньше серверного тайм-аута и добавьте одну повторную попытку. Если нужна ротация, вместо отключения пула предпочтите периодическое обновление. Для измерения тест пинга и проверка proxy вы можете воспользоваться нашими инструментами.