Что вызывает «Невозможно выделить память для пула» в PHP? - PullRequest
131 голосов
/ 16 сентября 2010

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

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

Ответы [ 12 ]

123 голосов
/ 27 августа 2012

Использование 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. 0. 1022 *

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

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

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

89 голосов
/ 16 сентября 2010

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

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

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

apc.mmap_file_mask=/tmp/apc.XXXXXX

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

apc.mmap_file_mask=/dev/zero

Для POSIX-совместимого mmap с поддержкой общей памяти используйте:

apc.mmap_file_mask=/apc.shm.XXXXXX
36 голосов
/ 14 февраля 2011

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

  • apc.ttl = 0
  • apc.shm_size = все, что вы хотите

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

Внимание!

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

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

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

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

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

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

имел ту же проблему на centos 5 с php 5.2.17 и заметил, что если размер кэша небольшой, а параметр ttl "высокий" (например, 7200), а имея много файлов php для кеширования, кеш заполняется довольно быстро и APC не находит ничего, что он может удалить, потому что все файлы в кеш все еще помещается в ттл.

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

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

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

редактирование: см. также: http://pecl.php.net/bugs/bug.php?id=16966

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

6 голосов
/ 05 декабря 2011

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

4 голосов
/ 12 ноября 2012

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

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

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

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

Существует опция apc.stat, которая сообщает APC, чтобы он проверял, изменился ли конкретный файл, и если это так, замените его, как правило, это нормально для разработки, поскольку вы постоянно вносите изменения, однако на производстве его обычно отключают, как это было раньше. с в моем случае - 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);
}
4 голосов
/ 28 апреля 2012

Новичкам, таким как я, помогли следующие ресурсы:

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

Понимание того, что.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

2 голосов
/ 11 марта 2014

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

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

apc.shm_size = 128M

1 голос
/ 26 мая 2014

в моей системе мне пришлось вставить 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) я обнаружил, что размер кеша увеличился с 32М до 64М по умолчанию, и я больше не получал полный счет кеша

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

1 голос
/ 01 марта 2014

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

1 голос
/ 07 октября 2013

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

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

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

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

apachectl restart

Или

sudo /etc/init.d/httpd restart

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

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

...