web-dev-qa-db-ja.com

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

私にとって、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
156
James.Xu

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

からの引用:

63
Seth Robertson

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

引用リンク

164
xoy

引用された回答(参照用):

簡単な答え:キャッシュはページキャッシュのサイズです。バッファは、メモリ内ブロックI/Oバッファのサイズです。キャッシュされた事項;バッファはほとんど無関係です。

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

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

77
socketpair

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

バッファは、ファイルのメタデータ(アクセス許可、場所など)を保存するためのものです。すべてのメモリページはここで追跡されます。

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

20
n00ber

バッファとキャッシュ。

バッファは、まだディスクに「書き込まれていない」ものです。

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

11
ChaiZhi

RedHatによる説明:

キャッシュページ:

キャッシュは、データの透過的な格納を行うメモリの一部であり、そのデータに対する今後のリクエストをより高速に処理できます。このメモリは、ディスクデータをキャッシュし、I/Oパフォーマンスを向上させるためにカーネルによって使用されます。

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

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

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

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

バッファ:

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

9
Ijaz Ahmad Khan

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

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

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

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

8
Eric

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

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

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

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

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

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

3
Chao Yin

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

キャッシュにはファイルの内容自体が含まれており(まだディスクに書き込まれていない場合があります)、読み取りパフォーマンスが向上します

2
karthik

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

キャッシュ

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

バッファ

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

0
yantaq

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

0
Abigail