【问题标题】:How do you troubleshoot all Apache threads becoming occupied and idle?您如何解决所有 Apache 线程被占用和空闲的问题?
【发布时间】:2013-02-19 17:24:44
【问题描述】:

我有一个 Drupal 6 站点经常(大约每天一次)出现故障。托管服务提供商报告说我们站点代码中的某些内容占用了所有 Apache 线程,但使它们保持空闲状态,从而使服务器用尽线程来响应新请求。简单地重新启动 Apache 即可释放线程并解决问题,尽管它会在几小时或一天内再次发生。

我不知道如何解决这个问题,也从未遇到过这样做的 PHP 代码。是否可以进行某种 Apache 设置更改以捕获有关可能使线程被占用但空闲的更多信息?哪些典型的 PHP 例程会导致这种行为?我查找了连接到外部资源的代码,但没有发现任何问题。

任何关于查看内容、捕获更多信息或可能导致此问题的 PHP 代码的提示都是最有用的。

【问题讨论】:

    标签: performance apache drupal drupal-6 apache2


    【解决方案1】:

    使用 Drupal6,您有时可以运行 poormanscron 模块,甚至可以运行经典的 cron(来自 crontab wget 或其他)。 然后,您可以进行一项繁重的 cron 操作,将您的数据库置于繁重的环境中。然后,如果您的数据库响应时间变得非常慢,那么每个 http 请求都会变得非常慢(例如会话在数据库中,并且一个 drupal 页面需要数百个查询)。让所有请求变慢可能会使所有可用的 php 进程处于“占用状态”。

    重启 apache 所有当前进程都停止。如果您通过 wget 而不是通过 drush 运行 cron,那么检查 cron 任务是一件好事(通过 drush 运行 cron 会使其通过 php-cli 运行'重新启动 apache 不会杀死 cron)。您可以尝试使用 elysia cron 之类的模块来获取有关 cron 任务的更多详细信息,并可能隔离较长的任务(您有关于任务持续时间的报告)。

    这种效果(一个请求损坏了数据库,所有请求都变慢了,没有更多可用的进程)也可以由来自您安装的任何模块的一段错误代码来完成。这将更难检测。

    所以我会确保在 MySQL 上跟踪慢查询(请参阅 my.cnf otinons),然后使用mysqsla 之类的收费分析这些请求。问题是有时一个查询太大以至于所有查询都变慢了。 Se 使用时间的崩溃 te 检测第一个。也可以使用 MySQL 选项来跟踪不使用索引的查询。

    另一种让所有 apache 进程在 php 操作中停止使用 drupal 的方法是遇到 lock 问题。 Drupal 使用的是 own lock implementation 和 MySQL。您可以在这些文件上添加一些 watchdog(drupal 内部调试消息)调用以尝试检测锁定问题。

    那么您也可以通过 drupal 进行 外部 http 请求调用。调用 facebook、google 等外部网站、一些小型 url 工具或 drupal.org 模块更新东西(它们总是试图找到所有模块,甚至是你写的那个)。如果远程网站关闭或过滤您的流量,您将遇到问题(但 apache 重启对您没有帮助,所以可能不是这样)。

    【讨论】:

    • 谢谢! Cron 通过 drush 运行。关于重启不影响这一点的好点,所以它不是cron。我们没有使用Poormanscron。发生这种情况时,我没有看到高 MySQL 负载。 Apache 重启对外部 HTTP 请求没有帮助吗?
    • 好吧,如果您的所有进程都卡在外部请求上,他们会错过超时设置。现在,如果他们有时会超时——这应该发生——新进程也有相同的外部通信问题。重新启动 apache 不会使新进程具有更好的外部连接,只是因为你已经杀死了旧连接......或者它可能是因为你的 websuti 在这个外部资源上达到了 mx-number-of 连接......跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    相关资源
    最近更新 更多