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

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

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

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

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

решение1

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

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

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

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

решение2

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

решение3

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

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

решение4

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

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

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

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

Связанный контент