Linuxでは、freeコマンドによって報告される「バッファ」と「キャッシュ」の違いは何ですか?


73

これは私が時々見た古い質問です。私の理解はかなり限られています(かなり前に違いについて読んだことがありますが、関係するファクトイドは実際には行き詰まりません)。

私が理解したように、

  • バッファ

    アクティブなI / O操作、つまりディスクへの書き込みを待機しているデータを持つプログラムによって使用されます

  • キャッシュ

    完了したI / O操作、つまり、フラッシュされたバッファ、または要求を満たすためにディスクから読み取られたデータの結果です。

後世について明確な説明を得ることができますか?



これはバッファにあるメタデータに似ており、ioバッファとは関係ありません。一部のカーネルバッファはスラブアロケータで考慮されますが、バッファまたはキャッシュメモリにはまったくカウントされません。
eckes

回答:


42

「キャッシュされた」合計には、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に保持された最近の読み取り/書き込みブロックをカウントして将来の物理読み取りを保存する」ほど単純ではありません。


1
興味深いニュアンスの場合は+1。これは私が探している種類の情報です。実際、数字は非常に複雑で、非常に多くの異なる活動に関与しているため、せいぜい一般的な指標であると思われます。
エイブリーペイン

少なくともqemu-kvmの場合、仮想マシンで使用されるRAMが「キャッシュ」としてカウントされるとは思わない。私のKVMホストでは、キャッシュ値が小さすぎて正しくない(1.9ギガ)だけでなく、VMの1つを破棄/起動しても変更されません。また、VMの1つでtmpfsマウントトリックを実行しても変わりません。そこに800Meg tmpfsパーティションを作成し、「cached」はVM上で適切な値を示しましたが、VMホスト上では変化しませんでした。ただし、VMを破棄または起動すると、「使用済み」の値は縮小/増加しました。
マイクS

...カーネル3.10.0-327を実行しているCentos 7.2.1511 VMホストでテストを実行しました。
マイクS

@MikeS:さまざまな仮想化ソリューションがメモリを処理する方法は異なります。実際、カーネルがメモリのさまざまな使用を測定する方法は、メジャーバージョンによって異なる場合があります。
デビッドスピレット16年

@MikeS:「VMの1つでtmpfsマウントトリックを実行する」ことについて-VMが使用する他のmemを表示していない場合、ホストの読み取りに影響しません。私はKVM VM自体に効果があります:dd free = 2020の前、dd free = 1899の後、drop fs free = 2001の後テスト)。ホストには変更が表示されない場合があります。メモリは、VMのプロセスで自由に使用できる場合でも、おそらくVMに割り当てられたままです。
デビッドスピレット16年

8

ひっかけ問題。空き領域を計算するとき、実際にはバッファとキャッシュの両方を追加する必要があります。これは私が見つけることができるものです

バッファは、まだディスクに「書き込まれていない」ものです。キャッシュは、ディスクから「読み取られ」、後で使用するために保存されたものです。

http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135


5

私はバッファについてより明確な説明を探していましたが、 "Professional Linux® Kernel Architecture 2008"

第16章:ページキャッシュとバッファキャッシュ

インタラクション

カーネルの他の部分にメリットがない場合、ページとバッファの間にリンクを設定してもほとんど意味がありません。既に述べたように、ブロックデバイスとの間の一部の転送操作は、サイズが基礎となるデバイスのブロックサイズに依存する単位で実行する必要がある場合がありますが、カーネルの多くの部分は、このようにページの粒度でI / O操作を実行することを好みます特にメモリ管理の点で、物事がずっと簡単になります。このシナリオでは、バッファーは2つの世界の間の仲介者として機能します。


3

RedHatによる説明:

キャッシュページ:

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

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

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

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

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

バッファ:

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


2

バッファ/キャッシュの解放

警告これは、本番サーバーでは推奨されない強力な方法を説明しています!だからあなたは警告されている、何かがうまくいかなくても私を責めないでください。

理解のために、事は、あなたは可能性があり、強制的に可能な限り多くのメモリを委任するようにシステムを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

注、これを行ったホストは強く使用されています。これは、非常に静かなマシンでより重要になります。


1
-1できれば。これは、(A)尋ねられた質問とは無関係であり、(B)キャッシュクリアランスをトリガーする恐ろしく鈍い方法の両方です。それが副作用としてフラッシュまでのデータでそれをスパムによって遵守にシステムをだまして正当ではありませんので、後者を行うには直接的な方法が存在する
underscore_d

なんてことだ!実際のサーバーでは絶対にしないでください!
タメルラハ

@Tamerlaha私は同意しますが、最初の段落をもう一度読んでください: あなたは警告されています、私を責めないでください!これの目的は、バッファ/キャッシュの意味を示すことです。
F.ハウリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.