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

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

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

Ответ 1

Возможно, связано с APC.

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

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

apc.mmap_file_mask=/tmp/apc.XXXXXX

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

apc.mmap_file_mask=/dev/zero

Для совместимого с POSIX модуля MMAP с общей памятью используйте:

apc.mmap_file_mask=/apc.shm.XXXXXX

Ответ 2

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

Если на сервере недостаточно памяти, используйте опцию filters, чтобы предотвратить кэширование менее часто используемых 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 ГБ. Count 64MB для установки Magento, 40MB для Wordpress с некоторыми плагинами.

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

Ответ 3

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

  • 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 очистить память для новых данных.

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

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

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

Ответ 4

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

Ответ 5

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

Поиск файла 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

Ответ 6

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

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

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

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

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

Включение apc.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);
}

Ответ 7

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

apc.shm_size = 64M

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

Ответ 8

Я получил сообщение об ошибке "Не удалось выделить память для пула" после переноса установки 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 или связаться с хостинг-провайдером?

Ответ 9

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

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

apc.shm_size = 128M

Ответ 10

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

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

Ответ 11

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

Ответ 12

в моей системе мне пришлось вставить 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 также прочитали комментарии Бокана, они были очень полезны