【案例】小心,apc可能导致php-fpm罢工!

简介:

最近访问网站,发现出现了502错误。一般出现502错误,都是php-fpm 进程处理请求时出现异常导致的。
首先,查看了php-fpm 的进程数。发现php-fpm的进程数已经到达了php-fpm.conf中设置的最大值。最近流量没有大的变动,这么多php-fpm进程,肯定有问题。

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

[hailong.xhl@s010002.cm8 ~]$ sudo pstack 11740
Thread 3 (Thread 0x413bb940 (LWP 11741)):
#0  0x0000003cf92d4018 in epoll_wait () from /lib64/libc.so.6
#1  0x00007f4a0ffec116 in epoll_poll ()
#2  0x00007f4a0ffea81d in ez_run () from /home/opt/easy/lib/libeasy.so.0
#3  0x00007f4a0ffe5b63 in easy_io_on_thread_start ()
#4  0x0000003cf9e064a7 in start_thread () from /lib64/libpthread.so.0
#5  0x0000003cf92d3c2d in clone () from /lib64/libc.so.6
Thread 2 (Thread 0x425a2940 (LWP 11742)):
#0  0x0000003cf92d4018 in epoll_wait () from /lib64/libc.so.6
#1  0x00007f4a0ffec116 in epoll_poll ()
#2  0x00007f4a0ffea81d in ez_run () from /home/opt/easy/lib/libeasy.so.0
#3  0x00007f4a0fff1772 in easy_baseth_on_start ()
#4  0x0000003cf9e064a7 in start_thread () from /lib64/libpthread.so.0
#5  0x0000003cf92d3c2d in clone () from /lib64/libc.so.6
Thread 1 (Thread 0x7f4a17438710 (LWP 11740)):
#0  0x0000003cf9e0d174 in __lll_lock_wait () from /lib64/libpthread.so.0
#1  0x0000003cf9e08aca in _L_lock_1034 () from /lib64/libpthread.so.0
#2  0x0000003cf9e0898c in pthread_mutex_lock () from /lib64/libpthread.so.0
#3  0x00007f4a135eeb19 in apc_pthreadmutex_lock ()
#4  0x00007f4a135e7fb8 in apc_cache_find_slot ()
#5  0x00007f4a135e8323 in apc_cache_find ()
#6  0x00007f4a135edd27 in my_compile_file ()
#7  0x000000000050c651 in phar_compile_file ()
#8  0x00000000006185ec in zend_execute_scripts ()
#9  0x00000000005c778d in php_execute_script ()
#10 0x00000000006a592d in main ()

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

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

[hailong.xhl@s010002.cm8 ~]$ sudo gdb -p 26748
(gdb) thread 2
(gdb) bt
#0  0x0000003cf9e0d174 in __lll_lock_wait () from /lib64/libpthread.so.0
#1  0x0000003cf9e08aca in _L_lock_1034 () from /lib64/libpthread.so.0
#2  0x0000003cf9e0898c in pthread_mutex_lock () from /lib64/libpthread.so.0
#3  0x00007f4a135eeb19 in apc_pthreadmutex_lock (lock=0x7f4a0446e088) at /home/APC-3.1.9/apc_pthreadmutex.c:72
#4  0x00007f4a135e7fb8 in apc_cache_find_slot (cache=0x27fc100, key=
       {data = { file = {device = 43379392, inode = 48}, user = {identifier = 0x295eac0 "/home/wanke/wanke_htdocs/openapi/index.php" , identifier_len = 48}, fpfile = {fullpath = 0x295eac0 "/home/wanke/wanke_htdocs/openapi/index.php" , fullpath_len = 48}}, h = 5063011506047779259, mtime = 1392709731, type = 3 '\003' , md5 = "\002\000\000\000\000\000\000\032*'\000\000" }, t=1392709731) at /home/APC-3 .1.9 /apc_cache .c:640
#5  0x00007f4a135e8323 in apc_cache_find (cache=0x7f4a0446e088, key=
       {data = { file = {device = 43379392, inode = 48}, user = {identifier = 0x295eac0 "/home/htdocs/openapi/index.php" , identifier_len = 48}, fpfile = {fullpath = 0x295eac0 "/home/htdocs/openapi/index.php" , fullpath_len = 48}}, h = 5063011506047779259, mtime = 1392709731, type = 3 '\003' , md5 = "\002\000\000\000\000\000\000\032*'\000\000" }, t=0) at /home/APC-3 .1.9 /apc_cache .c:695
#6  0x00007f4a135edd27 in my_compile_file (h=0x7fffe1896080, type=8) at /home/APC-3.1.9/apc_main.c:529
#7  0x000000000050c651 in phar_compile_file ()
#8  0x00000000006185ec in zend_execute_scripts ()
#9  0x00000000005c778d in php_execute_script ()
#10 0x00000000006a592d in main ()
(gdb) print (pthread_mutex_t *) 0x7f4a0446e088
$1 = (union {...} *) 0x7f4a0446e088
(gdb) print $1.__data.__owner
$11 = 11274
(gdb)

那么为啥11274进程一直占用互斥锁权限,不释放呢?最终发现这个进程已经退出了。11274的进程为啥会退出呢?在php-fpm 的日志中找到了答案。
[18-Feb-2014 15:48:45] NOTICE: [pool www] child 11274 started
[18-Feb-2014 15:48:45] WARNING: [pool www] child 11274 exited on signal 11 (SIGSEGV) after 0.089068 seconds from start
显然,11274进程运行过程中遇到了段错误,导致进程异常退出了。继续追查,发现是php的hsf扩展在启动初始化的时候遇到内存问题,导致段错误。

现在原因已经很明确了,是因为php扩展hsf启动的时候发生内存错误,导致php-fpm进程异常退出。退出的进程当时拥有apc的互斥锁。但是退出时,由于是异常退出,没能释放互斥锁。导致php-fpm其他进程无法获取apc的互斥锁。导致死锁。

那么如何解决呢?
1.与惠新宸(apc维护者之一)沟通,他建议不要再使用apc,建议换成opcache。因为apc已经基本不再维护。之前也做过opcache和apc的对比。可以看下这篇文章。
php的 zend opcache VS apc 性能比较
2.hsf相关的问题,已经提交相关开发人员去完善。
3.如果你对apc情有独钟,不离不弃。那建议看看下面的文章,自己尝试修改下源码修复这个问题。

https://bugs.php.net/bug.php?id=46025

https://bugs.php.net/patch-display.php?bug_id=59281&patch=APC-3.1.9-bailout_deadlock.patch&revision=latest










本文转自 小强测试帮 51CTO博客,原文链接:http://blog.51cto.com/xqtesting/1685267,如需转载请自行联系原作者
相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
3天前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
47 25
|
2月前
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效交互:从基础到实践####
本文深入探讨了PHP与MySQL数据库之间的高效交互技术,涵盖了从基础连接到高级查询优化的全过程。不同于传统的摘要概述,这里我们直接以一段精简代码示例作为引子,展示如何在PHP中实现与MySQL的快速连接与简单查询,随后文章将围绕这一核心,逐步展开详细讲解,旨在为读者提供一个从入门到精通的实战指南。 ```php <?php // 数据库配置信息 $servername = "localhost"; $username = "root"; $password = "password"; $dbname = "test_db"; // 创建连接 $conn = new mysqli($se
73 0
|
2月前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发:从基础到实践####
本文将深入探讨PHP与MySQL的结合使用,展示如何构建一个动态网站。通过一系列实例和代码片段,我们将逐步了解数据库连接、数据操作、用户输入处理及安全防护等关键技术点。无论您是初学者还是有经验的开发者,都能从中获益匪浅。 ####
|
2月前
|
关系型数据库 MySQL PHP
php实现一个简单的MySQL分页
通过本文的详细步骤和代码示例,我们实现了一个简单的PHP MySQL分页功能。主要步骤包括计算总记录数、设置分页参数、查询当前页的数据以及生成分页链接。这种分页方式适用于大多数Web应用,能够有效提升用户体验和页面响应速度。
70 4
|
3月前
|
关系型数据库 MySQL PHP
PHP与MySQL的深度整合:构建高效动态网站####
在当今这个数据驱动的时代,掌握如何高效地从数据库中检索和操作数据是至关重要的。本文将深入探讨PHP与MySQL的深度整合方法,揭示它们如何协同工作以优化数据处理流程,提升网站性能和用户体验。我们将通过实例分析、技巧分享和最佳实践指导,帮助你构建出既高效又可靠的动态网站。无论你是初学者还是有经验的开发者,都能从中获得宝贵的见解和实用的技能。 ####
38 0
|
3月前
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效协同开发策略####
本文深入探讨了PHP与MySQL在Web开发中的协同工作机制,通过优化配置、最佳实践和高级技巧,展示了如何提升数据库交互性能,确保数据安全,并促进代码可维护性。我们将从环境搭建讲起,逐步深入到查询优化、事务管理、安全防护及性能调优等核心环节,为开发者提供一套实战驱动的解决方案框架。 ####
|
3月前
|
安全 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
——深入探索LAMP栈下的高效数据交互与处理技巧 ####
|
3月前
|
关系型数据库 MySQL PHP
PHP与MySQL的无缝集成:构建动态网站的艺术####
本文将深入探讨PHP与MySQL如何携手合作,为开发者提供一套强大的工具集,以构建高效、动态且用户友好的网站。不同于传统的摘要概述,本文将以一个生动的案例引入,逐步揭示两者结合的魅力所在,最终展示如何通过简单几步实现数据驱动的Web应用开发。 ####
|
3月前
|
关系型数据库 MySQL PHP
PHP与MySQL动态网站开发实战指南####
深入探索PHP与MySQL的协同工作机制,本文旨在通过一系列实战案例,揭示构建高效、稳定且用户友好的动态网站的秘诀。从环境搭建到数据交互,再到最佳实践分享,本文为开发者提供了一条清晰的学习路径,助力其在LAMP(Linux, Apache, MySQL, PHP/Perl/Python)栈上实现技术飞跃。 ####

热门文章

最新文章