我们有一个运行 Drupal 6 的站点和一组非常标准的模块,例如 Views、CCK 等。生产站点运行良好,但在我创建生产服务器的 SQL 转储并将数据导入本地沙箱后,它停止工作。
更准确地说,在向沙盒的 Drupal 实例发出单个请求(例如加载首页)后,10-20 个 httpd 进程突然开始占用机器上的所有 CPU 和内存。几秒钟后,所有 mysql 句柄都已用完,站点离线。这些进程将继续做他们正在做的任何事情,直到我关闭整个 Apache httpd。
由于我无法从服务器获得任何输出,因此我想不出调试的方法。数据库中是否有一些垃圾会导致无限循环或类似的东西?
这是 top
的输出片段.这些都是单页加载的结果。
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
最佳答案
首先,如果尚未完成,您应该清空所有缓存表。
然后尝试在没有启用 javascript 的情况下访问网站(这可能会阻止 ajax 调用)。
也许您甚至可以尝试使用 lynx(浏览器)进行访问。
如果 apache 进程的创建不是来自 javascript 而是来自内部……那么这意味着一个 PHP scipt 正在生成 apache 进程,这对于 PHP 脚本来说是一种非常糟糕的行为,所以我希望不是这样。
你可以试试 Drupal 上的分析模块,比如 this one .崩溃后,您至少可以查询报告页面,所有分析数据都保存在数据库中,并且可以报告您感兴趣的数据(请参见屏幕截图),如果您可以尝试检查包含分析数据的 MySQL 表无法访问模块页面。
否则,您可以尝试 XDebug 并在查询中导出 kcachegrind 文件,但这对于 Drupal 请求可能很难阅读。
编辑
还可以尝试使用 firebug 检查您是否没有从请求的页面发出所有请求(可能是因为空图像 src,例如如果它不是 javascript)。并检查 apache 日志和 Mysql 日志——您可以在其中激活请求日志记录。
关于apache - 如何确定是什么导致 Drupal 6 占用所有内存并崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5868560/