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


12

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


最初のmysqlクエリログを確認します:drupal.stackexchange.com/questions/75629/…– AgA 14
1

cronを実行していますか?
mpdonadio

はい、cronを実行しています。サイトは一般的に遅いです。リファクタリングする価値のない多くのレガシーコード。
awm 14年

ここで@MPDに同意しますが、これはメモリに関係するとは思いません。MySQLも考えられる理由の1つにすぎません。調べる方法は1つしかなく、それをプロファイルすることです。これを行う最も簡単な方法は、xhprof拡張機能とdevelを使用することです。これは、drushでも機能します(レポートへのリンクを表示するには、-dを使用します)。私の推測では、いくつかの問題があります。すべてのリクエストに対してサイトが遅い場合の一般的な問題は、モジュールが欠落していることです。drupal.stackexchange.com/questions/724/why-is-drupal-7-so-slowを参照してください。ビューには、キャッシュに関するいくつかの主要なパフォーマンスの問題もあります。drupal.org/node/1944674を参照してください。
ベルディール14

ありがとう、私はプロファイリングをしなければならないと思ったが、drupalコードベースの場合、ボトルネックを特定することは常に難しい。私はサイトが遅いと言ったが、それはあまりにも遅くなく、ccをすべて押しつぶし、不均衡に遅い。
AWM

回答:


6

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

drush cc theme-registryまたはその他を指定することにより、特定のキャッシュをいつでもクリアできます。

PHPキャッシュメカニズム(OPCache、XCacheなど)を使用して処理を高速化することを強くお勧めします。また、メモリテーブルキャッシュは、SQLテーブル(memcachedやredisなど)の使用量を置き換えるため、キャッシュをクリアするだけでキャッシュをクリアできます(echo flush_all > /dev/tcp/127.0.0.1/11211Bashなど)。

または、次の方法、常に手動でキャッシュクリアできます。

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


5

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

サイトがLinuxボックスで実行されている場合は、(シェルから) 'top'を実行し、shift-Mを押して、使用されているメモリでプロセスリストをソートします。次に、別の端末からcache-clear操作を実行します。mysqlとapacheがリストの一番上に表示されるはずです。これらの各プロセスが使用している合計メモリの割合と、使用されている空きRAMの量を確認できます。大量の仮想スペースがあり、物理RAMがすべて使い果たされている場合、この操作によりVMメモリがスラッシングし、実行時間が通常よりもわずかに短縮される可能性があります。

かつて、セットアップをサポートするのに十分なメモリを備えていないボックスで、トラフィックの多いDrupalサイトを実行していました。関連性の低いトラフィックの少ないサイトでキャッシュクリアを実行すると、キャッシュの再構築によりシステムが制限を超えてしまい、すべてがロックされました。したがって、ここではシステム全体の動作が重要です。これが、「トップ」などのシンプルなツールを開始するのに便利な場所である理由です。


おかげで、私は根本的な原因はサイトがしばらくの間存在していたと思います、dbは少し大きく、コードはひどくリファクタリングが必要です。たとえば、node_delete操作には約3秒かかります。あまりにも多くのメモリを与えることは冗長かもしれないと思います、同意しますか?
awm 14年

私は自分のマシンにそれを持っていますが、それも遅いです。私はメモリを最大1GBに倍増し、「time drush cc all」と時間を計りました。4秒間だけ速くなっただけです。
awm 14年

1
はい、大量のメモリがあってもサイト全体が常に遅い場合、ccは問題ではありません。より一般的なプロファイリングを行う必要があります。
greg_1_anderson 14年

また、サイトが本当に古く、更新が必要な場合は、新しいモジュールを使用してゼロから再構築することを検討し、drupalからdrupalへの移行(drupal.org/project/migrate_d2d)を使用してコンテンツを移動します。
greg_1_anderson 14年

2

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

システムがの​​間に完全にクラッシュcc allしない場合、一般的なメモリの問題があるとは思わない。LAMPサーバーのメモリが不足すると、スワップが発生します。アクティブなサーバーがスワップにヒットすると、不良の評価が発生します。httpdプロセスは、システムのスローダウン(スワップによりシステムの動作が非常に遅くなる)によりスタックを開始し、これにより、より多くのスワップが使用されるようになります。これが発生したサイトでは、プロセスの負荷が100に達し、そして、多数のアクティブなhttpdプロセス。

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


おかげで、drupalは、ニスの不備があるservieレイヤーを持つ編集用にのみ使用されます。これでユーザーはdrupalになります。ボトルネックがあると思うので、起こっていることを調査したいだけです。私の最善の策は、mysqlスローログをオンにしてデータベースを監視することです。そして、xdebugのといくつかのプロファイリングを行う
AWM

SHOW FULL PROCESSLISTは、スロークエリログを使用する必要なしに(つまり、サーバーを再起動することなく)何が起こっているかを示します。mytopの他の回答もご覧ください。
クリスバージェス14

1

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

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

通常、ブラシはによって制限されませんmax_execution_timedrush php-eval "print ini_get('max_execution_time');"ただし、再確認することができます。
mpdonadio

1

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

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

mytopMySQL SHOW FULL PROCESSLISTをループで単純に実行し、どのクエリが実行されているかを示します(そのため、多くの時間がかかります)。キャッシュクリアでこのテーブルまたはそのテーブルをクリーンアップするのに時間がかかっている場合、ここで何が起きているのかを正確に確認できます。install mytopにアクセスできない場合は、シェルで粗いバージョンを実行してください-

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

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


1

Drupal 7のSpeed Up Cache Clearingというブログ投稿は、キャッシュクリアプロセスのどの部分が速度を落としているかを正確に絞り込むのに非常に役立つことがわかりました。機能モジュールエンティティAPIモジュールで特定された問題は私のサイトに影響を及ぼしていましたが、投稿で詳しく説明したプロセスは、Drupalコアおよびブレークポイントモジュールで発生した問題を追跡するのにも役立ちました。

プロセスを完了するには時間がかかりますが、キャッシュのクリアを数分から1分未満に減らすのに役立ちました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.