Уменьшение использования памяти Apache и среднего размера процесса

Уменьшение использования памяти Apache и среднего размера процесса

Я знаю, что вопрос получился немного длинным, но я решил описать каждый аспект, который я наблюдал со своей стороны.

Я использую сервер Linux, используемая ОС — Ubuntu 14.04, все остальные конфигурации определены ниже. Этот веб-сервер используется для обслуживания приложений, созданных на PHP, база данных размещена на RDS. В среднем в часы пик на сервере выполняется около 200 одновременных запросов, что приводит к 100% использованию памяти. Из-за этого приложение работает очень медленно или иногда отвечает с ошибкой. Поэтому я выполнил несколько шагов, чтобы решить эту проблему, которые я перечислил ниже, и попытался настроить Apache и ограничить его для странных ситуаций.

Операционные системы

ИМЯ="Ubuntu" ВЕРСИЯ="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 ИСПОЛЬЗУЕТСЯ: предварительная вилка

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 ИСПОЛЬЗУЕТСЯ: предварительная вилка

Измененный 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 = Вкл

НОВЫЙ
output_buffering = 4096
max_execution_time = 60
memory_limit = 64M
log_errors = On

ПРОБЛЕМЫ, С КОТОРЫМИ Я ВСЕ ЕЩЕ СТАЛКИВАЮСЬ

После изменения mpm_prefork_conf использование памяти снизилось, но сервер отвечает многим клиентам ошибкой 503 из-за параметра MaxRequestWorkers. Я пытался выяснить, почему каждый мой процесс Apache использует 315 МБ ОЗУ, я гуглил около 2 дней и не смог найти правильный путь для дальнейшего устранения этой неполадки. Так что, наконец, я опубликовал это здесь. Теперь у меня есть два варианта.

  1. Оптимизировать средний лимит процессов Apache и увеличить лимит MaxRequestWorkers.

  2. Увеличить объем оперативной памяти и обслуживать клиентов с тем же средним размером процесса, я думаю, было бы неправильным выбором.

Пожалуйста, дайте мне правильные рекомендации, как я могу определить и уменьшить средний размер процесса apache с php. Пожалуйста, только подлинные ответы.

решение1

Я не думаю, что можно сделать что-то лучше этого. Я бы выбрал путь использования php-fpm, тогда загрузка нединамического контента будет происходить намного быстрее и потреблять меньше памяти. Я обнаружил, что эторуководство (digitalocean.com), который дает хорошие рекомендации. Вы можете проверить, как изменить время keepalive в apache, см.здесь

решение2

Это довольно много памяти на процесс Apache. А Ubuntu 14.0.4 была EOL в 2019 году.

Самое кричащее в конфигурации, которую вы опубликовали, это:

KeepAliveTimeout 5

Измените это значение на 1. Вы обнаружите, что по крайней мере половина ваших активных процессов в настоящее время ничего не делают, ожидая тайм-аута keepalive.

Начните анализировать свой трафик — убедитесь, что весь ваш статический контент можно кэшировать.

Проверьте конфигурацию Apache — убедитесь, что вы не загружаете модули, которые не используете.

Убедитесь, что вы установили время по умолчанию для PHP и ваши скрипты не отключают отчеты об ошибках. Проверьте журналы ошибок и очистите ошибки. Попробуйте настроить listenBacklog в Apache.

Макс. кол-во подключений на ребенка 8

Почему? Этооченьlow. Apache в целом очень стабилен. Вы должны иметь возможность увеличить это значение до 100, чтобы уменьшить количество раз, когда Apache должен разветвляться, и тем самым увеличить емкость. Если изменение этого значения влияет на частоту ошибок приложения, проверьте, нет ли у вас плохо закодированных постоянных подключений к базе данных. Если это влияет на использование памяти, убедитесь, что ваши исправления обновлены.

Связанный контент