apache / php挂起:semop?

时间:2012-11-07 14:33:00

标签: php apache php-5.2

我正在编写一个wordpress插件,其中包含一个自定义的单点登录。

我有一个问题我无法重现但经常发生:有时你登录,点击另一个页面,这个页面一直在加载。此时,来自同一会话的所有其他请求也将停止。重新启动apache修复了它,但不是一个真正的解决方案。

服务器流量不大,因此只运行了几个apache进程。如果我深入研究它们,我会看到许多人被semop

所困扰
(gdb) bt
#0  0x00002af60c22b2d7 in semop () from /lib64/libc.so.6
#1  0x00002af60bbf612c in ?? () from /usr/lib64/libapr-1.so.0
#2  0x000055555559e614 in ?? () from /usr/sbin/httpd2-prefork
#3  0x000055555559e9ea in ?? () from /usr/sbin/httpd2-prefork
#4  0x000055555559f25d in ap_mpm_run () from /usr/sbin/httpd2-prefork
#5  0x000055555557a080 in main () from /usr/sbin/httpd2-prefork

看起来他们正在等待文件:

strace -p 3069
....
read(7, 0x7fff16a04df7, 1)              = -1 EAGAIN (Resource temporarily unavailable)
semop(286162952, 0x2af60bd07dc0, 1 <unfinished ...>

read(7 ,..)指向管道:

# ls -la /proc/3069/fd/7
lr-x------ 1 root   root 64 Nov  7 17:24 7 -> pipe:[157329520]

所有apache进程都使用该管道:

# lsof | grep 157329520
httpd2-pr  2430       root    7r     FIFO                0,5             157329520 pipe
httpd2-pr  2430       root    8w     FIFO                0,5             157329520 pipe
httpd2-pr  3061     wwwrun    7r     FIFO                0,5             157329520 pipe
httpd2-pr  3061     wwwrun    8w     FIFO                0,5             157329520 pipe
...

这可能与问题没有关系,但我仍然想知道这是什么类型的管道。

这里的人们猜测它毕竟不是服务器问题,但是从我在回溯中看到的PHP甚至还没有调用。没有libphp5.so。

我想发布一些PHP代码供你查看,但我只是不知道哪个部分...我的脚本在同一个会话中对另一个脚本进行curl调用。也许这会产生某种阻塞?或者它可能是https问题吗?

我真的不知道它是PHP还是Apache,但问题的关键可能是了解apache在这里做了什么。

知道如何修复或调试它吗?

1 个答案:

答案 0 :(得分:0)

strace输出中,它看起来正在等待第七个文件指针。你可以通过寻找像

这样的行来找出这个文件
open("/foo/bar", ......)     = 7

read来电之前的某个地方。