Apache - поддерживать или не поддерживать?
В соответствии с методами и рекомендациями для высокопроизводительной электронной коммерции с Magento Enterprise Edition (требуется регистрация) поддержка активности должна быть отключена (для сайтов с высоким трафиком)
mod_qos также может отключить поддержку keep-alive, когда на сервере заканчиваются свободные соединения.
Таким образом, вопрос заключается в том, должен ли я поддерживать / выключать поддержку активности на сервере с малой (360 МБ) памятью, есть ли польза от поддержки активности?
Дополнительный вопрос: имеет ли keep-alive какое-либо отношение к наличию большого количества соединений TIME_WAIT в соответствии с Nestat?
Соединения TIME_WAIT тратят ресурсы сервера, стоит ли мне пытаться (как?) Сохранить их количество низким?
2 ответа
Преимущество использования keep-alive заключается в том, что клиент сможет запрашивать более одного объекта с вашего сервера без необходимости создания другого TCP-соединения (трехстороннее рукопожатие с включенными туда-обратно). Проблема заключается в том, что если, скажем, у вас установлен предел подключения в apache, равный 300, если есть 300 активных подключений, всем остальным придется ждать, пока первые 300 клиентов не будут выполнены и / или не истечет время ожидания.
Отключение keep-alive заставит клиентов создавать 1 соединение на запрос. Как только вы заметили, когда сокет правильно закрыт на обоих концах, он переходит в состояние TIME_WAIT. Это происходит, чтобы гарантировать, что порт, используемый в этом соединении, некоторое время не получает данные из предыдущего соединения, прежде чем станет доступным (см. Это, но там гораздо больше). В моей системе linux для /proc/sys/net/ipv4/tcp_fin_timeout установлено значение 60 секунд. Вы можете попытаться уменьшить это, но не заходите слишком далеко. Как далеко? Это зависит от того, сколько соединений в секунду вы получаете. Для 100-200req/s не беспокойтесь об изменении значения по умолчанию.
На сервере с небольшим объемом памяти вы столкнетесь с проблемами, связанными с поддержкой активности в любом масштабе. Это связано с тем, что apache создает один поток или процесс для каждого подключения, выделяя по умолчанию 8 МБ стека в Linux (который может быть уменьшен с помощью конфигурации Apache, в зависимости от того, насколько это зависит от приложения). На вашем сервере 360 МБ это может быть проблемой, если каждый клиент удерживает открытым хотя бы одно и, возможно, два соединения.
Фактически это является главной причиной создания веб-серверов на основе событий, таких как nginx и lighttpd, которые позволяют системам обрабатывать десятки тысяч соединений, используя разумные объемы памяти.
Итак, я бы отключил Keppalives в вашей ситуации и жить с влиянием производительности на клиентов. Или, возможно, использовать что-то вроде nginx перед apache для обработки пользовательских подключений, передавая запросы Apache. Это очень распространенная модель, эффективно трактующая Apache как "пул потоков" для потенциально блокирующих операций, таких как доступ к диску или базе данных.