在我的站点上drush cc all
,运行需要4分钟以上。站点数据库只有几个GB。但是,我看不出为什么花太长时间的明确原因。我该怎么办才能找到瓶颈?
在我的站点上drush cc all
,运行需要4分钟以上。站点数据库只有几个GB。但是,我看不出为什么花太长时间的明确原因。我该怎么办才能找到瓶颈?
Answers:
清除缓存本身不需要很长时间,因为它只是截断缓存表。最耗时的是在此之后重建缓存注册表。通常,它是主题注册表,它会扫描所有新的钩子以及所有Drupal文件夹中的新模板文件,系统会扫描文件中的新模块和类文件,等等。
您始终可以通过指定drush cc theme-registry
或任何其他清除特定的缓存。
强烈建议您使用PHP缓存机制(例如OPCache,XCache等)来加快处理速度。并且基于内存的缓存可替代SQL表上的大量使用(例如,memcached或redis),因此清除缓存将不需要任何时间,只需刷新缓存(例如,echo flush_all > /dev/tcp/127.0.0.1/11211
在Bash中)。
另外,您始终可以手动清除缓存,例如:
echo "SHOW TABLES LIKE 'cache%'" | $(drush sql-connect) | tail -n +2 | xargs -L1 -I% echo "DELETE FROM %;" | $(drush sql-connect) -v
要检查最耗时的时间,您需要对其进行调试 / profile(例如XDebug,XHProf,phpdbg,dtrace)。
在OS X / Unix上,这可以通过dtrace
(在运行之后drush
)实现:
sudo dtrace -qn 'php*:::function-entry { printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }'
在Linux上,使用strace
,例如
strace -e trace=sendto,recvfrom -s1000 -p $(pgrep php)
要查找某些特定内容,请尝试添加例如:strace ... 2>&1 | grep -C5 UPDATE
。
如果您有一个非常大的数据库,并且在未进行缓存清除时系统运行良好,则可能是您没有足够的内存来完全支持您的设置。
如果您的站点在Linux机器上运行,请运行“ top”(从您的shell),然后按shift-M键以按使用的内存对进程列表进行排序。然后,从另一个终端运行缓存清除操作。您应该看到mysql和apache上升到列表的顶部。您将能够看到这些进程中每个进程使用的总内存的百分比,以及使用了多少可用RAM。如果您有大量的虚拟空间,但是所有物理RAM都已用完,则此操作可能会导致VM内存崩溃,从而使您的执行时间减少到通常的一小部分。
有一次,我在一个没有足够内存的盒子上运行一个流量中等的Drupal网站,以支持设置。当我在一个不相关的低流量站点上运行缓存清除时,缓存的重建使系统超出了其限制,并且几乎所有内容都被锁定。因此,整个系统的行为在这里很重要。这就是为什么像“ top”这样的简单工具是一个方便的起点的原因。
我将在某种程度上不同意@ greg_1_anderson。
如果在期间系统没有完全崩溃cc all
,那么我认为您没有一般的内存问题。当LAMP服务器的内存不足时,它将命中swap。处于活动状态的服务器碰到交换将导致大量不良情况。由于系统变慢(交换使系统运行非常缓慢),httpd进程将开始堆积,这将导致使用更多交换空间,依此类推。在发生这种情况的网站上,我会看到进程负载达到100,和大量活动的httpd进程。
如果您的系统最终恢复正常,那么我认为您的调整不佳。 drush cc all
将会导致大量的数据库访问,所以我认为这正显示出更多的问题。我的建议是在站点上运行mysqltuner。如果您有一个多GB数据库,我的猜测是您的innodb_buffer_pool_size
远程大小甚至都不正确,并且您的MySQL实例正在崩溃。我还将研究备用的缓存后端,以尝试减小数据库的占用空间。
这不是一个完整的解决方案,仅是另一个工具,可帮助您确定延迟的根源。
除了top
用于监视流程之外,您还可以找到mytop
信息量很大的输出。(上面的其他答案都假定MySQL,但如果您使用的是另一个数据库后端,则需要将mytop换成等效的工具。)
mytop
只需SHOW FULL PROCESSLIST
在一个循环中执行MySQL ,并向您显示正在执行哪些查询(因此需要很多时间)。如果清除缓存需要很长时间来清理该表,那么您将在这里看到是什么原因。如果您无权安装mytop
,只需在您的shell中执行一个原始版本-
while true; do mysql -e 'SHOW FULL PROCESSLIST' && sleep 5 && clear ; done
如果延迟不是源于MySQL查询,则此工具至少可以为您确认一次。