データベースサーバーがビジーで、Drupalのキャッシュをクリアしようとすると、DrupalはTRUNCATE
キャッシュテーブルを試行し、MySQLが最大数に達するまでバックログが発生します。ユーザー接続(800)これは私たちに問題を引き起こしています。
私たちが知る限り、問題はテーブルの切り捨て中のロックが原因です。
この状況を回避するのに役立つ、キャッシュをクリアする別の方法はありますか?
キャッシュビンはMySQLにありますが、テーブルを切り捨てることは、キャッシュをクリアする最も速い方法です。これは特にコストのかかる操作ではないため、db接続をバックアップしている場合は、sysadminに設定の問題の原因を調査してもらいます(または単にリソースが不足しているかどうか)。
上記のコメントでMPDが指摘しているように、実際の問題は実際にはキャッシュの再構築である可能性がありますafterただし、フラッシュが発生しました。少しテストすると、それを確認できるはずです。
データベースの代わりに redis / memcache /etcをキャッシュバックエンドとして使用することで、データベースの負荷を軽減できます。これを行うと、サイト全体の速度が大幅に向上します。
もちろん、走行距離は異なりますが、メモリからのキャッシュのフラッシュは、ディスクからのフラッシュよりも高速な操作になる可能性が非常に高くなります。以下のMołotが指摘しているように、新しいキャッシュアイテムをディスクではなくメモリに書き込むと、パフォーマンスが向上します(MySQLへの読み取りと書き込みは引き続き行われますが、理論的には書き込みははるかに少なくなります)。
何でもそうですが、ベアメタルでテストして、これが特定の構成にどのように影響するかを確認する必要があります。
_drush cc all
_を使用している場合、または[パフォーマンス]ページ(admin/config/development/performance)からキャッシュをクリアしている場合は、最終的に drupal_flush_all_caches()
を呼び出します。この意志
キャッシュテーブルの実際のクリアはかなり高速ですが、他の操作はかなりコストがかかります。さらに、次のページの読み込み([パフォーマンス]ページにリダイレクトされたときなど)で、すべてのキャッシュテーブルを再構築します。
キャッシュクリアの問題が発生した場合、根本的な原因は通常、LAMPスタックの設定ミスです。 MySQLをバッファや最大接続などに適切にプロビジョニングできるように、システムの過負荷を防ぐためにApacheプロセスの最大数を計算することが役立ちます。
さらに、ライブ環境では、drupal_flush_all_caches()
からすべてを再構築する必要はありません。通常は、キャッシュテーブル自体をクリアするだけです。この場合、私はこれの変形を使用します:
_/**
* Implements hook_form_FORM_ID_alter().
*/
function MYMODULE_form_system_performance_settings_alter(&$form, $form_state) {
$form['clear_cache']['clear_forward'] = array(
'#type' => 'submit',
'#value' => t('Clear all forward facing caches'),
'#submit' => array('MYMODULE_clear_forward_submit'),
);
}
function MYMODULE_clear_forward_submit($form, &$form_state) {
MYMODULE_clear_forward_caches();
}
function MYMODULE_clear_forward_caches() {
$cache_tables = array(
'cache',
'cache_block',
'cache_filter',
'cache_page',
'cache_views',
);
foreach ($cache_tables as $table) {
cache_clear_all('*', $table, TRUE);
}
drupal_set_message(t('Cleared forward facing caches.'));
}
_
これにより、新しい送信ボタンが[パフォーマンス]ページに追加され、Webサイトの前向きの部分(メインページ)に影響するキャッシュがクリアされます。これはそのままでは使用しません。環境に合わせてテーブルリストを調整する必要があります。最近では、これをより一般的なものにして、パブリックモジュールとしてリリースします。
drush
like drush -y cc all
コマンドを使用するか、次の1行でテーブルを手動でTRUNCATE/DELETEすることができます。
drush sqlq --extra=--skip-column-names "SHOW TABLES LIKE 'cache%'" | xargs -L1 -I% echo "DELETE FROM %;" | drush sqlc --extra=-v