1

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

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

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

4

1 回答 1

0

使用 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 选项来跟踪不使用索引的查询。

使用 drupal 让所有 apache 进程停止在 php 操作上的另一种方法是遇到锁定问题。Drupal 使用MySQL自己的锁实现。您可能会在这些文件上添加一些看门狗(drupal 内部调试消息)调用以尝试检测锁定问题。

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

于 2013-02-19T20:38:12.083 回答