Что вызывает "не удается выделить память для пула" в PHP?


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

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

12 128

12 ответов:

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

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

для файла с поддержкой mmap, он должен быть установлен на что-то вроде:

apc.mmap_file_mask=/tmp/apc.XXXXXX

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

apc.mmap_file_mask=/dev/zero

для 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. Сделать это за счет увеличения БТР.shm_size.

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

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

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

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

Если на сервере недостаточно памяти, используйте опцию filters, чтобы предотвратить кэширование менее часто используемых файлов php.

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

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

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

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

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

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

edit start

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

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

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

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

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

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

изменить конец

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

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

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

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

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

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

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

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

найти БТР.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.

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

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

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

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

поворачивая БТР.stat on исправит эту проблему, если вы в порядке с хитом производительности.

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

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-файл. Он был установлен на 64 м, поэтому мы удвоили его до 128 м.

apc.shm_size=128M

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

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

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

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

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