Apache/PHP 进程在与 MySQL 交互时挂起

Posted

技术标签:

【中文标题】Apache/PHP 进程在与 MySQL 交互时挂起【英文标题】:Apache/PHP processes hanging while interacting with MySQL 【发布时间】:2011-01-15 08:53:24 【问题描述】:

我们看到一些奇怪的行为,我们不确定这是否是 apache、phpmysql 或操作系统的问题,所以请转向 *** 的大脑!

我们让 Apache 和 mod_php 与 mysql5 服务器通信。有时,进程会选择挂起,试图从文件描述符中读取。

在其中一个上启动 strace(所有挂起的过程都显示相同的结果)给出了这个:

[root@prweb133v ~]# strace -p 8450
Process 8450 attached - interrupt to quit
read(57,  <unfinished ...>

那么它想读什么?

[root@prweb133v ~]# lsof -p 8450
...
...
httpd   8450 apache   57u  IPv4    5546599             TCP
prweb133v.local:36615->hadat.local:mysql (ESTABLISHED)

那是我们的mysql服务器!好吧,我想,也许它正在尝试读取查询的结果。检查 mysql 服务器上的进程列表,连接已建立,但处于 SLEEP 状态。

嗯嗯。

然后我检查了 netstat 看看谁在尝试发送/接收什么。

在网络服务器上:

[root@prweb133v ~]# netstat -t -n -a | grep 36615
tcp        0      5 172.23.179.6:36615          172.23.179.67:3306         
ESTABLISHED 

在 mysql 服务器上建立了连接,但在发送或接收队列中为 0。

知道这些神秘的 5 个字节可能是什么,或者为什么它们随机无法获取 mysql 服务器吗?

干杯!

迈克

【问题讨论】:

您可以自己和/或从其他应用程序连接和查询数据库吗? 您确定这是随机发生的并且与特定脚本无关吗? 我是迈克的同事;当处于这种故障状态时,您可以打开一个较新的浏览器(获取一个新的 PHP 会话)并使用该站点,就好像什么都没发生一样,所以数据库仍然可以。它可能与包含在所有页面上的脚本相关联,但(到目前为止)您查看的页面触发错误是随机的。 【参考方案1】:

您使用的是什么 mysql 引擎(myisam、innodb、...)?你在php端使用mysql还是mysqli接口?

我会尝试 mysql 配置文件中的“log”和“log_slow_queries”(可能是 ramdisk),同时浏览“SHOW GLOBAL STATUS;”的输出。在 mysql shell 中(每个以“*_waits”结尾或与连接相关的服务器变量)。

您是否更改了 mysql 配置文件的“微调”部分中的任何部分?更改了一些缓冲区?

在 php.ini 中,mysql.connect_timeout 有默认值(60)吗?将“mysql.trace_mode”设置为“on”暂时不会有任何影响。

如果可能,您可能还想使用“ab”之类的工具对应用的不同部分/URL 进行压力测试,以缩小范围。

或者:当使用带有 prefork 模块的 apache 时,仅在本地启动一个服务器(“Startservers 1”、“MaxSpareServers 0”等)并进行压力测试,直到它挂起。那么日志可能会更有价值。

【讨论】:

【参考方案2】:

有人从这个页面给我发了电子邮件,所以我回到 OP 并获得了我们使用的最终修复的更新:

已经有一段时间了,但据我所知,这是由于一些 Web 服务器和 mysql 服务器之间的网络错误。我们曾经 使用持久连接,因此资源仍然保持打开状态 apache虽然在网络的某个地方连接已经死了 在任何服务器都没有意识到的情况下,我认为这是由于 配置不当(或编写)的防火墙。

我们停止使用持久连接,问题就消失了。

【讨论】:

以上是关于Apache/PHP 进程在与 MySQL 交互时挂起的主要内容,如果未能解决你的问题,请参考以下文章

《香肠是怎么做的》apache/php/mysql交互之旅

建立LAMP平台

Apache+PHP+MySQL

Apache+PHP+MySQL

ubuntu下安装Apache+PHP+Mysql

当玩家在与 NPC 交互时选择特定的对话选项时,我如何执行某些操作?