Drupal 7サイトの1つには、数千のフィールド、多数のコンテンツタイプ、25を超えるビュー、および数百(まもなく数千)のプロファイルタイプがあります。このため、エンティティフィールド情報をより適切にキャッシュするコアパッチ(http://drupal.org/node/1040790)と、(1つのHUGEを使用する代わりに、表示によってビューをより適切にキャッシュする-devバージョンのViewを使用しています。すべてのビューデータを含むビューキャッシュ行)。
これにより、サイト上のほとんどのページが160MB以上ではなく20-30MBのRAMを使用して読み込まれます(10MB以上のフィールドとビューのcache_ *テーブル行をプルアップする代わりに、パッチはcache_ *データをより効率的に維持するのに役立ちます)。
ただし、キャッシュの再構築には非常に長い時間がかかるという問題があります。通常、1分または2分以上。また、この間、Drupalはページをロードしません(読み取ろうとしているキャッシュがまだ構築されていないため、他のリクエストは待機する必要があります)。
トラフィックの少ないサイクルでは、これは大した問題ではありません。100人程度のユーザーは、ページが読み込まれるまで1分間待つだけです。しかし、トラフィックの多いサイクルでは、Apacheサーバーは40以上のCPU負荷で狂い始め、すべてのワーカースレッドが待機しているためにメモリがすぐに一杯になり、メモリを使い果たしてスワップを引き起こします。それは一種の死のスパイラルです。httpdを再起動すると問題は解決しますが、正常に戻るには5〜10分かかります。
私の目標は、キャッシュをクリアしてもサイトがひどくならないようにすることです。たとえば、admin_menuの個々のキャッシュクリア機能(「CSS and JS」、「Menu」、「Theme registry」など)を使用すると、「Page and else」オプションを押すまでスムーズに進みます。それは、ビューのキャッシュがリセットされるとき(キャッシュする必要があるビューの数を含む非常にCPUとデータベースに負荷がかかる操作)、およびフィールド情報キャッシュがリセットされるときです(このサイトでもCPUとデータベースに負荷がかかります)。
だから...私の質問/アイデア:
- ブラシや他のシェルスクリプトを使用して、「すべてのキャッシュを一度に爆発させ、クリーンな再構築を期待する」よりも賢い方法でキャッシュをクリアすることは可能ですか?
- キャッシュのクリア中にhttpリクエストをブロックして、Apacheが大量のキャッシュスタンプリクエストで詰まらないようにできますか?
- Drupal /通常のhttpdリクエスト以外でキャッシュをクリアできる場合、おそらくキャッシュクリア操作に高いPHP memory_limitを設定し、ユニバーサルmemory_limitを元に戻すことができます(個々のhttpdスレッドがキャッシュをクリアする必要がある場合は、現在256MBに設定されています) ...)。
基本的に:UIのボタンをクリックするdrush cc all
か、使用する以外に、Drupalですべてのキャッシュをクリアするインテリジェントで優雅な方法はありますか?
[ 明確化のための編集:私が抱える主な問題は、キャッシュの再構築です。(a)時間がかかり、(b)再構築が完了するまで他のすべてのリクエストをブロックします。トラフィックの多い時間帯で再構築がそれほど致命的ではないようにする方法を見つけたいと思います。]