8

インデックスまたはファイルの一部が繰り返しアクセスされる、圧縮されたオンディスク インデックスまたはオンディスク ファイルで動作するアプリケーションを開発する場合 (議論のために、Zipfian ディストリビューションに似たものとしましょう)、いつそれが十分なのか疑問に思います/ OS レベルのキャッシング (たとえば、Debian システムでのメモリ マッピング) に依存する方が良いです。また、アプリケーション層に何かを実装する方が良いのはいつですか (たとえば、FileChannelバッファリングや Memcached、または Java コードのカスタム LRU キャッシュなど)。 )。

たとえば、ある記事(Solr を参照) では、OS キャッシュ用にメモリを解放しておくことを主張しています。

OS のキャッシュは非常に便利です。(サーバーを完全に再起動した後でも) クエリに応答するのに必要な時間が大幅に短縮されるため、OS 用にメモリを解放しておくことを常に忘れないでください。

これにより、LRU Java オブジェクトへの脆弱なマップでメモリを埋めるアプリケーション レベルのキャッシュが、良いことよりも悪いことをしているのかどうか疑問に思いました。Javaはメモリオーバーヘッドの点で非常に貪欲であるため、そのメモリを使用していくつかの最終結果オブジェクトをキャッシュする代わりに、OSがそのスペースを使用して多くの生の圧縮データをキャッシュする方がよいでしょうか? 一方、アプリケーション層のキャッシュは、プラットフォームの独立性に優れているため、コードが実行されている OS に関係なくキャッシュできます。

そのため、いくつかの特定のベンチマークを実行する以外に、原則に基づいた方法でその質問に答える方法がわからないことに気付きました。それは私に尋ねるように導きます...

アプリケーション レベルのキャッシュに使用可能なメモリを割り当てるか、OS レベルのキャッシュに使用可能なメモリをそのままにしておくかについて、一般的なガイドラインはありますか?

特に、アプリケーション レベルのキャッシュをコーディングすることが時間の無駄である場合や、パフォーマンスに悪影響を与える場合さえある場合に、より適切に認識できるようになりたいと思っています。

4

1 に答える 1

5

最終的には、常に最初に測定し、分析し、次に最適化するというのが答えです。キャッシュありとなしでプロファイラーの下でアプリケーションを実行し、違いを確認します。直接観察に代わるものはありません。

そうは言っても、あなたの問題について考える原則的な方法があります。キャッシュができることを考えてみましょう。

  • 時間を記憶と引き換えに。関連する時間は、I/O 時間である場合もあれば、CPU 時間である場合もあります。
  • ワーキング セット メモリの急増と引き換えに、ワーキング メモリのより小規模で長期的な増加を実現します。

したがって、あなたの状況に応じて、次の質問をする必要があります。

  • キャッシュがないと、アプリケーションの I/O が制限されますか? 時間の 98% をデータの咀嚼に費やし、データの検索に 2% しか費やしていない場合、キャッシュがどれほど効率的であっても、あまり役に立ちません。(この場合、完全に効率的なキャッシュでも、パフォーマンスは約 2% しか向上しません。)
  • キャッシュ ヒットで回避できる作業はどれくらいですか? キャッシュ ヒットで 1 回の呼び出しが回避される場合fread()は、キャッシュがあまり役に立っていない可能性があります。しかし、キャッシュ ヒットがいくつかの非常に大きなファイルの数百ブロックをランダムにトラバースすることを回避できれば、多くの時間を節約できます。また、OS のディスク キャッシュのスペースを大幅に節約できるため、そのメモリを他の OS 操作に使用できるようになります。
  • キャッシュヒット率は?
  • 適切なヒット率 (通常は 75% 以上) を得るには、キャッシュをどれくらい大きくする必要がありますか? 答えが数百メガバイトにある場合は、OS のディスク キャッシュに任せた方がよいでしょう。

アプリケーションのこれらの側面 (キャッシュを使用するかどうか、キャッシュ用に確保するメモリの量など) を構成可能にし、設定をいじって、特定の用途に最適なものを確認すると、非常に役立つことがよくあります。シナリオ。

最近の最も興味深い開発の 1 つは、ソリッド ステート ドライブが利用可能になったことです。これらのドライブのスループットは、より優れたスピンドルほど高速ではありませんが、ランダム アクセスはしばしば際立っています。それは間違いなく物事を変えます。

繰り返しますが、コードのプロファイリングに代わるものはありません。

于 2012-10-27T18:37:55.923 に答える