如何确定Drupal 6如何确保所有内存和崩溃?
我们有一个运行Drupal 6的站点和一套非常标准的模块,比如Views,CCK等等。生产站点运行良好,但在创建生产服务器的SQL转储并将数据导入到本地沙箱后,它停止工作。如何确定Drupal 6如何确保所有内存和崩溃?
更确切地说,在向沙箱的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进程变成spawn,这对PHP脚本来说是一个非常不好的行为,所以我希望不是这样。
你可以试试Drupal上的剖析模块,如this one。崩溃后,您可能至少能够查询报告页面,所有分析数据都保存在数据库中,并可以向您报告有趣的数据(请参阅屏幕截图),也许您可以尝试检查包含分析数据的MySQL表无法访问模块页面。
否则,您可以尝试XDebug并在您的查询中导出kcachegrind文件,但这可能很难用Drupal请求读取。
编辑
尝试以及检查与你没有做从请求的页面(也许是因为空图像SRC例如,如果它不是JavaScript)的所有请求萤火虫。并检查Apache日志和Mysql日志 - 您可以在哪里激活请求日志记录。
很多好的提示,谢谢!我实际上曾经使用并爱过kcachegrind,并忘记了名字。这个问题被证明是一个自定义图像传送带块,它在图像上调用getimagesize()。某些图像丢失,导致出现404页面,因为图像地址被无意中作为HTTP URL传递。 404页面当然也有该块,导致无限循环的请求。 – Kaivosukeltaja 2011-05-04 04:29:23
漂亮的无限循环:-) – regilero 2011-05-04 07:40:15