Linux のキャッシュ RAM を削除する

Linux のキャッシュ RAM を削除する

私は 8GB の RAM を搭載した Web サーバーを所有しており、ファイル操作、グラフ作成、電子メール、フォーラムなど、さまざまな機能を備えた、かなり負荷の高い PHP サイト (1 サイト) を実行しています。環境は静的とはほど遠く、サーバーへのほぼすべてのリクエストで新しいページまたは更新されたページが作成されるため、RAM に何かをキャッシュしてもほとんどメリットがないと考えています。また、多くのキャッシュはクライアント側で行われるため、画像、JavaScript、CSS に関しては 304 リクエストが大量に発生します。

さらに、サーバー上のフラット ファイルに書き込まれる言語ファイルもありますが、ディスクから読み取るよりもキャッシュされた RAM の方が間違いなく便利です。ただし、このようなファイルはほんのわずかです。

約 2 週間で、空き RAM が 98% から 4% に減少しました。これは、いくつかの大規模な SVN 更新をサーバーにプッシュしている間に発生しました。

私の質問は、次のコマンドを使用してキャッシュを定期的にクリアすると (Linus Torvalds のキャッシュに関する考えは理解しています)、サーバーのチューニングが向上するかどうかです。

sync; echo 3 > /proc/sys/vm/drop_caches

または、次のファイルを編集したほうがよいでしょうか。

/proc/sys/vm/swappiness  

デフォルト値の 60 を 30 に置き換えると、スワップが大幅に減少し、古いキャッシュの再利用が大幅に増加するはずです。

最初のコマンドを使用してすべてのキャッシュが解放されるのを見るのは確かに気持ちがいいですが、これがデスクトップ環境に適していると言ったら嘘になります。しかし、上で説明したような Web サーバーの場合はどうでしょうか? ご意見をお聞かせください。

編集: システムは必要に応じてキャッシュ メモリからメモリを取得することは承知していますが、明確にするためにその点を指摘していただきありがとうございます。サーバー メモリのほとんどがキャッシュに保存されているときに Apache の速度が低下するのは私の想像でしょうか。これはまったく別の問題でしょうか。

答え1

キャッシュをクリアするとパフォーマンスは低下しますが、改善されることはありません。RAM が他の用途に必要な場合は、他の用途で使用されるため、クリアを実行した後しばらくの間、キャッシュのヒット/ミス率が低下するだけです。

キャッシュ内のデータが非常に古い場合 (つまり、異常な操作中にキャッシュされたデータ)、意図的にクリアしなくても、必要に応じて「新しい」データに置き換えられます。

通常どおりに実行する唯一の理由sync; echo 3 > /proc/sys/vm/drop_cachesは、I/O パフォーマンス テストをいくつか実行しようとしていて、既知の状態から開始したい場合です (実行ごとにキャッシュが異なる方法で準備されるため、実行間でキャッシュ ドロップを実行して結果の違いを減らす)。

カーネルは、キャッシュ/バッファから取り戻すことができるRAMが十分にあるにもかかわらず、いくつかのページをスワップすることがあります。サーバーでこれが問題になる場合は、swappiness設定を微調整することでこれを止めることができます。これにより、わずかなメリットが得られるかもしれませんが、一時的なパフォーマンスの低下が見られる可能性があります。落とすキャッシュ+バッファを人為的にクリアする。

関連情報