Что вызывает «Невозможно выделить память для пула» в PHP?

Я иногда сталкивался с лимитом распределения памяти сервера, особенно с раздутым приложением, таким как WordPress, но никогда не сталкивался с «Невозможно выделить память для пула» и имел проблемы с отслеживанием любой информации.

Кто-нибудь знает что это значит? Я попытался увеличить memory_limit без успеха. Я также не внес существенных изменений в приложение. Однажды не было никаких проблем, на следующий день я попал в эту ошибку.

Related of "Что вызывает «Невозможно выделить память для пула» в PHP?"

Вероятно, это связано с APC.

Для людей, имеющих эту проблему, укажите параметры .ini. В частности, ваш параметр apc.mmap_file_mask.

Для файлового файла mmap он должен быть установлен примерно так:

 apc.mmap_file_mask=/tmp/apc.XXXXXX 

Для mmap непосредственно из / dev / zero используйте:

 apc.mmap_file_mask=/dev/zero 

Для mmap, совместимого с POSIX-совместимой памятью, используйте:

 apc.mmap_file_mask=/apc.shm.XXXXXX 

Использование TTL 0 означает, что APC очистит весь кеш, когда закончится нехватка памяти. Ошибка больше не появляется, но делает APC намного менее эффективной. Это не риск, без проблем, «я не хочу делать свою работу». APC не предназначен для использования таким образом. Вы должны выбрать TTL достаточно высоко, чтобы страницы с наиболее доступным доступом не заканчивались. Лучше всего дать достаточно памяти, поэтому APC не нужно очищать кеш.

Просто прочитайте руководство, чтобы понять, как используется ttl: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

Решение заключается в увеличении объема памяти, выделенной для APC. Сделайте это, увеличив apc.shm_size.

Если APC скомпилирована для использования общей сегментной памяти, вы будете ограничены вашей операционной системой. Введите эту команду, чтобы увидеть системный предел для каждого сегмента:

 sysctl -a | grep -E "shmall|shmmax" 

Чтобы выделить больше памяти, вам придется увеличить количество сегментов с параметром apc.shm_segments.

Если APC использует память mmap, у вас нет предела. Объем памяти по-прежнему определяется той же опцией apc.shm_size.

Если на сервере недостаточно памяти, используйте параметр «Фильтры» для предотвращения кэширования менее часто используемых php-файлов.

Но никогда не используйте TTL 0.

Как сказали c33s, используйте apc.php, чтобы проверить вашу конфигурацию. Скопируйте файл из пакета apc в веб-папку и браузер точки. Вы увидите, что действительно выделено и как оно используется. Графики должны оставаться стабильными в течение нескольких часов, если они полностью меняются при каждом обновлении, то это означает, что ваша установка неверна (APC очищает все). Выделите на 20% больше бара, чем то, что APC действительно использует в качестве запаса безопасности, и проверяйте его на регулярной основе.

По умолчанию разрешение только 32 МБ смехотворно низкое. PHP был спроектирован, когда серверы были 64 МБ, и большинство сценариев использовали один файл php на страницу. В настоящее время решения, такие как Magento, требуют более 10 тыс. Файлов (~ 60 МБ в APC). Вы должны позволить достаточно памяти, поэтому большинство файлов php всегда кэшируются. Это не пустая трата, более эффективно поддерживать код операции в ram, а не иметь соответствующий raw php в кеше файлов. В настоящее время мы можем найти выделенные серверы с объемом памяти 24 ГБ на уровне 80 долл. США в месяц, поэтому не стесняйтесь разрешать несколько ГБ для APC. Я поставил 2 ГБ из 24 ГБ на сервер, на котором размещены магазины 5Magento и ~ 40 веб-сайтов для WordPress, APC использует 1,2 ГБ. Количество 64MB для установки Magento, 40MB для WordPress с некоторыми плагинами.

Кроме того, если у вас есть сайты разработки на одном сервере. Исключите их из кеша.

решение для меня:

  • apc.ttl = 0
  • apc.shm_size = что угодно

начать редактирование

предупреждение!

@bokan указал мне, что я должен добавить предупреждение здесь.

если у вас есть ttl из 0, это означает, что каждый кешированный элемент можно немедленно очистить. поэтому, если у вас небольшой размер кеша, такой как 2mb и ttl из 0, это сделает apc бесполезным, потому что данные в кеше всегда будут перезаписаны.

опускание ttl означает только то, что кеш не может заполниться, только с элементами, которые нельзя заменить.

поэтому вам нужно выбрать хороший баланс между ttl и размером кеша.

в моем случае у меня был размер кеша 1 гб, поэтому мне было более чем достаточно.

редактировать конец

имел такую ​​же проблему на centos 5 с php 5.2.17 и заметил, что если размер кеша мал, а параметр ttl является «высоким» (например, 7200), в то время как много файлов php для кеширования, то кеш заполняется довольно быстро и apc не находит ничего, что можно удалить, потому что все файлы в кеше по-прежнему вписываются в ttl.

увеличение объема памяти – это лишь часть решения, вы все равно выполняете эту ошибку, если кеш заполняется, и все файлы находятся в пределах ttl.

поэтому мое решение состояло в том, чтобы установить ttl в 0, поэтому apc заполняет кеш, и всегда есть возможность для apc очистить память для новых данных.

надеюсь, это поможет

edit: см. также: http://pecl.php.net/bugs/bug.php?id=16966

скачать http://pecl.php.net/get/APC извлечь и запустить apc.php, там у вас есть хорошая диаграмма, как выглядит ваше использование кеша

Запуск сценария apc.php является ключом к пониманию вашей проблемы, IMO. Это помогло нам правильно настроить наш кеш и на данный момент, похоже, решило проблему.

Для новичков, подобных мне, эти ресурсы помогли:

Поиск файла apc.ini для внесения изменений, рекомендованных c33s выше, и установка рекомендуемых количеств: http://www.untwistedvortex.com/optimizing-tuning-apc-alternate-php-cache/

Понимание того, что apc.ttl: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

Понимание того, что apc.shm_size: http://www.php.net/manual/en/apc.configuration.php#ini.apc.shm-size

Как отметил Бокан, вы можете использовать память, если она доступна, и он прав на то, как счетчик производительности TTL равен 0.

NotE: Вот как я исправил эту ошибку для моей конкретной проблемы. Это общая проблема, которая может быть вызвана распределением вещей, поэтому следуйте ниже, если вы получите ошибку, и вы думаете, что ее вызвали дублирование файлов PHP, загружаемых в APC.

Проблема, с которой я столкнулась, заключалась в том, что я выпустил новую версию своего PHP-приложения. Т.е. заменить все мои .php-файлы новыми APC будет загружать обе версии в кеш.

Поскольку у меня не хватило памяти для двух версий файлов php, у APC закончилась бы нехватка памяти.

Существует опция apc.stat, чтобы сообщить APC, чтобы проверить, изменился ли какой-то конкретный файл и если он его заменит, обычно это нормально для разработки, потому что вы постоянно вносите изменения, но при его производстве обычно отключается, как это было в моем case – http://www.php.net/manual/en/apc.configuration.php#ini.apc.stat

Превращение apc.stat на исправление этой проблемы, если вы в порядке с хитом производительности.

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

 define('PROJECT_VERSION', '0.28'); if(apc_exists('MY_APP_VERSION') ){ if(apc_fetch('MY_APP_VERSION') != PROJECT_VERSION){ apc_clear_cache(); apc_store ('MY_APP_VERSION', PROJECT_VERSION); header('Location: ' . 'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']); exit; } }else{ apc_store ('MY_APP_VERSION', PROJECT_VERSION); } 

Глядя на интернаты, может быть множество причин. В моем случае все остальное по умолчанию, кроме …

 apc.shm_size = 64M 

… очистил бесчисленные предупреждения, которые я получал раньше.

Я получил сообщение об ошибке «Не удалось выделить память для пула» после переноса установки OpenCart на другой сервер. Я также попытался поднять memory_limit.

Ошибка была остановлена ​​после того, как я изменил разрешения файла в сообщении об ошибке, чтобы получить доступ к записи пользователем, который выполняется apache (apache, www-data и т. Д.). Вместо того, чтобы напрямую изменять / etc / group (или chmod-ing файлы до 0777), я использовал usermod:

 usermod -a -G vhost-user-group apache-user 

Затем мне пришлось перезапустить apache, чтобы изменения вступили в силу:

 apachectl restart 

Или

 sudo /etc/init.d/httpd restart 

Или независимо от того, что ваша система использует для перезапуска apache.

Если сайт находится на общедоступном хостинге, возможно, вы должны изменить права доступа к файлу с помощью программы FTP или связаться с хостинг-провайдером?

Это работало для наших ребят (запустив множество сайтов WordPress на одном сервере).

Изменены параметры памяти в файле /etc/php.d/apc.ini. Он был установлен на 64M, поэтому мы удвоили его до 128M.

apc.shm_size = 128M

Контролируйте размер кеш-файлов (вы можете использовать apc.php из пакета apc pecl) и увеличить apc.shm_size в соответствии с вашими потребностями.

Это решает проблему.

Чтобы решить эту проблему, установите значение для apc.shm_size как целое. Найдите файл apc.ini (в моем файле файла apc.ini в файле /etc/php5/conf.d/apc.ini) и установите: apc.shm_size = 1000

в моей системе мне пришлось вставить apc.shm_size = 64M в /usr/local/etc/php.ini (FreeBSD 9.1), тогда, когда я посмотрел apc.php (который я скопировал из / usr / local / share / doc / APC /apc.php в / usr / local / www / apache24 / data), я обнаружил, что размер кеша увеличился с 32M до 64M по умолчанию, и я больше не получал большой кеш-счет

ссылки: http://au1.php.net/manual/en/apc.configuration.php также читали комментарии Бокана, они были очень полезны