APC 不断崩溃

APC 不断崩溃

我们运行的是 PHP 5.3.8 和 APC 3.1.9,并且使用操作码缓存和用户缓存。目前,当缓存大小增加时,我们经常会遇到崩溃。这看起来像是 APC 中的某种内存泄漏,因为缓存文件和缓存变量中的值大小加起来不等于总缓存大小。总缓存大小要大得多,比如 1GB,而这些值加起来大约有 400MB。

消息日志显示的内容如下:
12 月 19 日 10:17:54 quarto 内核:pid 97940 (httpd),uid 1004:因信号 11 退出(核心转储)

因此我使用 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  

zend_hash.c 中的行号 (983) 对应于一个操作 (p = ht->arBuckets[nIndex];),其中它处理哈希表中显然不再存在的键。这或多或少支持了我的理论,即某处存在内存泄漏,其中 apc 缓存充满了非法信息...

有人有线索吗?

答案1

在将每个 apc_store 调用切换为 apc_add 后,“僵尸”内存问题就消失了。可能与 apc_fetch 和 apc_store 的竞争条件有关,正如在http://notmysock.org/blog/php/user-cache-timebomb.html

建议改用 apc_add,尤其是这些调用是用户生成的。

答案2

我们在这里看到了同样的问题,即随机内存泄漏,在这种情况下,根据你提供的信息,我会提出一个漏洞从那里您可以选择等待修复,自己修复代码或解决它。

还要注意的是,我只看到这种情况发生在使用 USER 缓存而不是操作码时,我在这里通过使用 memcache 来抵消这种情况(如果使用 Zend 框架,更改应用程序相当容易)。

相关内容