php缓存模块apc可能导致php-fpm终止

如果你的网站出现502错误。同时你网站中又使用了apc模块来做缓存处理。那么这篇文章兴许能帮到你。


首先,查看了php-fpm 的进程数。

发现php-fpm的进程数已经到达了php-fpm.conf中设置的最大值。

发现很多php-fpm进程,肯定有问题。

​然后,用pstack命令查看这些php-fpm进程都在干啥。

sudo pstack pid

 由堆栈信息我们可以肯定php的apc模块申请互斥锁权限时,一直获取不到互斥锁权限,一直等待,导致卡死了。

接下来,我们查下,是什么导致apc模块一直拿不到互斥锁权限。我们使用gdb排查,最终查出互斥锁的权限被进程号11274的进程占用着

那么为啥11274进程一直占用互斥锁权限,不释放呢?最终发现这个进程已经退出了。11274的进程为啥会退出呢?在php-fpm 的日志中找到了答案。

NOTICE: [pool www] child 11274 started
WARNING: [pool www] child 11274 exited on signal 11 (SIGSEGV) after 0.089068 seconds from start

  

此进程运行过程中遇到了段错误,导致进程异常退出了。

然后发现是php的hsf扩展在启动初始化的时候遇到内存问题,导致段错误。

 

罪魁祸首:

因为php扩展hsf启动的时候发生内存错误

导致php-fpm进程异常退出。

退出的进程当时拥有apc的互斥锁。

但是退出时,由于是异常退出,没能释放互斥锁。

导致php-fpm其他进程无法获取apc的互斥锁。导致死锁。

所以建议不再使用apc而采用opcache来做缓存。

 

posted @ 2017-11-08 18:40  黑默  阅读(537)  评论(1编辑  收藏  举报