Linuxのバッファメモリとキャッシュメモリの違いは何ですか?


179

私にはそれが2つのLinuxのメモリコンセプトの違い何明確ではありません。buffercache。私はこの投稿を読みましたが、それらの違いは有効期限ポリシーであるように思えます:

  1. バッファのポリシーは先入れ先出しです
  2. キャッシュのポリシーは、最近使用されていないです。

私は正しいですか?

特に、私は2つのコマンドで探しています:freevmstat

james@utopia:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
5  0      0    173     67    912    0    0    19    59   75 1087 24  4 71  1
james@utopia:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2007       1834        172          0         67        914
-/+ buffers/cache:        853       1153
Swap:         2859          0       2859

両方の用語は異なる意味で使用されています。freeコマンド出力を参照していますか?
Leonbloy、2011年

3
あなたは正しい、私は2つのコマンドを見ています:free、vmstat。私の更新を参照してください。
James.Xu

回答:


69

「バッファ」は、RAMのどの部分がキャッシュディスクブロック専用であるかを表します。「キャッシュ」は「バッファ」と似ていますが、今回はファイルの読み取りからページをキャッシュします。

引用元:


3
私は、大量のブロックを書き込む単純なpythonプログラムを使用してこれをテストしました。何が起こるのかは、ではなく、cacheによって報告されたとおりにが満たされることです。この列はディスクの書き込みと読み取りの両方をカウントし、別の目的で使用されると思います。free -w -hbufferscachebuffers
CMCDragonkai 2018

@CMCDragonkai実験的証拠に感謝します。興味深い質問は、ディスクがフラッシュするよりも速く書き込むかどうかです。(たとえば、同期には長い時間がかかります)ダーティブロックがクリーンなブロックとは異なる方法でカウントされるかどうかを通知します。Linuxは確かに両方のタイプをキャッシュします(質問で述べたようにlru)が、メモリのプレッシャーの点ではるかに深刻です。
セスロバートソン

179

バッファは特定のブロックデバイスに関連付けられており、ファイルシステムメタデータのキャッシュと、処理中のページの追跡をカバーします。キャッシュには、パークされたファイルデータのみが含まれます。つまり、バッファは、ディレクトリの内容、ファイルのアクセス許可を記憶し、特定のブロックデバイスに対してどのメモリが読み書きされているかを追跡します。キャッシュには、ファイル自体の内容のみが含まれます。

引用リンク


1
短くてよく説明されています。ありがとう。
curiousguy 2015

84

引用回答(参考):

短い答え:Cachedは、ページキャッシュのサイズです。バッファは、メモリ内のブロックI / Oバッファのサイズです。キャッシュされた問題; バッファはほとんど関係ありません。

長い答え:キャッシュとは、Linuxページキャッシュのサイズからスワップキャッシュ内のメモリを差し引いたサイズであり、SwapCachedで表されます(したがって、ページキャッシュの合計サイズはCached + SwapCachedです)。Linuxは、ページキャッシュを通じてすべてのファイルI / Oを実行します。書き込みは、ページキャッシュ内の対応するページをダーティとしてマークするだけで実装されます。その後、フラッシャースレッドは定期的にダーティページをディスクに書き戻します。読み取りは、ページキャッシュからデータを返すことによって実装されます。データがまだキャッシュにない場合は、最初にデータが取り込まれます。最近のLinuxシステムでは、Cachedは数ギガバイトにもなり得ます。それはメモリの圧力に応じてのみ縮小します。システムはページキャッシュを消去し、データをディスクにスワップアウトして、必要に応じてより多くのメモリを使用できるようにします。

バッファはメモリ内ブロックI / Oバッファです。彼らは比較的短命です。Linuxカーネルバージョン2.4以前は、Linuxには個別のページキャッシュとバッファキャッシュがありました。2.4以降、ページキャッシュとバッファキャッシュは統合され、Buffersはページキャッシュに表示されないrawディスクブロック、つまりファイルデータではありません。したがって、バッファメトリックの重要性は最小限です。ほとんどのシステムでは、バッファーは数十メガバイトに過ぎないことがよくあります。


7
「バッファはほとんど関係ない」-いいえ。多くの場合、ファイルコンテンツのキャッシュは関係ありませんが、メタデータをキャッシュに保持することで速度が向上します。たとえば、ビデオストリーミングNASサーバー。
Gunther

大量のI / Oを実行するシステムは、バッファに大量のメモリを使用します。私は100GBのMySQL / InnoDBデータベースをバルクロードしていますが、バッファは常に2GBを超えています。
Marcelo Pacheco

21

これほど単純ではありませんが、理解に役立つ場合があります。

バッファは、ファイルのメタデータ(権限、場所など)を格納するためのものです。すべてのメモリページはここで追跡されます。

キャッシュは実際のファイルの内容を保存するためのものです。


5
IOW、バッファ=メタデータ; キャッシュ=データ;
Freedom_Ben 2014年

13

RedHatによる説明:

キャッシュページ:

キャッシュはメモリの一部であり、データを透過的に格納するので、そのデータに対する将来の要求に迅速に対応できます。カーネルはこのメモリを使用して、ディスクデータをキャッシュし、I / Oパフォーマンスを向上させます。

Linuxカーネルは、ローカルおよびリモートのファイルシステムとディスクからの情報をキャッシュするためにできるだけ多くのRAMを使用するように構築されています。時間が経過してシステムでさまざまな読み取りと書き込みが実行されると、カーネルは、システムで実行されているさまざまなプロセスのデータ、または近い将来使用される関連プロセスのデータをメモリに保存しようとします。キャッシュは、プロセスが停止/終了するときに回収されませんが、他のプロセスが使用可能な空きメモリよりも多くのメモリを必要とする場合、カーネルはヒューリスティックを実行して、キャッシュデータを格納し、そのメモリを新しいプロセスに割り当てることにより、メモリを回収します。

あらゆる種類のファイル/データが要求されると、カーネルはユーザーが操作しているファイルの一部のコピーを探し、そのようなコピーが存在しない場合は、キャッシュメモリの新しいページを1つ割り当てて、ディスクから読み取られた適切な内容。

キャッシュ内に格納されるデータは、以前に計算された値、またはディスクの他の場所に格納されている元の値の複製である可能性があります。一部のデータが要求されると、まずキャッシュがチェックされ、そのデータが含まれているかどうかが確認されます。データは、ソースオリジンからよりもキャッシュからすばやく取得できます。

SysV共有メモリセグメントもキャッシュとして扱われますが、ディスク上のデータを表すものではありません。ipcs -mコマンドを使用してバイト列を確認すると、共有メモリセグメントのサイズを確認できます。

バッファ:

バッファーは、ページキャッシュの下に格納されるデータのディスクブロック表現です。バッファには、ページキャッシュの下にあるファイル/データのメタデータが含まれています。例:ページキャッシュに存在するデータの要求がある場合、カーネルは最初に、ページキャッシュに含まれる実際のファイル/データを指すメタデータを含むバッファー内のデータをチェックします。メタデータからファイルの実際のブロックアドレスがわかると、それは処理のためにカーネルによって取得されます。


12

バッファとキャッシュ。

バッファは、まだディスクに「書き込む」必要があるものです。

キャッシュは、ディスクから「読み取られ」、後で使用するために保存されるものです。


2
新規ユーザー向けヒント:回答を質問にできるだけ明確に関連付けます。私があなただったら、「あなたの例で...」で始まるセクションをあなたの回答に追加し、それについて少し詳しく説明します。
Piotr Wadas 2012

25
私はこの答えが質問のそれと同じ文脈では真実ではないと思います(つまり、Linuxカーネルが「バッファ」と「キャッシュ」によって何を意味するか
Freedom_Ben

8

このページは、バッファとキャッシュの違いを深く理解するのに役立つと思います。http://www.tldp.org/LDP/sag/html/buffer-cache.html

ディスクからの読み取りは、(実際の)メモリへのアクセスに比べて非常に遅くなります。さらに、比較的短い期間にディスクの同じ部分を数回読み取るのが一般的です。たとえば、最初に電子メールメッセージを読んでから、返信時にレターをエディターに読み込み、それをフォルダーにコピーするときに、メールプログラムに再度それを読み取らせることができます。または、ls多くのユーザーがいるシステムでコマンドが実行される頻度を検討してください。ディスクから情報を1回だけ読み取り、不要になるまでメモリに保持することで、最初の読み取り以外のすべてを高速化できます。これはディスクバッファリングと呼ばれ、その目的で使用されるメモリはバッファキャッシュと呼ばれます。

残念ながら、メモリは有限であり、限られたリソースであるため、バッファキャッシュは通常、十分に大きくすることはできません(使用したいすべてのデータを保持することはできません)。キャッシュがいっぱいになると、最も長い間使用されなかったデータが破棄され、解放されたメモリが新しいデータに使用されます。

ディスクバッファリングは書き込みでも機能します。一方では、書き込まれたデータはすぐに再度読み取られることが多いため(たとえば、ソースコードファイルがファイルに保存され、コンパイラーによって読み取られる)、キャッシュに書き込まれたデータを書き込むことをお勧めします。一方、データをキャッシュに入れるだけで、ディスクに一度に書き込むのではなく、書き込むプログラムの実行が速くなります。その後、他のプログラムを遅くすることなく、書き込みをバックグラウンドで実行できます。


これはバッファキャッシュとは何かを説明していますが、vmstatコマンドとfreeコマンドの出力におけるバッファとキャッシュの違いは説明していません。
Roel Schroeven

4

Seth Robertsonのリンク2は、「これらの用語を完全に理解するには、Robert M. LoveによるLinux Kernel DevelopmentのようなLinuxカーネルの本を参照してください。」と述べました。

本の第2版に「バッファ」に関するコンテンツが見つかりました。

物理デバイス自体はセクターレベルでアドレス指定できますが、カーネルはブロックの観点からすべてのディスク操作を実行します。

ブロックがメモリに保存されると(たとえば、読み取りまたは書き込みが保留された後)、「バッファ」に保存されます。各「バッファ」は正確に1つのブロックに関連付けられています。「バッファ」は、メモリ内のディスクブロックを表すオブジェクトとして機能します。

「バッファ」は、単一の物理ディスクブロックのメモリ内表現です。

ブロックI / O操作は、一度に1つのディスクブロックを操作します。一般的なブロックI / O操作は、iノードの読み取りと書き込みです。カーネルは、ディスクから単一ブロックの低レベルの読み取りを実行するbread()関数を提供します。「バッファ」を介して、ディスクブロックは関連するメモリ内ページにマップされます。」


2

バッファには、書き込みパフォーマンスの向上に役立つメタデータが含まれています

キャッシュには、ファイルのコンテンツ自体が含まれている(ディスクに書き込まれていない場合もある)ため、読み取りパフォーマンスが向上します。


1

本からの引用: 情報検索の概要

キャッシュ

できるだけ多くのデータ、特に頻繁にアクセスする必要のあるデータをメモリに保持したいと考えています。頻繁に使用されるディスクデータをメインメモリキャッシングに保持する手法を呼び出します。

バッファ

オペレーティングシステムは通常、ブロック全体を読み書きします。したがって、ディスクから1バイトを読み取るには、ブロック全体を読み取るのと同じくらいの時間がかかります。8、16、32、および64キロバイト(KB)のブロックサイズが一般的です。読み書きされるブロックがバッファに格納されるメインメモリの部分を呼び出します。


0

バッファーは、コンピューター内のある場所から別の場所にデータが移動される間、データを一時的に保持するために使用されるメモリ領域です。キャッシュは、頻繁にアクセスされるデータを迅速にアクセスできるように格納できる一時的なストレージ領域です。データがキャッシュに格納されると、元のデータを再フェッチするのではなく、キャッシュされたコピーにアクセスすることで将来の使用が可能になるため、平均アクセス時間が短くなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.