Я веду сайт как услугу для школьного сообщества плавания в средней школе штата. Я делаю это из любви к спорту, поэтому не могу тратить баснословные суммы на хостинг и т. Д. Да и не нужно - кроме одного дня в году.
Все тренеры отправляют свои региональные заявки через мой сайт и, как правило, ждут, когда наступит срок, чтобы сделать это. Это было вчера, и мой сайт, который ни разу не падал за весь сезон, останавливался по крайней мере 4 раза в течение дня. Он никогда не уходил больше часа и всегда возвращался. (Я выпустил перезапуск apache на всякий случай).
Мой вопрос: как я могу настроить Apache, чтобы справиться с однодневным всплеском пользователей? Нет смысла платить за дополнительное оборудование на целый год, когда мне нужно только один день повысить производительность. Я пробовал читать о prefork.c и worker.c, но я просто недостаточно хорошо их понимаю. Вот моя текущая конфигурация:
<IfModule prefork.c>
StartServers 1
MinSpareServers 1
MaxSpareServers 5
ServerLimit 10
MaxClients 10
MaxRequestsPerChild 4000
</IfModule>
<IfModule worker.c>
StartServers 1
MaxClients 10
MinSpareThreads 1
MaxSpareThreads 4
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
Максимальное количество пользователей, которых я ожидал сразу, будет 400. Хотя, вероятно, гораздо меньше. У меня вчера было около 70, и это не очень хорошо работало. Какие-либо предложения?
ОБНОВИТЬ:
728 root 20 0 317m 20m 7752 S 0.0 2.7 0:49.58 httpd
19700 webuser 20 0 489m 37m 6792 S 0.0 4.9 0:00.72 httpd
19737 webuser 20 0 493m 42m 6624 S 0.0 5.5 0:00.59 httpd
19756 webuser 20 0 494m 43m 6604 S 0.0 5.7 0:00.58 httpd
19758 webuser 20 0 495m 44m 6780 S 0.0 5.8 0:00.97 httpd
19777 webuser 20 0 493m 42m 6620 S 0.0 5.5 0:01.08 httpd
Взглянул на ресурсы, и я не уверен, на что я смотрю. Процесс, принадлежащий пользователю root, должен быть тем, который запускает Apache. Созданы ли те, которые принадлежат веб-пользователю, самим Apache? Почему они такие большие? Сервер имеет около 3 / 4G RAM, если я считаю 1/2 для Apache, а процессы содержат 40M, как я могу оценить возможное количество одновременных пользователей?
Я попытаюсь набросать некоторые общие правила, учитывая, что вы предоставили очень мало деталей о своей среде:
Прежде всего, проверьте, какой модуль mpm использует ваш Apache, чтобы вы знали, какой из двух блоков конфигурации, которые вы разместили, вам нужно настроить:
apachectl -D DUMP_MODULES | egrep -i "prefork|worker"
Если вы находитесь в режиме предварительной вилки и запускаете какое-то приложение на PHP через mod_php
, причина того, что ваши процессы Apache со временем становятся огромными, заключается в том, что все больше и больше php-кода и данных загружаются модулем в оперативную память каждый раз, когда приложение получает новые запросы от клиентов. Чтобы уменьшить размер процессов, попробуйте уменьшить MaxRequestsPerChild
примерно до 500. Каждый процесс будет завершен после обслуживания MaxRequestsPerChild
запросов, и будет запущен новый (который, надеюсь, будет иметь меньший объем памяти). Это связано с затратами на производительность, поскольку новые процессы будут повторно запускаться чаще, но поскольку вы пытаетесь поддерживать работу службы, а не делать ее молниеносной, это должно быть приемлемым компромиссом.
Вы не хотите, чтобы ваш веб-сервер менял местами: убедитесь, что максимальное потребление ОЗУ во время каждого процесса Apache ServerLimit
или MaxClients
никогда не превышает 75% доступной памяти сервера.
Если можете, перейдите на AWS или другого поставщика облачных услуг: AWS может автоматически увеличивать и уменьшать масштаб вашего сервера по заранее определенному расписанию. «Автомасштабирование» - это облачная змеиная нефть в 90% реальных сценариев, но ваш случай, возможно, один из немногих, которым эта функция действительно может принести пользу. Вы не должны упускать возможность.
Если вы сталкиваетесь с такими проблемами при обслуживании 70 клиентов на сервере с 4 ГБ ОЗУ, я подозреваю, что что-то не так, но, опять же, вы предоставили недостаточно подробностей, чтобы сделать что-либо, кроме обоснованного предположения.