1

我正在编写一个 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 在这里做什么。

知道如何修复或调试这个吗?

4

1 回答 1

0

strace输出中,它看起来像是在等待第 7 个文件指针。您可以通过查找类似的行来找出这是哪个文件

open("/foo/bar", ......)     = 7

read通话前的某个地方。

于 2012-11-07T16:54:39.100 回答