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

Apache - keep-alive или не keep-alive?

В соответствии с Методы и лучшие практики для высокопроизводительной электронной коммерции с Magento Enterprise Edition (требуется регистрация) функция keep alive должна быть отключена (для сайтов с высокой посещаемостью)

mod_qos также может отключить поддержку keep-alive, когда на сервере заканчиваются свободные соединения.

Итак, вопрос в том, должен ли я отключать / включать keep-alive на сервере с низким (360 Мб) объемом памяти, есть ли преимущества в сохранении активности?

Дополнительный вопрос: имеет ли keep-alive какое-либо отношение к наличию большого количества соединений TIME_WAIT в соответствии с nestat?

Соединения TIME_WAIT тратят ресурсы сервера, должен ли я попытаться (как?) Уменьшить их количество?

На сервере с низким объемом памяти вы столкнетесь с проблемами с включенными сообщениями поддержки активности в любом масштабе. Это связано с тем, что apache создает один поток или процесс для каждого соединения, выделяя по умолчанию 8 МБ стека в Linux (который можно уменьшить с помощью конфигурации Apache, до какой степени зависит от приложения). На вашем сервере размером 360 МБ это может стать проблемой, если каждый клиент поддерживает хотя бы одно, а возможно, и два соединения.

Фактически это основная причина того, что веб-серверы, основанные на событиях, любят nginx и lighttpd были созданы - чтобы позволить системам обрабатывать десятки тысяч соединений с использованием разумного количества памяти.

Итак, я бы отключил keppalives в вашей ситуации и смирился с влиянием на производительность клиентов. Или, возможно, используйте что-то вроде nginx перед apache для обработки пользовательских подключений, проксирования запросов к Apache. Это очень распространенная модель, эффективно обрабатывающая Apache как «пул потоков» для потенциально блокирующих операций, таких как доступ к диску или базе данных.

Преимущество включения функции keep-alive заключается в том, что клиент сможет запросить более одного объекта с вашего сервера без необходимости создания другого TCP-соединения (трехстороннее рукопожатие с включенными циклами приема-передачи). Проблема в том, что если, скажем, у вас есть ограничение на количество подключений в apache, равное 300, если есть 300 активных подключений, всем остальным придется ждать, пока не будут выполнены первые 300 клиентов и / или истечет время ожидания.

Отключение проверки активности заставит клиентов создавать 1 соединение для каждого запроса. Когда сокет правильно закрыт на обоих концах, он переходит в состояние TIME_WAIT, как вы заметили. Это происходит для того, чтобы порт, используемый в этом соединении, не получал данные от предыдущего соединения некоторое время, прежде чем он станет доступным (см. этот, но есть еще много чего). В моей системе Linux / proc / sys / net / ipv4 / tcp_fin_timeout установлено на 60 секунд. Вы можете попробовать уменьшить это, но не заходите слишком далеко. Как далеко? Это зависит от того, сколько соединений в секунду вы получаете. Для 100-200 запросов / с не беспокойтесь об изменении значения по умолчанию.