Неустранимая ошибка PHP: попытка выделить 47264368 байт

При запуске веб-сайта, размещенного на двух серверах приложений через балансировщик нагрузки, один сервер приложений внезапно перестал работать и завис. Из журнала доступа к другому серверу приложений было обнаружено 499 статусов, а также средняя нагрузка была высокой. Примерно через 20 минут он начал давать статус 200. А затем, когда другой сервер приложений полностью перезагрузился, он тоже начал нормально работать.

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

2019/11/03 12:43:19 [error] 26445#0: *30538354 FastCGI sent in stderr: "PHP message: PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 47264368 bytes) in /.........../sites/all/modules/contrib/memcache/dmemcache.inc on line 64" while reading response header from upstream, client: ............, server: .........., request: "................", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "...........", referrer: "..........."

Что мне нужно сделать, чтобы исправить проблему, чтобы она никогда не возникла в будущем?

0
задан 6 November 2019 в 23:58
2 ответа

В более широком смысле вы не можете выделить память внутри модуля memcache. Это говорит о том, что у вас есть один очень большой кешированный объект (~ 47 МБ, согласно сообщению об ошибке), который вы пытаетесь загрузить. На сервере с ограничением памяти в 256 МБ тратить почти 20% памяти на один объект не получится.

В Drupal это проявляется в нескольких формах: вам может потребоваться «преодолеть горб» и что 47 МБ являются промежуточным объектом, и в этом случае вы увидите, что простая загрузка страниц прошла успешно, а затем все, что зависит от этого. Объект размером 47 МБ завершается ошибкой до тех пор, пока один из них не завершится успешно, после чего все загрузки завершатся успешно. Или этот объект может быть агломеративным, и в этом случае вы увидите, что запросы начинаются нормально, а затем в тот же день начинаются сбои. Или объект может относиться к определенным частям сайта или даже к конкретной локализации. Это действительно трудно понять, и я считаю, что симптомы не всегда совпадают и могут даже показаться недетерминированными.

Для отладки вы можете начать с запроса memcache напрямую, чтобы узнать, что находится в кеше примерно такого размера, или включить подробное ведение журнала в модуле memcache, чтобы он сообщил вам, что он пытался GET, когда это не удалось. См. раздел «Журнал отладки» этой ссылки для получения подробной информации о том, как сделать последнее, по крайней мере, в D7. Вы также, вероятно, могли бы вывести какой-то дополнительный контекст из полной трассировки стека, если он у вас есть.

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

0
ответ дан 18 December 2019 в 20:40

Вам необходимо увеличить лимит памяти для каждого процесса PHP в вашем файле php.ini . Кажется, сейчас он установлен на 256 МБ. Не забудьте перезагрузить веб-сервер после внесения изменений.

memory_limit = 512M
0
ответ дан 5 December 2019 в 00:03

Теги

Похожие вопросы