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

时间:2010-02-10 16:54:37

标签: php mysql apache networking tcp

我们看到一些奇怪的行为,我们不确定它是否是apache,php,mysql或操作系统的问题,所以超过了stackoverflow的大脑!

我们有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状态。

Hmmmm。

然后我检查了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服务器?

干杯!

麦克

2 个答案:

答案 0 :(得分:1)

你使用的是什么mysql-engine(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”等工具对应用的不同部分/网址进行压力测试,以缩小范围。

或者:当apache与prefork模块一起使用时,本地只启动一个服务器(“Startservers 1”,“MaxSpareServers 0”,类似的东西)并进行压力测试直到它挂起。然后日志可能更有价值。

答案 1 :(得分:1)

有人通过此页面向我发送了电子邮件,因此我回到了OP并获得了我们使用的最终修复程序的更新:

  

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

     

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