Сегодня мы столкнулись с проблемой на сервере, когда файлы / скрипты загружались более 3 секунд. Решение было простым - просто увеличили MaxClients до предполагаемого лимита памяти. Но меня беспокоит масштабируемость этого решения, и оно не кажется слишком надежным - если нагрузка немного увеличится, проблема возникнет снова.
Природа разрабатываемого нами веб-сервиса - небольшая онлайн-игра - требует от нас встраивания механизма AJAX, который каждые 15 секунд отправляет маяк, указывающий, что клиент находится в сети.
Представим себе следующую установку. Apache 2 (mpm_prefork), MaxClients = 150, KeepAlive = on, KeepAliveTimeout = 5. Сейчас в сети 300 пользователей. Правильно ли я понимаю - если все 300 пользователей отправят маяк одновременно (просто получив скрипт beacon.php с помощью POST), первые 150 клиентов получат ответ почти мгновенно, а другим 150 придется ждать 5 секунд, прежде чем они получат ответ?
И второй вопрос. Какое решение лучше всего в моем случае? Отключение сохранения активности вообще?
MaxClients в apache 2 - это максимальное количество одновременных запросов, которые будут обслуживаться всеми процессами apache. С prefork mpm это также максимальное количество процессов apache, которые будут выполняться одновременно, и максимальное количество открытых входящих сетевых подключений к вашему веб-серверу.
Вся суть KeepAlive состоит в том, чтобы уменьшить накладные расходы на инициирование новых TCP-соединений для каждого HTTP-запроса при доступе к сайту, поскольку для каждой новой страницы потенциально могут потребоваться десятки документов (исходный html, css, javascript, изображения и т. Д.). Конечный результат - страницы, которые загружаются быстрее.
MaxKeepAliveTimeout указывает, как долго веб-служба будет ждать дополнительного запроса hHT от незанятого клиента, прежде чем закрыть соединение, позволяя ему обслуживать новые входящие соединения.
В вашем случае, если у вас есть 150 клиентов, отправляющих маяк одновременно с включенным KeepAlive, то да, потребуется еще 5 секунд, прежде чем другие пользователи смогут войти в систему. Предполагая, что требуется отправлять маяк каждые 15 секунд, это 450 макс одновременных пользователей.
Решения:
вы можете уменьшить MaxKeepAliveTimeout до 2 секунд, при его увеличении отдача уменьшается. Максимальное преимущество - при начальной загрузке страницы, и между этими запросами практически нет задержки.
вы можете полностью отключить KeepAlive, увеличив время загрузки всех ваших страниц, предполагая, что большинство пользователей проводят большую часть времени в игре.
Keepalive должен быть включен как на стороне клиента, так и на стороне сервера. Предполагая, что вы контролируете свой javascript на стороне клиента, можно отключить поддержку активности на стороне клиента для определенного запроса, используя:
connection.setRequestProperty("Connection", "close");
Точно так же вы можете отключить Keepalive для определенных HTTP-запросов на стороне сервера, манипулируя заголовком ответа Connection.
Надеюсь это поможет!
Вся концепция того, как работает механизм поддержания активности Apache2, очень хорошо описана в этой статье. Настройка Apache
Вам нужно найти баланс между MaxClients и KeepAliveTimeout значения для использования этой функции. Либо увеличьте первую в соответствии с доступной памятью на сервере, либо уменьшите вторую.