これは私が時々見た古い質問です。私の理解はかなり限られています(かなり前に違いについて読んだことがありますが、関係するファクトイドは実際には行き詰まりません)。
私が理解したように、
バッファ
アクティブなI / O操作、つまりディスクへの書き込みを待機しているデータを持つプログラムによって使用されます
キャッシュ
完了したI / O操作、つまり、フラッシュされたバッファ、または要求を満たすためにディスクから読み取られたデータの結果です。
後世について明確な説明を得ることができますか?
これは私が時々見た古い質問です。私の理解はかなり限られています(かなり前に違いについて読んだことがありますが、関係するファクトイドは実際には行き詰まりません)。
私が理解したように、
バッファ
アクティブな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があると仮定すると、マシンがすでに過剰にコミットされている場合、スワップの一部が見つかる可能性があります)メモリ使用量の)。freeへの各呼び出しの前の「sync; echo 3> / proc / sys / vm / drop_caches」は、すべての書き込みバッファー(sync)で保留中のものを書き込み、すべてのキャッシュ/バッファーされたディスクブロックをメモリから消去します。 「キャッシュされた」値での割り当て。
仮想マシン(VMWareで実行されているマシンなど)で使用されるRAMは、現在開いているメモリマップファイルで使用される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つ割り当ててそれを埋めます適切なコンテンツがディスクから読み出されます。
キャッシュ内に格納されるデータは、以前に計算された値、またはディスクの他の場所に格納されている元の値の複製である場合があります。一部のデータが要求されると、まずキャッシュがチェックされ、そのデータが含まれているかどうかが確認されます。データは、ソースからよりもキャッシュからより迅速に取得できます。
SysV共有メモリセグメントもキャッシュとして扱われますが、ディスク上のデータを表すものではありません。ipcs -mコマンドを使用してバイト列をチェックすると、共有メモリセグメントのサイズを確認できます。
バッファ:
バッファは、ページキャッシュの下に保存されるデータのディスクブロック表現です。バッファには、ページキャッシュの下にあるファイル/データのメタデータが含まれます。例:ページキャッシュに存在するデータの要求がある場合、カーネルはまず、ページキャッシュに含まれる実際のファイル/データを指すメタデータを含むバッファ内のデータをチェックします。メタデータからファイルの実際のブロックアドレスがわかると、カーネルは処理のためにそれを取得します。
警告これは、本番サーバーでは推奨されない強力な方法を説明しています!だからあなたは警告されている、何かがうまくいかなくても私を責めないでください。
理解のために、事は、あなたは可能性があり、強制的に可能な限り多くのメモリを委任するようにシステムを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
注、これを行ったホストは強く使用されています。これは、非常に静かなマシンでより重要になります。