メモリ マップト ファイルから取得したデータをキャッシュすることに意味はありますか?
-
22-09-2019 - |
質問
それとも、OS が独自のキャッシュを実装している可能性があるため、マップされたメモリからそのデータをもう一度読み取る方が高速でしょうか?
データの性質は事前には分からないため、ファイルの読み取りはランダムであると想定されます。
解決
この件に関して私が読んだことをいくつか述べたいと思います。答えは いいえ, 、オペレーティング システムのメモリ マネージャーを再推測する必要はありません。
1 つ目は、自分のプログラムが欲しいという考えから来ます (例:MongoDB、SQL Server) を使用して、空き RAM の割合に基づいてメモリを制限しようとします。
空き領域が x% になるまでメモリを割り当てないでください。
場合によっては、顧客から、空き領域が x% になるまで RAM を消費し続けるようにプログラムを設計する方法を求められることがあります。その考えは、プログラムが RAM を積極的に使用しながら、他の用途に使用できる十分な RAM (x%) を残すべきであるということです。コンピューター上で唯一のプログラムが実行されるシステムを設計している場合を除き、これは悪い考えです。
(説明については記事を読んでください) なぜ 写真も含めて悪いです)
次に、Varnish とリバース プロキシの作者からのいくつかのメモを示します。
ワニスキャッシュ - 建築家からのメモ
つまり、Squid の精緻なメモリ管理で何が起こるかというと、イカはカーネルの精緻なメモリ管理と争いになり、他の内戦と同じように、何も解決しないのです。
何が起こるかというと、次のとおりです。Squid は HTTP オブジェクトを「RAM」に作成し、作成後すぐに使用されます。その後、しばらくするとヒットがなくなり、カーネルがこれに気づきます。次に、誰かが何かのためにカーネルからメモリを取得しようとすると、カーネルはそれらの未使用のメモリ ページをスワップ領域にプッシュし、実際にプログラムで使用される一部のデータのために (キャッシュ RAM) をより賢明に使用することを決定します。ただし、これはイカが知らないうちに行われます。Squid はこれらの http オブジェクトが RAM にあると依然として認識しており、アクセスしようとした瞬間にそうなりますが、それまでは RAM は何か生産的な目的で使用されます。
あなたを想像してみてください する メモリマップされたファイルから何かをキャッシュします。将来のある時点で、その「キャッシュ」を保持するメモリはディスクにスワップアウトされるでしょう。
- OS がハードドライブに何かを書き込みました もう存在している ハードドライブ上で
次に、「実際の」メモリではなく「キャッシュ」メモリからルックアップを実行したいときが来ます。「キャッシュ」にアクセスしようとすると、キャッシュは RAM からスワップアウトされているため、ハードウェアによってエラーが発生します。 PAGE FAULT
, 、キャッシュが RAM にスワップバックされます。
- キャッシュ メモリは「実際の」メモリと同じくらい遅いです。両方とも RAM 内に存在しないためです。
最後に、キャッシュを解放します (プログラムがシャットダウンしている可能性があります)。「キャッシュ」がスワップアウトされている場合、OS はまずキャッシュを解放できるようにスワップインし直す必要があります。代わりに、メモリマップされたファイルのマップを解除しただけであれば、すべてが失われます (何もスワップインする必要はありません)。
- この場合、キャッシュにより動作が遅くなります
再びレイモン・チェンから:アプリケーションが閉じようとしている場合は、すでに閉じています。
DLL_PROCESS_DETACH がプロセスが終了していることを通知した場合、最善の策は何もせずに戻ることです。
私はこのルールに従わないプログラムを定期的に使用しています。プログラム その寿命の間に多くのメモリを割り当て、私が プログラムを終了すると、数分間、時にはそこに座っています 100%CPUで回転し、ハードドライブをかき回すことがあります(時々 両方)。何が起こっているのかを確認するためにデバッガに割り込むと、 プログラムが生産的なことを何もしていないことを発見します。ただ、 中に割り当てたメモリの最後のバイトをすべて系統的に解放します。 その寿命。
私のコンピュータが多くのメモリ不足に陥っていなければ、ほとんどの プログラムが存続期間中に割り当てたメモリは、まだ ページアウトされるため、メモリの最後の一滴まで解放すると、CPU バウンドになります 操作。一方、ビルドを開始したり、 メモリを大量に消費する他の何か、次にメモリのほとんどがプログラム が有効期間中に割り振られていた場合、つまり プログラムは、そのすべてのメモリをハードドライブからページバックします それはそれで自由に呼ぶことができる。実際のところ、ちょっと意地悪に聞こえます。「さあ、 ここへ行けと言わせてやるから」
このような手間のかかる記憶管理はすべて無意味です。プロセス が終了します。そのすべてのメモリは、アドレス空間が 滅びる。時間を無駄にするのはやめて、すぐに終了してください。
現実には、プログラムはもう実行されません。 "ラム", 、彼らは走り込みます メモリ - バーチャル メモリ。
あなた できる キャッシュを利用しますが、作業が必要です と オペレーティング システムの仮想メモリ マネージャー:
- キャッシュを最小限に抑えたい場合 ページ できるだけ
- 頻繁にアクセスされるため、それらが RAM に確実に残るようにしたいとします。実際には便利なキャッシュです)
アクセス:
- 400 GB のファイルの周りに 1,000 の 1 バイトの場所
にアクセスするよりもはるかに高価です
- 400GB ファイル内の単一の 1000 バイトの場所
言い換えると:本当に必要ありません キャッシュ データの場合、よりローカライズされたデータが必要です データ構造.
重要なデータを 1 つの 4K ページに限定しておくと、VMM をより快適に使用できるようになります。ウィンドウズ は あなたのキャッシュ。
64 バイトのクアッドワードでアライメントされたキャッシュ ラインを追加すると、データ構造のレイアウトを調整する意欲がさらに高まります。でもそれではあなたはそれを望まない あまりにも コンパクトにしないと、キャッシュのフラッシュによるパフォーマンスの低下に悩まされることになります。 フォールスシェアリング.
他のヒント
答えは非常にOS固有のものです。一般的に言って、このデータをキャッシュしても意味はありません。どちらも「キャッシュされた」データだけでなく、メモリマップドは、いつでも離れてページングすることができます。
それはOSに固有になりますどんな違いがあるでしょう場合は、- 。あなたはその粒度を必要としない限り、データをキャッシュでは意味がありません。