Apache+MySQL服务器间歇性卡顿1-3分钟,PHP票务系统故障排查咨询
排查方向分析与建议
咱们先从你给出的核心现象入手:Apache状态页大量进程卡在**"W"(Sending Reply)**状态,同时phpMyAdmin无法连接数据库,但show full processlist没看到锁——这说明问题大概率出在PHP-FCGI与MySQL的交互链路,或者MySQL的隐性瓶颈上,而非Apache本身(毕竟状态页能正常访问)。下面分几个方向给你具体排查建议:
1. 深挖MySQL的隐性阻塞与性能瓶颈
虽然show full processlist没显示锁,但不代表没有其他问题:
- 故障触发时立刻抓取InnoDB状态:执行
SHOW ENGINE INNODB STATUS;,重点看TRANSACTIONS部分的事务等待、SEMAPHORES部分的资源竞争,以及缓冲池命中率、日志写入情况——很多时候间隙锁、元数据锁不会在processlist里直接显示,但InnoDB状态会暴露细节。 - 检查慢查询日志:确保MySQL的
slow_query_log是开启的,故障前后有没有突然出现大量慢查询,或者存在未提交的大事务(比如批量数据操作没及时commit/rollback)。 - 核实MySQL连接数上限:执行
SHOW GLOBAL STATUS LIKE 'Threads_connected';,对比你的max_connections配置(默认通常是150,和Apache的MaxRequestWorkers一致),如果连接数打满,会导致新连接无法建立(phpMyAdmin连不上就符合这个场景)。 - 检查连接超时配置:看看
wait_timeout和interactive_timeout的设置,如果过短可能导致连接被MySQL主动关闭,但PHP-FCGI还持有无效连接,引发后续请求阻塞。
2. 排查PHP-FCGI的运行状态
你用的是mod_fcgid,这部分的僵死或阻塞很容易导致Apache worker卡在"W"状态:
- 查看FCGI进程状态:故障时执行
ps aux | grep fcgid,观察有没有进程僵死、CPU/内存占用异常(比如某个进程CPU跑满或内存飙升)。 - 检查mod_fcgid专属日志:Apache错误日志没记录不代表FCGI没有,默认日志可能在
/var/log/apache2/fcgid_error.log(Debian系统),里面会有连接超时、进程崩溃、资源不足的详细信息。 - 调整FCGI超时参数:你的
FcgidBusyTimeout=3600和FcgidIOTimeout=600设置得偏大,如果PHP进程卡在等待MySQL响应,FCGI不会主动回收这些僵死进程,导致Apache worker一直处于等待状态。可以先尝试把这两个值调小(比如FcgidIOTimeout=120),看是否能缓解。
3. 服务器资源与网络排查
- 实时监控硬件资源:故障时用
top看CPU占用、iostat -x 1看磁盘IO(重点看%util是否接近100%)、free -m看内存是否不足——磁盘IO瓶颈是导致MySQL无响应的常见原因,比如大量随机读写拖慢了数据库。 - 检查网络连接状态:执行
netstat -anp | grep mysql,看有没有大量TIME_WAIT或ESTABLISHED连接,排查是否存在网络层面的阻塞(比如防火墙限制、端口耗尽)。 - 测试本地MySQL连接速度:故障时在Shell里执行
mysql -u[用户名] -p[密码] -e "SELECT 1;",看连接和查询是否延迟过高,确认是MySQL本身的问题还是网络/应用层的问题。
4. 应用代码层面排查
- 检查数据库连接管理:看看票务系统代码里有没有未关闭的数据库连接,或者长事务未处理(比如开启事务后忘记提交/回滚,导致锁资源一直被占用)。
- 排查定时任务:确认故障时段有没有定时任务运行(比如每周的报表生成、数据同步),这类任务往往会消耗大量数据库资源,引发阻塞。
- 查看PHP错误日志:PHP的错误日志(比如
/var/log/php5-fpm.log或/var/log/apache2/php_error.log)会记录数据库连接超时、查询错误等细节,这是Apache日志不会覆盖的部分。
需要补充的信息(如果排查后仍无法定位)
如果上面的方向没找到问题,建议提供以下信息:
- MySQL的
my.cnf关键配置(比如max_connections、innodb_buffer_pool_size、slow_query_log相关设置) - mod_fcgid的完整配置(比如
FcgidMaxProcesses、FcgidMaxProcessesPerClass) - 故障时段的MySQL慢查询日志片段
- 故障时段的服务器资源监控数据(CPU、磁盘IO、内存)
- PHP错误日志的相关记录
内容的提问来源于stack exchange,提问作者Stephan H.
相关产品推荐
相关产品推荐

