私のサイトdrush cc all
の実行には4分以上かかります。サイトデータベースは数GBです。しかし、なぜ時間がかかるのか、はっきりとした理由はわかりません。ボトルネックを見つけるにはどうすればよいですか?
キャッシュテーブルを切り捨てるだけなので、キャッシュ自体をクリアするのに時間がかかりません。最も時間がかかるのは、その後キャッシュレジストリを再構築することです。通常、すべての新しいフックとすべての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
を追加してみてください。
非常に大きなデータベースがあり、キャッシュをクリアしていないときにシステムが正常に動作している場合は、セットアップを完全にサポートするのに十分なメモリがない可能性があります。
サイトがLinuxボックスで実行されている場合は、(シェルから)「top」を実行し、Shift-Mを押して、使用されているメモリでプロセスリストをソートします。次に、別の端末からキャッシュクリア操作を実行します。 mysqlとApacheがリストの一番上に表示されるはずです。これらの各プロセスが使用している合計メモリのパーセンテージ、および使用されている空き容量RAMが表示されます。大量の仮想スペースがある場合、すべての物理RAMが使い果たされた場合、この操作によりVMメモリがスラッシュし、実行時間が通常のごく一部にまで減少する可能性があります。
かつて、私は中間トラフィックを実行していましたDrupalセットアップをサポートするのに十分なメモリなしのボックス上のサイト。無関係な低トラフィックサイトでキャッシュクリアを実行したとき、キャッシュの再構築によってシステムが限界を超え、すべてがロックアップされたため、ここではシステム全体の動作が重要です。このため、「top」などのシンプルなツールを使用すると便利です。
ここで@ greg_1_andersonに(やや)反対します。
cc all
の実行中にシステムが完全にクラッシュしない場合、一般的なメモリの問題はないと思います。 LAMPサーバーのメモリが不足すると、スワップが発生します。スワップをヒットするアクティブなサーバーは、一連の悪さを引き起こします。システムのスローダウンのためにhttpdプロセスがスタックし始めます(スワップによりシステムの実行が非常に遅くなります)。これにより、より多くのスワップが使用されるようになります。大量のアクティブなhttpdプロセス。
あなたのシステムが最終的に戻ってきたら、私はあなたがうまくチューニングされていないと思います。 drush cc all
を使用すると、データベースアクセスが多くなるため、問題がより多く発生していると思います。私の提案は、サイトで mysqltuner を実行することです。マルチGBデータベースがある場合、私のguessは、innodb_buffer_pool_size
がリモートで適切にサイズ設定されておらず、MySQLインスタンスがスラッシングしていることです。また、データベースのフットプリントを小さく保つために、代替キャッシュバックエンドを調査します。
それはあなたのウェブホスティング環境かもしれません。ローカル設定、または共有ホスティングまたはVPS /サーバーでホスティングしているものを指しますか?
これは完全なソリューションではなく、遅延の原因を特定するのに役立つもう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クエリによるものではない場合、このツールは少なくともそれを確認します。
Speed Up Cache Clearing on Drupal 7 というタイトルのブログ投稿が、キャッシュクリアプロセスのどの部分が速度を低下させているのかを正確に絞り込むのに非常に役立つことがわかりました。 features module および entity api module で特定されている問題がサイトに影響を与えていましたが、この投稿で詳述されているプロセスは、私たちが遭遇した問題を追跡するのにも役立ちました Drupalコア および ブレークポイントモジュール 。
プロセスの処理には少し時間がかかりますが、キャッシュのクリアを数分から1分未満に減らすことができました。