Что вызывает "Невозможно выделить память для пула" в PHP?
Я иногда сталкивался с пределом выделения памяти на сервере, особенно с раздутым приложением, таким как Wordpress, но никогда не сталкивался с "Невозможно выделить память для пула" и не мог отследить любую информацию.
Кто-нибудь знает что это значит? Я пытался увеличить memory_limit
безуспешно. Я также не внес каких-либо существенных изменений в приложение. Однажды проблем не было, на следующий день я столкнулся с этой ошибкой.
12 ответов
Для людей, имеющих эту проблему, пожалуйста, укажите свои настройки.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
Использование TTL 0 означает, что APC очистит весь кэш, когда ему не хватит памяти. Ошибка больше не появляется, но делает APC гораздо менее эффективным. Это не риск, не проблема, решение "Я не хочу делать свою работу". APC не предназначен для использования таким образом. Вы должны выбрать TTL достаточно высоко, чтобы срок доступа к наиболее посещаемым страницам не истек. Лучше всего выделить достаточно памяти, чтобы APC не нужно очищать кеш.
Просто прочитайте руководство, чтобы понять, как используется ttl: http://www.php.net/manual/en/apc.configuration.php
Решением является увеличение памяти, выделенной для 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 000 файлов (~60 МБ в APC). Вы должны выделить достаточно памяти, чтобы большинство файлов php всегда кэшировалось. Это не пустая трата времени, более эффективно хранить код операции в оперативной памяти, а не иметь соответствующий сырой php в файловом кеше. В настоящее время мы можем найти выделенные серверы с 24 ГБ памяти всего за 80 долларов в месяц, поэтому не стесняйтесь разрешить использование нескольких ГБ для APC. Я поместил 2 ГБ из 24 ГБ на сервер, на котором размещены магазины 5Magento, и ~40 сайтов WordPress, APC использует 1,2 ГБ. Считайте 64 МБ для установки Magento, 40 МБ для Wordpress с некоторыми плагинами.
Кроме того, если у вас есть веб-сайты разработки на одном сервере. Исключить их из кэша.
решение для меня:
- 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.
поэтому я решил установить ttl в 0, так что apc заполняет кеш, и у apc всегда есть возможность очистить память для новых данных.
надеюсь, это поможет
изменить: см. также: http://pecl.php.net/bugs/bug.php?id=16966
скачайте http://pecl.php.net/get/APC extract и запустите apc.php, там у вас есть хорошая диаграмма того, как выглядит использование вашего кэша
Запуск скрипта apc.php является ключом к пониманию вашей проблемы, IMO. Это помогло нам правильно определить размер кэша и на данный момент, похоже, решило проблему.
Как упомянул Бокан, вы можете увеличить объем памяти, если он доступен, и он прав, считая, что контрпроцессорным является установка TTL в 0.
Примечание: так я исправил эту ошибку для своей конкретной проблемы. Это общая проблема, которая может быть вызвана множеством вещей, поэтому следуйте приведенным ниже инструкциям только в том случае, если вы получили ошибку и думаете, что она вызвана дублированием файлов PHP, загружаемых в APC.
У меня возникла проблема, когда я выпустил новую версию своего PHP-приложения. Т.е. заменив все мои.php файлы на новые, APC загрузит обе версии в кеш.
Поскольку у меня не было достаточно памяти для двух версий php-файлов, APC не хватило бы памяти.
Существует опция apc.stat, которая сообщает APC, что нужно проверить, не изменился ли конкретный файл, и если это так, замените его, как правило, это нормально для разработки, потому что вы постоянно вносите изменения, однако на производстве его обычно отключают, как это было в моем case - http://www.php.net/manual/en/apc.configuration.php
Включение 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.ini для внесения изменений, рекомендованных c33s выше, и установка рекомендуемых сумм: http://www.untwistedvortex.com/optimizing-tuning-apc-alternate-php-cache/
Что такое apc.ttl: http://www.php.net/manual/en/apc.configuration.php
Понимание того, что такое apc.shm_size: http://www.php.net/manual/en/apc.configuration.php
Это сработало для наших парней (работает множество сайтов Wordpress на одном сервере).
Изменены настройки памяти в файле /etc/php.d/apc.ini. Он был установлен на 64M, поэтому мы удвоили его до 128M.
apc.shm_size = 128M
Чтобы решить эту проблему, установите значение 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 to /usr/local/www/apache24/data) я обнаружил, что размер кэша увеличился с 32М до 64М по умолчанию, и я больше не получал полный счетчик большого кэша
ссылки: http://au1.php.net/manual/en/apc.configuration.php также читайте комментарии Бокана, они были очень полезны
Я получил ошибку "Невозможно выделить память для пула" после перемещения установки 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 или связаться с поставщиком хостинга?
Глядя на интернет, могут быть разные причины. В моем случае, оставив все по умолчанию, кроме...
apc.shm_size = 64M
... очистил бесчисленные предупреждения, которые я получал раньше.
Следите за размером кэшированных файлов (вы можете использовать apc.php из пакета apc pecl) и увеличивайте apc.shm_size в соответствии с вашими потребностями.
Это решает проблему.