【问题标题】:apache/php hangs: semop?apache/php 挂起:semop?
【发布时间】: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 是的,当然。如果令牌仍然有效,我只会进行快速数据库查询。

标签: php apache php-5.2


【解决方案1】:

strace 输出中,它看起来正在等待文件指针编号 7。您可以通过查找类似

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

read 调用之前的某个地方。

【讨论】:

  • 谢谢。我用ls -la /proc/3069/fd/7 做到了这一点,但它是一个管道而不是一个读取文件。请参阅我的上次更新,但我会查看open()。可能会告诉我一些关于管道的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 2012-11-04
  • 2011-01-15
  • 2011-02-11
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
相关资源
最近更新 更多