Измеряем этапы HTTP-запроса с curl

2 мин чтения

Измеряем DNS, соединение и время первого байта через curl, не приписывая всю задержку базе данных.

Из каких этапов складывается ожидание
  1. DNSНаходим адрес сервера
  2. СоединениеУстанавливаем TCP, для HTTPS — ещё TLS
  3. Первый байтЖдём начало ответа; времена curl считаются от старта

«Сайт медленный» — пока только впечатление. Время может уйти на DNS, соединение, TLS или ожидание ответа приложения. Curl умеет показать эти этапы для отдельного запроса. Снимем несколько измерений и разберём, какие выводы из них делать можно, а какие потребуют других данных.

Получаем один измеримый запрос

curl -sS -o /dev/null --connect-timeout 5 --max-time 20 \
  -w 'dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} first=%{time_starttransfer} total=%{time_total} code=%{http_code}\n' \
  https://example.com/

Домены и ограничения времени замените под свою проверку. Ответ сохраняется в пустое устройство, а ошибки остаются видимыми. Значения времени отсчитываются от начала операции, поэтому их нельзя складывать как независимые длительности. Для простого запроса без перенаправлений разность соседних отметок помогает приблизительно оценить соответствующий этап. В сложном соединении интерпретация требует дополнительных сведений.

Не называем первый байт временем базы

Показатель первого байта включает действия до начала передачи и ожидание ответа. Большое значение не доказывает медленный SQL: возможны очередь приложения, сеть, промежуточный прокси и другие причины. Сравните результат с журналом конкретного запроса, временем приложения и его идентификатором. Не передавайте секретные заголовки или личные данные в публичный пример диагностики.

Выполните несколько одинаковых запросов с одной машины и сохраните каждый результат. Затем повторите измерение из другой разрешённой точки сети. Учитывайте кэш DNS, состояние серверного кэша и фоновые изменения нагрузки. Нельзя объявлять улучшение на основании одного удачного обращения после серии ошибок. Различайте недоступность ресурса и успешный, но медленный ответ.

Редиректы и незавершённые запросы

Команда не следует перенаправлениям автоматически. Если ответ содержит Location, сначала изучите его отдельно. При добавлении режима следования часть времён будет относиться к цепочке, а не только к последней странице. Также проверьте код завершения curl: оборванный запрос не является корректным измерением полной передачи.

Сохраните URL, время проверки, машину запуска, HTTP-код и параметры curl. Несколько повторов помогут увидеть, постоянна ли задержка. Загрузку картинок, сценариев и работу JavaScript измеряйте уже в браузере: быстрый ответ HTML ещё не означает, что интерфейс быстро готов к работе.

Источники и дальнейшее чтение