Назад | Перейти на главную страницу

APC продолжает вылетать

Мы запускаем PHP 5.3.8 с APC 3.1.9 и используем кеш опкодов, а также кеш пользователя. В настоящее время мы наблюдаем регулярные сбои при увеличении размера кеша. Похоже, какая-то утечка памяти в APC, потому что значения в кэшированных файлах и кэшированных переменных не складываются в общий размер кеша. Общий размер кеша намного больше, например, 1 ГБ, в то время как добавленные значения составляют примерно 400 МБ.

Вот что говорится в журнале сообщений:
19 декабря 10:17:54 ядро ​​кварто: pid 97940 (httpd), uid 1004: завершено по сигналу 11 (ядро выгружено)

Итак, я проверил coredump с помощью gdb:

(gdb) backtrace  
   #0  0x000000080202cc3c in zend_hash_index_find (ht=0x805251ef0, h=34490315800, pData=0x7fffffffc378) at      /usr/local/directadmin/custombuild/php-5.3.8/Zend/zend_hash.c:983  
   #1  0x0000000805132637 in my_copy_zval () from /usr/local/lib/php/extensions/no-debug-non-zts-20090626/apc.so  
   #2  0x00000008051322fb in my_copy_zval_ptr () from /usr/local/lib/php/extensions/no-debug-non-zts-20090626/apc.so  
  #3  0x0000000805133aea in my_copy_hashtable_ex () from /usr/local/lib/php/extensions/no-debug-non-zts-20090626/apc.so  

Номер строки (983) в zend_hash.c соответствует действию (p = ht-> arBuckets [nIndex];), где он обращается к ключу в хеш-таблице, которая, по-видимому, больше не существует. Это более или менее подтверждает мою теорию об утечке памяти где-то, когда кеш apc заполняется незаконной информацией ...

У кого-нибудь есть подсказка?

После переключения каждого вызова apc_store на apc_add проблема с «зомби» памятью исчезла. Вероятно, имеет какое-то отношение к состоянию гонки с apc_fetch и apc_store, как обсуждалось в http://notmysock.org/blog/php/user-cache-timebomb.html.

Вместо этого рекомендуется использовать apc_add, особенно эти вызовы генерируются пользователем.

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

Также следует отметить, что я видел это только при использовании кеша USER, а не кода операции, я компенсировал это здесь, используя вместо этого memcache (и при использовании инфраструктуры Zend изменение приложения довольно просто).