【问题标题】:sleep() silently hogs CPUsleep() 默默地占用 CPU
【发布时间】:2010-09-06 11:46:44
【问题描述】:

我在 VMWare 中的 Linux 上运行 Apache。

我请求的 PHP 页面之一是 sleep(),我发现如果我在第一页为 sleep()'ing 时尝试请求第二页,第二页将挂起,等待 sleep()从第一页到结束。

还有其他人看到过这种行为吗?

我知道PHP 不是多线程,但这似乎是对 CPU 的严重错误处理。

编辑:我应该提到 CPU 使用率不会飙升。我所说的 CPU“占用”的意思是,当页面处于 sleep() 状态时,似乎没有其他 PHP 页面能够使用 CPU。

【问题讨论】:

  • 您找到解决方案了吗?我也遇到了同样的问题。

标签: php performance sleep


【解决方案1】:

可能是被调用的页面打开了一个会话,然后没有提交它,在这种情况下,请参阅this answer 以获得解决方案。

【讨论】:

  • 如果您将 php.ini 配置为 session.auto_start 设置为 1,它将在运行任何代码之前打开会话,并保持打开状态,直到您明确关闭它或页面到达末尾.第二个请求似乎在运行第一行代码之前就会挂起。
  • 就我而言,在开始循环之前调用session_write_close() 阻止了sleep 锁定对服务器上其他页面的访问。
【解决方案2】:

这可能意味着您的 Apache 只使用了 1 个子进程。

因此:

第一个子进程正在处理一个请求(在这种情况下处于休眠状态,但它可能正在做真正的工作,Apache 无法区分),所以当一个新请求到来时,它必须等到第一个进程完成了。

解决方案是增加 Apache 允许生成的子进程的数量(MaxClients 指令,如果您使用的是 prefork MPM),只需从 PHP 脚本中删除 sleep()。

如果不确切知道脚本中发生了什么,很难说,但您可能可以摆脱 sleep()。

【讨论】:

  • 你已经用“可能”这个词稍微驯服了这个概念,但我仍然不明白你如何证明期望能够在不破坏的情况下删除你从未见过的代码东西?
  • 对不起,我没有更清楚地表达我的意见。我并不是说你可以摆脱睡眠并且应用程序会继续工作。我的意思是很可能 sleep() 不存在是有充分理由的,并且应用程序可能会被重写以在没有 sleep() 的情况下工作。
【解决方案3】:

您是否真的看到 CPU 达到 100% 或者只是没有其他页面正在服务?您正在运行多少个 apache 实例?当您在线程中运行 sleep() 时,它们是否都停止了?

PHP 的 sleep() 函数本质上是通过一个空闲循环运行 n 秒。它不会释放任何内存,但不会显着增加 CPU 负载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多