如果你的网站出现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来做缓存。