これは私が時々見かけた古い質問です。それについての私の理解はかなり限られています(ずっと前に違いについて読んだことがありますが、含まれているファクトイドは実際には行き詰まりません)。
私が理解しているように、
バッファー
I/O操作がアクティブなプログラム、つまりディスクへの書き込みを待機しているデータによって使用されます
キャッシュ
完了したI/O操作の結果、つまり、要求を満たすためにフラッシュされたバッファーまたはディスクからデータが読み取られた結果です。
後世の明確な説明はありますか?
「キャッシュされた」合計には、tmpfsファイルシステムなどの他のメモリ割り当ても含まれます。これを実際に確認するには、次のことを試してください。
mkdir t
mount -t tmpfs none t
dd if=/dev/zero of=t/zero.file bs=10240 count=10240
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
umount t
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
そして、RAMベースのファイルシステムにコピーした100Mbの「キャッシュ」値の低下が表示されます(十分な空きRAMがあると仮定すると、マシンがすでに過度にコミットされている場合、RAMの一部がスワップで終了する可能性があります。メモリ使用量の)。 freeへの各呼び出しの前に "sync; echo 3>/proc/sys/vm/drop_caches"を実行すると、すべての書き込みバッファー(同期)で保留中のものがすべて書き込まれ、すべてのキャッシュ/バッファー付きディスクブロックがメモリから消去されるため、freeは他の読み取りのみになります。 「キャッシュされた」値の割り当て。
RAM仮想マシン(VMWareで実行されているものなど)によって使用されます)も、フリーの「キャッシュされた」値にカウントされる場合があります。RAM現在開いているメモリマップファイル(これは、使用しているハイパーバイザー/バージョンによって異なり、カーネルバージョン間でも異なる場合があります)。
したがって、「バッファは保留中のファイル/ネットワーク書き込みをカウントし、キャッシュはRAMに保持される最近の読み取り/書き込みブロックをカウント)」ほど単純ではありませんが、ほとんどの場合、この単純な説明はしましょう。
ひっかけ問題。空き容量を計算するときは、実際にはバッファとキャッシュの両方を合計する必要があります。これは私が見つけることができたものです
バッファは、まだディスクに「書き込む」必要があるものです。キャッシュとは、ディスクから「読み取られ」、後で使用するために保存されるものです。
http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135
バッファについてのより明確な説明を探していましたが、"Professional Linux® Kernel Architecture 2008"
第16章:ページとバッファキャッシュ
インタラクション
カーネルの他の部分に利点がない場合、ページとバッファ間のリンクを設定してもほとんど意味がありません。すでに述べたように、ブロックデバイスとの間の一部の転送操作は、サイズが基礎となるデバイスのブロックサイズに依存するユニットで実行する必要がある場合がありますが、カーネルの多くの部分は、このようにページの細分度でI/O操作を実行することを好みます特にメモリ管理の面で、物事がはるかに簡単になります。このシナリオでは、バッファは2つの世界の間の仲介者として機能します。
RedHatで説明:
キャッシュページ:
キャッシュはメモリの一部であり、データを透過的に格納するので、そのデータに対する将来の要求に迅速に対応できます。カーネルはこのメモリを使用して、ディスクデータをキャッシュし、I/Oパフォーマンスを向上させます。
Linuxカーネルは、ローカルおよびリモートのファイルシステムとディスクからの情報をキャッシュするためにできる限り多くのRAMを使用するように構築されています。時間が経過するにつれて、さまざまな読み取りと書き込みが行われます。システム上で実行されると、カーネルは、システム上で実行されているさまざまなプロセスのデータ、または近い将来に使用される関連プロセスのデータをメモリに保存しようとします。キャッシュは、プロセスの実行時に回収されません。停止/終了を取得しますが、他のプロセスが空きメモリよりも多くのメモリを必要とする場合、カーネルはヒューリスティックを実行して、キャッシュデータを保存し、そのメモリを新しいプロセスに割り当てることにより、メモリを再利用します。
あらゆる種類のファイル/データが要求されると、カーネルはユーザーが操作しているファイルの一部のコピーを探し、そのようなコピーが存在しない場合は、キャッシュメモリの新しいページを1つ割り当てて、ディスクから読み取られた適切な内容。
キャッシュ内に格納されるデータは、以前に計算された値、またはディスクの他の場所に格納されている元の値の複製である可能性があります。一部のデータが要求されると、最初にキャッシュがチェックされ、そのデータが含まれているかどうかが確認されます。データは、ソースのOriginからよりもキャッシュからすばやく取得できます。
SysV共有メモリセグメントもキャッシュとして扱われますが、ディスク上のデータを表すものではありません。 ipcs -mコマンドを使用してバイト列を確認することで、共有メモリセグメントのサイズを確認できます。
バッファ:
バッファは、ページキャッシュの下に格納されるデータのディスクブロック表現です。バッファには、ページキャッシュの下にあるファイル/データのメタデータが含まれています。例:ページキャッシュに存在するデータの要求がある場合、カーネルはまず、ページキャッシュに含まれる実際のファイル/データを指すメタデータを含むバッファー内のデータをチェックします。メタデータからファイルの実際のブロックアドレスがわかると、それは処理のためにカーネルによって取得されます。
警告これは、本番サーバーでは推奨されない強力な方法を説明しています!だからあなたは警告されています、何かがうまくいかなくても私を責めないでください。
理解のために、あなたはforceキャッシュされたファイルをドロップするよりも多くのメモリをcache
に委任することができます:
テストを行う前に、ヒットを別のウィンドウで開くことができます。
$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 1 39132 59740 39892 1038820 0 0 1 0 3 3 5 13 81 1
1 0 39132 59140 40076 1038812 0 0 184 0 10566 2157 27 15 48 11
...
スワップの進化をリアルタイムで追跡するため。
注意:現在のディレクトリに空きディスクをできるだけ多く廃棄する必要があります。mem+ swapを使用します
$ free
total used free shared buffers cached
Mem: 2064396 2004320 60076 0 90740 945964
-/+ buffers/cache: 967616 1096780
Swap: 3145720 38812 3106908
$ tot=0
$ while read -a line;do
[[ "${line%:}" =~ ^(Swap|Mem)Total$ ]] && ((tot+=2*${line[1]}))
done </proc/meminfo
$ echo $tot
10420232
$ dd if=/dev/zero of=veryBigFile count=$tot
10420232+0 records in
10420232+0 records out
5335158784 bytes (5.3 GB) copied, 109.526 s, 48.7 MB/s
$ cat >/dev/null veryBigFile
$ free
total used free shared buffers cached
Mem: 2064396 2010160 54236 0 41568 1039636
-/+ buffers/cache: 928956 1135440
Swap: 3145720 39132 3106588
$ rm veryBigFile
$ free
total used free shared buffers cached
Mem: 2064396 1005104 1059292 0 41840 48124
-/+ buffers/cache: 915140 1149256
Swap: 3145720 39132 3106588
注、これを実行したホストは強く使用されています。これは、本当に静かなマシンではより重要になります。