Конфигурация Apache для просмотра больших страниц, пользователей с длинными сеансами - переменные KeepAlive и MaxRequest
В настоящее время я запускаю веб-приложение, в котором несколько (~15) пользователей входят в систему один раз в день, а затем оставляют открытым веб-приложение, где оно автоматически обновляется новым контентом каждые 5 минут. Каждый пользователь имеет тенденцию открывать его в течение 15-18 часов.
Однако у пользователей с критической массой (~30-40) все начинает резко замедляться, и процесс HTTPD начинает увеличиваться в использовании памяти. Я добавил работу cron, которая перезапускает apache раз в час, но это только помогает. Весь контент генерируется динамически и новое время вах, поэтому кэширование страниц не вариант.
Я начал играть с опциями Timeout,MaxRequest и KeepAlive, но любые рекомендации будут с благодарностью, так как я всегда оставлял их по умолчанию.
Вот что у меня есть. Любые гении apache имеют идеи о том, как оптимизировать этот конфиг для сценария выше? Я полагал, что длительный тайм-аут хорош, потому что время загрузки может иногда быть ОЧЕНЬ высоким.
# Timeout: The number of seconds before receives and sends time out.
Timeout 200
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
KeepAlive On
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
MaxKeepAliveRequests 100
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
KeepAliveTimeout 60
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 16
MinSpareServers 10
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
2 ответа
Я думаю, что вам нужно играть с директивой MaxRequestsPerChild. Перезапуск apache каждый час не выглядит для меня элегантным решением. MaxRequestsPerChild каждый процесс будет автоматически перезапущен, как только он будет обслуживать заданное количество запросов. Попробуйте установить его на 100?
Кроме того, использование гораздо более легкого веб-сервера (такого как nginx) для фальсификации медленных клиентов и обслуживания статических носителей отнимает большую нагрузку у apache.
(Я упростил цифры для ясности, особенно часть памяти слишком высока)
Ваш MaxRequestsPerChild в настоящее время 4000, учитывая, что вы получаете 50 пользователей в день, каждый из которых обновляется каждые 5 минут в течение 18 часов, что составляет 600 запросов в час и 10800 запросов в день. Для справки: один пользователь использует 218 подключений в день.
Это означает, что дочерние процессы перезапускаются 2,7 раза в день. Если ваше приложение использует 50 МБ памяти для каждой перезагрузки и удаляет 49 МБ, то 1 МБ для обновления, 50 МБ для 50 пользователей и 4 ГБ для 4000 перезагрузок. И ребенок будет убит.
Вы должны проверить, сколько памяти использует ваше приложение, и установить эти значения в соответствии с ними.
Если на вашем сервере есть память 20 ГБ, утечка в 1 МБ несколько сработает, но если изменить MaxRequestsPerChild, например, на 1000, потребление памяти перед перезагрузкой дочернего элемента в четыре раза уменьшится.
Для заметки, вы можете уменьшить MaxClients примерно до 100 и убедиться, что на самом деле больше пользователей вы не думаете. Таким образом, случайные проблемы не приведут к тому, что сервер выйдет из-за слишком большого количества запросов Этот KeepAliveTimeout может длиться около 15 секунд, поскольку пользователи обновляются только каждые 5 минут.