Назад | Перейти на главную страницу

mpm_prefork: ошибка Невозможно выделить память

Я использовал веб-сайт loadimpact, чтобы проверить, как мое приложение php будет работать при большом объеме доступа. Я провел один действительно небольшой тест с одновременным доступом только 50 виртуальных пользователей и заметил, что через некоторое время все запросы возвращали код состояния 502. Даже после завершения теста я больше не мог получить доступ к веб-сайту, также получая ошибку 502. Он вернулся в нормальное состояние после того, как я перезапустил сервер.

Я проверил логи сервера и увидел следующее сообщение:

[mpm_prefork:error] [pid 3189] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process

Я предполагаю, что это связано с нехваткой памяти на сервере, но я не уверен. Я также заметил, что загрузка ЦП сервера достигла пика в то же время.

Я провел тест еще два раза после перезапуска сервера, и он работал безупречно, ни ошибки памяти, ни ответа 502.

Мое приложение построено с использованием Laravel, и я использую AWS Elastic Beanstalk в качестве сервера aws и экземпляр RDS в качестве базы данных. Это экземпляр t2.micro. Единственная настраиваемая конфигурация, которая у меня есть, - это crontab, запускающий запланированную задачу в фоновом режиме.

При доступе к странице, которую я тестировал, я делаю в основном 3 вещи: я регистрирую доступ в базе данных, я устанавливаю файл cookie для отслеживания пользователей и загружаю некоторые данные из базы данных.

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

Кто-нибудь знает, что могло вызвать эту ошибку?

Это не решит вашу проблему как таковую, но поможет обойти ее.

Две замечательные особенности облачных вычислений - это эластичность и автоматизация. Эластичность означает, что если ваш сервер замедляется или выходит из строя, вы можете легко запустить другой сервер или еще 50 серверов. Автоматизация означает, что все это можно сделать без вашего прямого участия. AWS Elastic Beanstalk поддерживает оба из них.

Тебе надо включить балансировку нагрузки и автоматическое масштабирование и настроить проверку работоспособности. Таким образом, если ваш сервер начнет возвращать коды ошибок, он сможет направлять трафик на работоспособные серверы, останавливать отказавший сервер и создавать на его месте новый сервер. Если вам нужен 1 сервер для обслуживания вашей нагрузки, вам, вероятно, нужно оставить работающими 2 сервера, чтобы иметь надежную систему. Вы можете разместить эти серверы в разных зонах доступности, чтобы получить более надежную систему, в идеале с базой данных RDS с несколькими зонами доступности.

Посмотреть в top или ps aux вывод того, сколько памяти использует каждый процесс apache. Умножьте это на 50, чтобы примерно вычислить, сколько памяти вам понадобится для обслуживания 50 одновременных пользователей.

Использование MPM Apache worker или событий с PHP в качестве отдельного пула процессов CGI вместо MPM prefork с mod_php может помочь более эффективно использовать память.

Вы также можете уменьшить использование памяти, удалив модули Apache и расширения PHP. То, что вы делаете в коде PHP, также влияет на использование памяти, и вы можете использовать функции памяти в PHP, чтобы профилировать это.

В какой-то момент вам придется либо выбрать тип экземпляра с большим объемом оперативной памяти, либо распределить нагрузку на несколько экземпляров.

Это определенно ошибка нехватки памяти на вашем сервере. T2.micro довольно тесен для установки Apache / PHP под нагрузкой. Сколько «материала» читается из БД?

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