【问题标题】:Why apache is recv()-ing something for 15 sec every time?为什么 apache 每次都在 recv()-ing 15 秒?
【发布时间】:2010-07-05 12:51:42
【问题描述】:

我有基于 ZendFramework 的应用程序,它使用 XMLRPC 与其他 ZendFramework 应用程序通信。两者都在同一台服务器上(用于开发)。这种沟通非常缓慢,我正在尝试找出原因。在分析之后,我发现 ZF Lib XMLRPC 阅读器的 fgets() 速度变慢了。

在对基于 ZendFramework 的 PHP 应用程序进行 strace 时,我使用 recv() 获得了一些模式 等待 15 秒?任何人都知道为什么会发生这种情况?

 0.000038 gettimeofday({1278333900, 86101}, NULL) = 0
 0.000037 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 32
 0.000035 fcntl64(32, F_GETFL)      = 0x2 (flags O_RDWR)
 0.000033 fcntl64(32, F_SETFL, O_RDWR|O_NONBLOCK) = 0
 0.000034 connect(32, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
 0.000076 poll([{fd=32, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 120000) = 1 ([{fd=32, revents=POLLOUT}])
 0.000045 getsockopt(32, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
 0.000036 fcntl64(32, F_SETFL, O_RDWR) = 0
 0.000113 send(32, "POST /r/?articleId=554&hpr=Pimpl"..., 1180, MSG_DONTWAIT) = 1180
 0.000148 poll([{fd=32, events=POLLIN|POLLERR|POLLHUP}], 1, 120000) = 1 ([{fd=32, revents=POLLIN}])
 0.028020 recv(32, "HTTP/1.1 200 OK\r\nDate: Mon, 05 J"..., 8192, MSG_DONTWAIT) = 543
 0.000105 poll([{fd=32, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
 0.000050 poll([{fd=32, events=POLLIN|POLLERR|POLLHUP}], 1, 120000) = 1 ([{fd=32, revents=POLLIN}])
15.012976 recv(32, "", 8192, MSG_DONTWAIT) = 0
 0.000123 close(32)                 = 0

【问题讨论】:

  • 我注意到在配置中我将 KeepAlive 设置为 15 秒。也许这可能是那个,因为这应该是非阻塞的 recv() (MSG_DONTWAIT)?
  • 绝对是这样。我假设您正在手动测试 POST?如果是这样,请尝试在您的请求标头中添加“连接:关闭”。

标签: php apache zend-framework networking strace


【解决方案1】:

我对 ZendFramework 知之甚少,所以对我的 cmets 持怀疑态度...但是!

如果我理解正确的话

0.000050 poll([{fd=32, events=POLLIN|POLLERR|POLLHUP}], 1, 120000) = 1 ([{fd=32, revents=POLLIN}])
15.012976 recv(32, "", 8192, MSG_DONTWAIT) = 0

这意味着你正在轮询套接字(32)你得到一个信号 POLLIN(传入数据)你去 recv 并等待 15 秒(超时)得到 0 个字节

这对我来说表明存在错误。可能在 zendframework 中,或者您如何称呼它。在 recv 后接收 0 个字节表示套接字已完全关闭(与强制关闭相反)。因此,当您退出民意调查并进入 recv 时,响应应该是立即的(毕竟它只读取 0 个字节)

我假设的 MSG_DONTWAIT 标志意味着进入非阻塞模式,这意味着无论等待的数据如何,它都应该立即返回,无论是数据还是会阻塞错误,都应该返回到轮询循环中。

可能是其他东西冻结了线程导致它锁定。尝试将应用程序放在两台不同的机器上,看看是否出现相同的错误。这可能是一些奇怪的互动。

直流

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多