Назад | Перейти на главную страницу

Почему TTFB запросов в 5 раз больше, когда новый сеанс TCP создается на Apache?

При тестировании изображения, обслуживаемого с apache, Я заметил, что при создании нового сеанса:

Waiting (TTFB): 1.09s Initial connection + SSL handshake: 370ms DNS Lookup: 165ms

Но тогда при постоянном подключении следующее:

Waiting (TTFB): 187ms Content Download: 4ms

Итак, в среднем мы нашли TTFB в 5 раз дольше при новых подключениях, непостоянно. Это нормально?

Дополнительный вопрос: почему он выполняет новый поиск DNS только при новом подключении?

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

Это связано с тем, что IP-адрес должен быть определен из DNS, должно быть установлено TCP-соединение, затем должен быть инициализирован уровень SSL / TLS, и только после этого фактические данные могут быть отправлены.

Поиск DNS не выполняется при постоянном соединении, потому что уже существует активное TCP-соединение между IP-адресами клиента и сервера. Следовательно, нет необходимости преобразовывать доменное имя в IP-адрес.

Что касается Apache KeepAlive и KeepAliveTimeout директивы. KeepAlive указывает, должен ли Apache поддерживать клиентские соединения открытыми для последующих запросов других ресурсов на том же сайте. Это постоянные соединения, позволяющие избежать упомянутых ранее задержек.

Однако для поддержания активности соединений используются ресурсы на сервере, поскольку каждое TCP-соединение требует памяти для поддержания состояния. Поэтому с KeepAliveTimeout директиву можно указать, как долго простаивающее соединение остается открытым, прежде чем веб-сервер его закроет. Это также усложняет злоумышленникам возможность исчерпать ресурсы сервера, открывая HTTP-соединения и оставляя их открытыми на неопределенный срок.

MaxKeepaliveRequests означает, сколько запросов разрешено на одно соединение KeepAlive. Я не могу представить себе ситуацию, когда можно было бы ограничить количество запросов. Для лучшей производительности я бы использовал 0, то есть неограниченное количество запросов.

Эти директивы относятся к сеансам HTTP (S) между посетителем и веб-сервером. PHP-FPM не имеет отношения к этому интерфейсу. Однако аналогичный механизм поддержки активности доступен в nginx для интерфейса FastCGI. Я не знаю, доступен ли аналогичный механизм в Apache.