我正在编写一个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在这里做了什么。
知道如何修复或调试它吗?
答案 0 :(得分:0)
在strace
输出中,它看起来正在等待第七个文件指针。你可以通过寻找像
open("/foo/bar", ......) = 7
read
来电之前的某个地方。