インデックスまたはファイルの一部が繰り返しアクセスされる、圧縮されたオンディスク インデックスまたはオンディスク ファイルで動作するアプリケーションを開発する場合 (議論のために、Zipfian ディストリビューションに似たものとしましょう)、いつそれが十分なのか疑問に思います/ OS レベルのキャッシング (たとえば、Debian システムでのメモリ マッピング) に依存する方が良いです。また、アプリケーション層に何かを実装する方が良いのはいつですか (たとえば、FileChannelバッファリングや Memcached、または Java コードのカスタム LRU キャッシュなど)。 )。
たとえば、ある記事(Solr を参照) では、OS キャッシュ用にメモリを解放しておくことを主張しています。
OS のキャッシュは非常に便利です。(サーバーを完全に再起動した後でも) クエリに応答するのに必要な時間が大幅に短縮されるため、OS 用にメモリを解放しておくことを常に忘れないでください。
これにより、LRU Java オブジェクトへの脆弱なマップでメモリを埋めるアプリケーション レベルのキャッシュが、良いことよりも悪いことをしているのかどうか疑問に思いました。Javaはメモリオーバーヘッドの点で非常に貪欲であるため、そのメモリを使用していくつかの最終結果オブジェクトをキャッシュする代わりに、OSがそのスペースを使用して多くの生の圧縮データをキャッシュする方がよいでしょうか? 一方、アプリケーション層のキャッシュは、プラットフォームの独立性に優れているため、コードが実行されている OS に関係なくキャッシュできます。
そのため、いくつかの特定のベンチマークを実行する以外に、原則に基づいた方法でその質問に答える方法がわからないことに気付きました。それは私に尋ねるように導きます...
アプリケーション レベルのキャッシュに使用可能なメモリを割り当てるか、OS レベルのキャッシュに使用可能なメモリをそのままにしておくかについて、一般的なガイドラインはありますか?
特に、アプリケーション レベルのキャッシュをコーディングすることが時間の無駄である場合や、パフォーマンスに悪影響を与える場合さえある場合に、より適切に認識できるようになりたいと思っています。