web-dev-qa-db-ja.com

`drush cc all`コマンドの実行に時間がかかりすぎます。どうすればよいですか?

私のサイトdrush cc allの実行には4分以上かかります。サイトデータベースは数GBです。しかし、なぜ時間がかかるのか、はっきりとした理由はわかりません。ボトルネックを見つけるにはどうすればよいですか?

12
awm

キャッシュテーブルを切り捨てるだけなので、キャッシュ自体をクリアするのに時間がかかりません。最も時間がかかるのは、その後キャッシュレジストリを再構築することです。通常、すべての新しいフックとすべてのDrupalフォルダーで新しいテンプレートファイルをスキャンし、システムでファイルをスキャンして新しいモジュールとクラスファイルをスキャンするなどのテーマレジストリです。

drush cc theme-registryまたはその他を指定して、いつでも特定のキャッシュをクリアできます。

PHPキャッシュメカニズム(例:OPCache、XCacheなど))を使用して処理を高速化することを強くお勧めします。また、メモリベースのキャッシュを使用して、SQLテーブル(例:memcachedまたはredis )なので、キャッシュをクリアするだけで、キャッシュのクリアに時間がかかりません(例:Bashのecho flush_all > /dev/tcp/127.0.0.1/11211)。

または、常にキャッシュをクリアすることもできます 手動 。沿って:

echo "SHOW TABLES LIKE 'cache%'" | $(drush sql-connect) | tail -n +2 | xargs -L1 -I% echo "DELETE FROM %;" | $(drush sql-connect) -v

デバッグ中

特に最も時間がかかっているものを確認するには、 debug /profile it(たとえば、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を追加してみてください。

6
kenorb

非常に大きなデータベースがあり、キャッシュをクリアしていないときにシステムが正常に動作している場合は、セットアップを完全にサポートするのに十分なメモリがない可能性があります。

サイトがLinuxボックスで実行されている場合は、(シェルから)「top」を実行し、Shift-Mを押して、使用されているメモリでプロセスリストをソートします。次に、別の端末からキャッシュクリア操作を実行します。 mysqlとApacheがリストの一番上に表示されるはずです。これらの各プロセスが使用している合計メモリのパーセンテージ、および使用されている空き容量RAMが表示されます。大量の仮想スペースがある場合、すべての物理RAMが使い果たされた場合、この操作によりVMメモリがスラッシュし、実行時間が通常のごく一部にまで減少する可能性があります。

かつて、私は中間トラフィックを実行していましたDrupalセットアップをサポートするのに十分なメモリなしのボックス上のサイト。無関係な低トラフィックサイトでキャッシュクリアを実行したとき、キャッシュの再構築によってシステムが限界を超え、すべてがロックアップされたため、ここではシステム全体の動作が重要です。このため、「top」などのシンプルなツールを使用すると便利です。

5
greg_1_anderson

ここで@ greg_1_andersonに(やや)反対します。

cc allの実行中にシステムが完全にクラッシュしない場合、一般的なメモリの問題はないと思います。 LAMPサーバーのメモリが不足すると、スワップが発生します。スワップをヒットするアクティブなサーバーは、一連の悪さを引き起こします。システムのスローダウンのためにhttpdプロセスがスタックし始めます(スワップによりシステムの実行が非常に遅くなります)。これにより、より多くのスワップが使用されるようになります。大量のアクティブなhttpdプロセス。

あなたのシステムが最終的に戻ってきたら、私はあなたがうまくチューニングされていないと思います。 drush cc allを使用すると、データベースアクセスが多くなるため、問題がより多く発生していると思います。私の提案は、サイトで mysqltuner を実行することです。マルチGBデータベースがある場合、私のguessは、innodb_buffer_pool_sizeがリモートで適切にサイズ設定されておらず、MySQLインスタンスがスラッシングしていることです。また、データベースのフットプリントを小さく保つために、代替キャッシュバックエンドを調査します。

2
mpdonadio

それはあなたのウェブホスティング環境かもしれません。ローカル設定、または共有ホスティングまたはVPS /サーバーでホスティングしているものを指しますか?

  • ホスティング環境-共有Webホスティングを使用している場合、Drupal/drushが使用できるメモリの量は制限されます: https:/ /drupal.org/node/207036
  • 最大実行時間-増やす必要があります
1
geekgirlweb

これは完全なソリューションではなく、遅延の原因を特定するのに役立つもう1つのツールです。

topを使用してプロセスを監視するだけでなく、mytopの出力が参考になる場合があります。 (上記の他の回答はMySQLを想定していますが、別のDBバックエンドを使用している場合は、mytopを同等のツールと交換する必要があります。)

mytopは単にMySQLを実行しますSHOW FULL PROCESSLISTループで、実行されているクエリを示します(そのため、多くの時間がかかります)。キャッシュのクリアでこのテーブルまたはそのテーブルのクリーンアップに長い時間がかかっている場合は、何が原因であるかが正確にわかります。 mytopをインストールするアクセス権がない場合は、シェルで大まかなバージョンを実行してください-

while true; do mysql -e 'SHOW FULL PROCESSLIST' && sleep 5 && clear ; done

遅延がMySQLクエリによるものではない場合、このツールは少なくともそれを確認します。

1
Chris Burgess

Speed Up Cache Clearing on Drupal 7 というタイトルのブログ投稿が、キャッシュクリアプロセスのどの部分が速度を低下させているのかを正確に絞り込むのに非常に役立つことがわかりました。 features module および entity api module で特定されている問題がサイトに影響を与えていましたが、この投稿で詳述されているプロセスは、私たちが遭遇した問題を追跡するのにも役立ちました Drupalコア および ブレークポイントモジュール

プロセスの処理には少し時間がかかりますが、キャッシュのクリアを数分から1分未満に減らすことができました。

1
Matt V.