Що спричиняє "Неможливо виділити пам'ять для пулу" в PHP?


133

Іноді я стикаюся з обмеженням розміщення на пам'яті сервера, особливо з роздутим додатком, таким як Wordpress, але жодного разу не стикався з "Неможливо виділити пам'ять для пулу" і не було проблем з відстеженням будь-якої інформації.

Хтось знає, що це означає? Я намагався збільшити memory_limitбез успіху. Я також не вніс суттєвих змін у додаток. Одного разу проблеми не було, наступного дня я потрапив на цю помилку.

Відповіді:


90

Можливо, це пов'язано з 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

Дякую! Саме це посилання я шукав. Вдячний за допомогу!
jonathanatx

2
Я виявив, що ці зміни не вирішують проблему, оскільки коментарі до пов'язаної теми також документують ...
Jonathan Day

3
Більше інформації для цього параметра APC: php.net/apc.configuration#ini.apc.mmap-file-mask
mikeytown2

2
У моєму випадку мені довелося перейти з файлової копії на POSIX-сумісну, щоб позбутися помилки.
Аттіла Фулоп

4
Мені не вдається зрозуміти, як ця відповідь вирішує проблему. Чи трапляється помилка, коли значення file_maskне є одним із цих значень? Якщо у мене є одне з цих значень і я отримую помилку, чи потрібно мені переключити його на інше? Який?
Джефф

125

Використання 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.

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

За замовчуванням дозволяти лише 32 МБ смішно низько. PHP був розроблений, коли сервери були 64 Мб і більшість сценаріїв використовували один файл php на сторінку. На сьогодні такі рішення, як Magento, потребують понад 10 к файлів (~ 60 Мб в APC). Ви повинні забезпечити достатню кількість пам'яті, щоб більшість файлів PHP завжди були кешовані. Це не марно, ефективніше зберігати опкод в операційному режимі, а не мати відповідну сировину PHP у кеш-файлі. На сьогоднішній день ми можемо знайти спеціалізовані сервери з 24 Гб оперативної пам’яті на цілих 80 доларів на місяць, тому не соромтеся дозволити APC декількома ГБ. Я поставив 2 ГБ з 24 ГБ на сервер, що розміщує 5Magento магазинів та ~ 40 веб-сайт wordpress, APC використовує 1,2 ГБ. Порахуйте 64 Мб для установки Magento, 40 Мб для Wordpress з деякими плагінами.

Крім того, якщо у вас є веб-сайти для розробки на одному сервері. Виключіть їх із кешу.


2
Це! У мене працює Wordpress і 32M просто не вистачало. Підняли до 64М і тепер у чистоті. Перевірте людей apc.php!
Дейв Драгер

Хороша відповідь! +1 Дякую
Костанос

Щоб збільшити до 64М, вам потрібно додати apc.shm_size = 64, а не apc.shm_size = 64M (більшість прикладів, які я бачив, мав M наприкінці) Не працював у моїй версії apc (v3.1.3p1)
Патрік забудь

1
Ви припускаєте, що у вас буде багато кешованих файлів, які були в кеші довше, ніж TTL. c33s має важливий момент. Якщо ви нещодавно отримали доступ (скажімо, у вас є 70% кешу, до якого ви можете отримувати доступ весь час, як вам завгодно, і ви маєте великий сплеск, де відразу додаються всі зайві нечасті файли), ви отримаєте помилки кинуто протягом TTL секунд. Кеш заповнений, і ви сказали APC, що він не повинен очищати ці записи, щоб він скаржився. Якщо у вас TTL протягом 5 годин, ви закінчуєте 5 годин помилок, очікуючи закінчення терміну дії цих нечастотних файлів.
Метью Колб

@MatthewKolb: Ви не повинні дозволяти кешувати більше файлів, ніж APC може вмістити у своїй пам'яті. Використовуйте фільтри для запобігання нечастому доступу до файлів, які потрібно кешувати.
bokan

36

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

  • 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, там у вас є хороша схема, як виглядає ваше використання кешу


2
Дякую, це допомогло. Я отримував близько десятка помилок "Неможливо виділити пам'ять" за секунду. Я подвоїв розмір кешу (32 до 64 Мб) і знизив ttl до 0. Це повністю усунуло ці помилки.
nicktacular

1
Це було виправлено на наших серверах.
Джастін

1
Це, здавалося, вирішило проблему і для мене.
анізоптера

1
Використання ZWAMP, і це, здається, теж зробило трюк. Дякую.
WernerCD

10
Це не рішення! Помилка не зникає, але APC буде майже вимкнено. Він буде промивати весь кеш-пам'ять щоразу, коли пам'ять заповнена. Просто прочитайте інструкцію, яку нам подарував Brideau. php.net/manual/en/apc.configuration.php#ini.apc.ttl.
bokan

7

Запуск сценарію apc.php є ключовим для розуміння вашої проблеми, IMO. Це допомогло нам правильно розмістити кеш і на даний момент, здається, вирішило проблему.


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

4

Для новачків, як я, ці ресурси допомогли:

Пошук файлу 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 подібно до відключення APC.
bokan

4

Як згадував Бокан, ви можете збільшити об'єм пам'яті, якщо вона є, і він правий на те, наскільки протилежне встановлення TTL до 0.

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

Проблема, з якою у мене виникло, коли я випустив нову версію моєї програми 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);
}

2

Це працювало для наших хлопців (запускаючи низку сайтів Wordpress на одному сервері).

Змінено налаштування пам'яті у файлі /etc/php.d/apc.ini. Він був встановлений на 64M, тому ми подвоїли його до 128M.

apc.shm_size = 128М


1

Дивлячись на інтернети, можуть бути різні причини. У моєму випадку залишити все за замовчуванням, крім ...

apc.shm_size = 64M

... очистив незліченні попередження, які я отримував раніше.


1

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


1

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


1

у моїй системі мені довелося вставити 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 також читали коментарі Бокана, вони були дуже корисними


0

Контролюйте розмір кешованих файлів (ви можете використовувати apc.php з пакету apc pecl) та збільште розмір apc.shm_size відповідно до ваших потреб.

Це вирішує проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.