Ubuntu server 12.04, apache2 - очень медленный ответ на первый запрос

Сервер находится под большой нагрузкой - несколько сотен запросов в секунду. Подавляющее большинство из них через SSL.

Проблема в том, что первый запрос через HTTPS к серверу встречает очень медленный ответ (например, 10 с), даже если база данных не задействована. Следующие запросы реализуются в мгновение ока. В то же время без SSL он работает быстро постоянно. Несколько дней назад ситуация изменилась - большая часть трафика была без SSL и тогда была быстрой без SSL и с медленной SSL.

Я хочу, чтобы соединения проходили через SSL, но первый ответ после некоторого времени отсутствия активности на уровне около 10 секунд неприемлем. Что я мог бы изменить в конфигурации apache2, чтобы избежать первого медленного ответа?

4 ответа

Решение

Я нашел проблему. Мне пришлось отключить KeepAlive.

Было много новых соединений каждую секунду (200-300/ с, иногда больше). Большинству из них не требовалось поддерживать связь в течение 5 секунд. В результате пул соединений был быстро использован, и все новые соединения должны были ждать завершения старого через 5 секунд.

Похоже, опция KeepAlive полезна только в том случае, если сервер способен удерживать достаточно открытых соединений, в то время как большинство пользователей используют sth для указанного в параметре KeepAliveTimeout (например, 5 в моем случае).

В другом случае полезно отключить его.

Похоже, проблема DNS. Убедитесь, что DNS настроен на localhost и работает должным образом, также проверьте, что директива HostnameLookups отключена в конфигурации apache.

Я могу придумать два сценария:

  • Проверяйте логи Apache и делайте из них что-то умное (ошибки, метки времени доступа и т. Д.)
  • Или: я предлагаю вам Wireshark, как идет протокол рукопожатия SSL. Вы должны увидеть, где проходит 10 с - на стороне сервера или на стороне клиента. Я предполагаю, что открытие хранилища ключей или чего-то подобного занимает много времени, но сначала вы должны прослушивать сетевой трафик для отметок времени. Дайте нам знать, как все прошло!

Похоже, вы связаны с процессором обмена ключами. Общая проблема. Когда клиент подключается через SSL/TLS в первый раз, происходит обмен ключами (очень дорогой). После завершения обмена ключами клиенты могут повторно использовать ключи, полученные при обмене, в следующем сообщении. Вот почему первый запрос по HTTPS занимает так много времени.

С этой ситуацией вы мало что можете сделать, кроме добавления ресурсов. Больше CPU ускорит расчеты обмена ключами. Больше памяти всегда хорошо. Вы также можете настроить Apache так, чтобы сгенерированные ключи оставались в памяти дольше, чтобы клиенты не повторяли обмен ключами.

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

Если вы собираетесь работать с такой нагрузкой в ​​течение более длительного времени, было бы неплохо разгрузить вычисления SSL/TLS. Вы можете получить отдельную коробку (используя ваш любимый прокси), карту ускорения SSL или даже специальную коробку разгрузки SSL/TLS.

Другие вопросы по тегам