【发布时间】:2012-10-27 15:12:57
【问题描述】:
我正在编写一个 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 在这里做了什么。
知道如何修复或调试此问题吗?
【问题讨论】:
-
我猜它只是一个连接进程的管道......就像你做
cat foo | cat时一样。在这种情况下,apache 似乎与自己进行通信。我不确定问题是否与 apache 有关。 -
这看起来不像是服务器配置问题,但更可能是一些糟糕的 PHP code 像提到的 OP。如果您确信这不是实际的 PHP 代码,而是 PHP 会话处理程序中的问题,请随时在 SF 上询问该部分(我们需要知道您使用的会话处理程序有什么帮助- 有一些选项,包括“自定义”选项,可能是需要调试的本土 PHP)。
-
有趣的是问题被转移到了 SF,现在每个人都说这不是服务器问题 :) 我从来没有说过它是 PHP 或 apache,我问它可能是什么。我会接受“这不是服务器问题,请参阅 stackoverflow.com/questions/264266/debugging-hung-php”;如果有人能告诉我你是怎么做到的,作为答案。对我来说这没有任何意义。如果是 PHP 问题,为什么调用堆栈不包含 php_execute_script 或 libphp5.so?在我看来,PHP 甚至还没有被调用。我真的认为这个问题需要重新提出,拜托。
-
@Pekka 是的,当然。如果令牌仍然有效,我只会进行快速数据库查询。