- Вопрос или проблема
- ОС
- Конфигурация сервера
- Параметры Apache.Conf (2.4)
- MPM ИСПОЛЬЗУЕТСЯ: prefork
- Включенные модули
- Средний размер процесса Apache
- Расчет MaxRequestWorkers
- MPM ИСПОЛЬЗУЕТСЯ: prefork
- Параметры PHP.INI (php5)
- ПРОБЛЕМЫ, С КОТОРЫМИ Я ВСЕ ЕЩЕ СТОЛКНУЛСЯ
- Ответ или решение
- Общая картина
- Конфигурация Apache
- Проблемы и предложения:
- Альтернативные конфигурации
- Технические рекомендации
- Заключение
Вопрос или проблема
Я знаю, что вопрос немного длинный, но я решил описать каждый аспект, который я заметил со своей стороны.
Я использую сервер на Linux, операционная система – Ubuntu 14.04, остальные конфигурации определены ниже. Этот веб-сервер используется для обслуживания приложения, написанного на PHP, база данных размещена на RDS. В среднем в пиковые времена на сервере обрабатывается около 200 одновременных запросов, что приводит к 100% загрузке памяти. Из-за этого приложение становится очень медленным или иногда выдает ошибку. Поэтому я предпринял некоторые шаги для решения этой проблемы, которые перечислены ниже, и попытался настроить Apache и ограничить его для необычных ситуаций.
ОС
NAME=”Ubuntu”
VERSION=”14.04.5 LTS
Конфигурация сервера
ЦП: 8 ядер
ОЗУ: 15 ГБ
Поставщик оборудования: AWS
Тип экземпляра: c4.2xlarge
Параметры Apache.Conf (2.4)
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
HostnameLookups Off
LogLevel warn
AllowOverride all (для корневого каталога приложения)
MPM ИСПОЛЬЗУЕТСЯ: prefork
MPM_PREFORK.CONF
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 256
MaxConnectionsPerChild 200
Включенные модули
access_compat.load autoindex.load mime.load setenvif.load
alias.conf deflate.conf mpm_prefork.conf socache_shmcb.load
alias.load deflate.load mpm_prefork.load ssl.conf
authn_core.load dir.conf negotiation.conf ssl.load
authn_file.load dir.load negotiation.load status.conf
authz_core.load env.load php5.conf status.load
authz_host.load filter.load php5.load
authz_user.load headers.load rewrite.load
autoindex.conf mime.conf setenvif.conf
Средний размер процесса Apache
Используемая команда:
sudo ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}' <br/>
Потребление памяти Apache (МБ): 7227.66
Средний размер процесса (МБ): 314.246
Расчет MaxRequestWorkers
X = Выделенная ОЗУ, которую я хочу выделить для Apache (13 ГБ): 13312 МБ
Y = Средний размер процесса, который я отслеживаю за последние 15 дней на сервере: 314.246
MaxRequestWorkers = X/Y = около 40
MPM ИСПОЛЬЗУЕТСЯ: prefork
Измененный MPM_PREFORK.CONF
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 40
MaxConnectionsPerChild 8
Теперь при запуске apache будет запущено 5 процессов startservers, и каждый процесс startserver запустит 8 дочерних подключений, так что в общей сложности может быть установлено 40 одновременных подключений к серверу. MaxRequestWorkers ограничен 40, что не позволит выйти за пределы 40 одновременных запросов, что предотвратит в случае DOS, DDOS или защитит сервер от остановки, заняв максимум 13 ГБ ОЗУ, оставляя 2 ГБ ОЗУ свободными для сервера.
Я также не уверен в параметре MaxConnectionsPerChild, пожалуйста, исправьте меня, если я использую его неправильно.
Параметры PHP.INI (php5)
СТАРЫЕ
output_buffering = 4096
max_execution_time = 60
memory_limit = -1
log_errors = On
НОВЫЕ
output_buffering = 4096
max_execution_time = 60
memory_limit = 64M
log_errors = On
ПРОБЛЕМЫ, С КОТОРЫМИ Я ВСЕ ЕЩЕ СТОЛКНУЛСЯ
После изменения mpm_prefork_conf загрузка памяти снизилась, но сервер отвечает ошибкой 503 многим клиентам из-за параметра MaxRequestWorkers. Я попытался выяснить, почему каждый процесс apache использует 315 МБ ОЗУ, искал 2 дня и не смог найти правильного пути для дальнейшего устранения этой проблемы. В итоге я написал это здесь. У меня теперь два варианта.
-
Оптимизировать лимит среднего процесса apache и увеличить лимит MaxRequestWorkers.
-
Увеличить ОЗУ и обслуживать клиентов с тем же средним размером процесса, что, я думаю, не будет правильным выбором.
Пожалуйста, направьте меня, дайте правильные рекомендации, как я могу определить и уменьшить средний размер процесса apache с php. Пожалуйста, только честные ответы.
Я думаю, вы не сможете сделать гораздо лучше, я бы выбрал использование php-fpm, тогда нагрузка на нединамический контент будет гораздо быстрее и с меньшим потреблением памяти, я нашел это руководство (digitalocean.com), которое дает хорошие рекомендации.
Одну вещь, которую вы могли бы проверить, это изменить время keepalive в apache, посмотрите здесь
Это довольно много памяти на каждый процесс apache. А Ubuntu 14.0.4 была снята с поддержки в 2019 году.
Кричащая вещь в вашей конфигурации:
KeepAliveTimeout 5
Измените это на 1. Вы обнаружите, что как минимум половина ваших активных процессов в настоящее время ничего не делает, ожидая истечения времени keepalive.
Начните анализировать свой трафик – убедитесь, что весь ваш статический контент кэшируется.
Просмотрите свою конфигурацию apache – убедитесь, что вы не загружаете модули, которые не используете.
Убедитесь, что вы установили временную зону по умолчанию для PHP и ваши скрипты не отключают отчет об ошибках. Проверьте ваши журналы ошибок и устраните ошибки. Попробуйте настроить listenBacklog в Apache.
MaxConnectionsPerChild 8
Зачем? Это очень низкое значение. Apache, как правило, очень стабилен. Вы можете увеличить это значение до 100, чтобы сократить количество раз, когда Apache нужно разветвляться, и таким образом увеличить производительность. Если изменение этого значения влияет на уровень ошибок приложения, проверьте, не используете ли вы неправильно сконструированные постоянные подключения к базе данных. Если это влияет на использование памяти, убедитесь, что ваши патчи обновлены.
.
Ответ или решение
Чтобы эффективно уменьшить использование памяти Apache и средний размер процессов на вашем сервере, вы можете воспользоваться различными стратегиями оптимизации, начиная с вашего текущего конфигурационного окружения. Давайте разберем каждый аспект более детально, опираясь на предоставленную вами информацию.
Общая картина
Вы используете сервер Linux на базе Ubuntu 14.04 с 15 ГБ оперативной памяти и мощностью CPU в 8 ядер. Ваш сервер обслуживает приложение на PHP, база данных которого находится на RDS. На пиковых нагрузках доходит до 200 одновременных запросов, что приводит к 100% загрузке памяти и возникновению ошибок.
Конфигурация Apache
Сейчас у вас настроен MPM Prefork, который может быть подходящим решением для использования с mod_php. Однако, он также имеет ограничения, особенно если учесть текущий средний размер процесса в 314 МБ. Основной акцент будет на снижении этого показателя и увеличении количества обрабатываемых запросов без увеличения объема оперативной памяти.
Проблемы и предложения:
-
KeepAliveTimeout: Установите значение 1. Это поможет сократить время, которое процесс простаивает в ожидании, снижая тем самым потребление ресурсов во время простоя.
-
MaxConnectionsPerChild: Ваше текущее значение слишком низкое — увеличьте его до 100 или даже больше. Это снизит количество вилок Apache и стабилизирует работу сервера.
-
Модули Apache: Проверьте и отключите ненужные модули, чтобы снизить потребление памяти.
-
Кэширование и статический контент: Обеспечьте кэширование статического контента. Это уменьшит нагрузку на сервер Apache, так как снизит количество запросов на обработку сервером.
-
PHP оптимизация: Используйте php-fpm вместо mod_php, если это возможно, для снижения нагрузки на Apache. Проверьте настройки php.ini, особенно
memory_limit
, чтобы каждая PHP-скрипт не потребляла больше памяти, чем необходимо.
Альтернативные конфигурации
Рассмотрите переход на более актуальные версии Ubuntu и Apache для повышения стабильности и безопасности.
Технические рекомендации
Сделайте анализ трафика, чтобы понимать, какие запросы требуют наибольшей обработки и оптимизируйте их. Особенно важно проверить наличие каких-либо утечек памяти в коде PHP. Убедитесь, что все отчеты об ошибках включены для своевременного выявления проблем.
Заключение
Понимание потребления памяти — это ключ к оптимизации. Вместо увеличения оперативной памяти попробуйте снизить нагрузку и распределить ее более эффективно, используя вышеизложенные советы. Применение этих стратегий должно помочь в долгосрочной перспективе управлять нагрузкой на сервер без увеличения аппаратной мощности.
Эти шаги не только снизят средний размер процессов, но и улучшат общую производительность системы.