【问题标题】:How to determine what makes Drupal 6 hog all the memory and crash?如何确定是什么导致 Drupal 6 占用所有内存并崩溃?
【发布时间】:2011-05-03 11:10:08
【问题描述】:

我们有一个运行 Drupal 6 的站点和一组非常标准的模块,例如 Views、CCK 等。生产站点运行良好,但在我创建生产服务器的 SQL 转储并将数据导入本地沙箱后,它停止工作。

更准确地说,在向沙箱的 Drupal 实例发出单个请求(例如加载首页)后,10-20 个 httpd 进程突然开始占用机器上的所有 CPU 和内存。几秒钟后,所有 mysql 句柄都已用完,站点离线。在我关闭整个 Apache httpd 之前,这些进程将继续执行它们正在执行的操作。

由于无法从服务器获得任何输出,我想不出调试的方法。数据库中是否存在导致无限循环或类似情况的垃圾?

这是top 的输出的sn-p。这些都是单页加载的结果。

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 7690 apache    16   0  337m  52m  13m S 27.4  1.4   0:04.42 httpd
 7715 apache    15   0  337m  52m  13m S 24.1  1.5   0:08.69 httpd
 7777 apache    15   0  337m  52m  13m R 20.8  1.4   0:09.94 httpd
 7883 apache    16   0  337m  52m  13m S 19.5  1.5   0:12.39 httpd
 7574 apache    16   0  337m  52m  13m R 17.2  1.4   0:06.30 httpd
 7678 apache    15   0  337m  52m  13m S 16.2  1.4   0:02.26 httpd
 7695 apache    15   0  337m  52m  13m S 15.5  1.4   0:10.29 httpd
 7774 apache    15   0  337m  52m  13m S 15.5  1.4   0:04.62 httpd
  748 mysql     15   0  364m  67m 5408 S 15.2  1.9  15:37.77 mysqld
 7847 apache    15   0  337m  52m  13m S 14.9  1.4   0:07.10 httpd
 7839 apache    16   0  337m  52m  13m S 14.2  1.4   0:02.85 httpd
 7879 apache    15   0  337m  52m  13m S 13.9  1.5   0:12.65 httpd
 7851 apache    16   0  337m  52m  13m R 12.5  1.4   0:06.77 httpd
 7724 apache    16   0  337m  52m  13m S 12.2  1.4   0:06.62 httpd
 7882 apache    16   0  337m  52m  13m S 11.6  1.5   0:09.04 httpd
 8273 apache    16   0  337m  52m  13m S  9.2  1.4   0:07.30 httpd
 7712 apache    15   0  337m  52m  13m R  8.9  1.4   0:08.13 httpd
 7742 apache    16   0  337m  52m  13m S  8.9  1.4   0:06.74 httpd
 7754 apache    15   0  337m  52m  13m S  8.6  1.4   0:04.16 httpd
 7739 apache    16   0  337m  52m  13m S  8.3  1.4   0:04.51 httpd
 7787 apache    15   0  337m  52m  13m S  8.3  1.4   0:07.44 httpd
 7819 apache    16   0  337m  52m  13m S  7.6  1.4   0:02.03 httpd
 7755 apache    16   0  337m  52m  13m S  7.3  1.4   0:05.89 httpd
 7766 apache    16   0  337m  52m  13m R  7.3  1.4   0:01.12 httpd
 7894 apache    16   0  337m  52m  13m S  7.3  1.4   0:09.49 httpd
 7814 apache    15   0  337m  52m  13m S  5.9  1.4   0:03.88 httpd
 7576 apache    15   0  337m  52m  13m S  5.6  1.4   0:03.63 httpd
 7829 apache    15   0  337m  52m  13m S  5.3  1.4   0:04.17 httpd
 7579 apache    15   0  337m  52m  13m S  5.0  1.4   0:04.43 httpd
 7817 apache    15   0  337m  52m  13m S  4.0  1.4   0:04.60 httpd
 7789 apache    15   0  337m  52m  13m S  2.0  1.4   0:04.41 httpd
 7820 apache    15   0  337m  52m  13m S  1.0  1.4   0:01.57 httpd

【问题讨论】:

    标签: apache drupal-6 crash memory-management cpu-usage


    【解决方案1】:

    首先,如果尚未完成,您应该清空所有缓存表。 然后尝试在没有启用 javascript 的情况下访问网站(这可能会阻止 ajax 调用)。 您甚至可以尝试使用 lynx(浏览器)进行访问。

    如果 apache 进程的创建不是来自 javascript 而是来自内部……那么这意味着一个 PHP scipt 正在生成 apache 进程,这对于 PHP 脚本来说是一种非常糟糕的行为,所以我希望不是这样。

    您可以在 Drupal 上尝试一个分析模块,例如 this one。崩溃后,您至少可以查询报告页面,所有分析数据都保存在数据库中,并且可以报告您感兴趣的数据(请参见屏幕截图),如果您可以尝试检查包含分析数据的 MySQL 表无法访问模块页面。

    否则,您可以尝试 XDebug 并在查询中导出 kcachegrind 文件,但这对于 Drupal 请求可能很难阅读。

    编辑

    也请尝试使用 firebug 检查您是否没有从所请求的页面发出所有请求(可能是因为空图像 src,例如,如果它不是 javascript)。并检查 apache 日志和 Mysql 日志——您可以在其中激活请求日志记录。

    【讨论】:

    • 很多好的建议,谢谢!我以前实际上使用过并喜欢过 kcachegrind,但忘记了它的名字。问题被证明是一个自定义图像轮播块,它在其图像上调用getimagesize()。一些图像丢失,导致 404 页面,因为图像地址被无意中作为 HTTP URL 传递。 404页面当然也有阻塞,导致请求无限循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多