24

これは以前に尋ねられましたが、古いスレッドであったため、同じスレッドを再度更新したくありません。

freeコマンドの出力からの「バッファ」および「キャッシュ」列について自分自身を明確にしたい。

これが私の理解です...

バッファは、データがメモリ内にあるものの、まだディスクにフラッシュされていないものです。データはデーモンによって定期的にディスクにフラッシュされますが、コマンドbdflushを実行して手動でフラッシュすることもできますsync

一方、キャッシュは、メモリにロードされるプログラム/データですが、メモリに保持されるため、再度必要になった場合にすぐに利用できます。

buffers の概念を理解するために、次の実験を試みました...

freeこれは私のデスクトップでのコマンドの読み取りです

[zama@localhost ~]$ free -m
             キャッシュされた使用済みの空き共有バッファの合計
メモリ: 2897 465 2431 0 30 230
-/+ バッファ/キャッシュ: 204 2692
スワップ: 4000 0 4000

[zama@localhost ~]$ sync

[zama@localhost ~]$ free -m
             キャッシュされた使用済みの空き共有バッファの合計
メモリ: 2897 466 2431 0 30 230
-/+ バッファ/キャッシュ: 205 2691
スワップ: 4000 0 4000

syncここでは、コマンドの実行後にバッファーが減少するのを確認できません。

次に、次のことを試しました...巨大なファイルをディスクに書き込もうとしました。

[zama@localhost ~]$ dd if=/dev/zero of=test bs=1024k 

予想どおり、キャッシュされた値は増加するはずであり、解放はこれを確認しています..

@localhost ~]# free -m
             キャッシュされた使用済みの空き共有バッファの合計
メモリ: 2897 1466 1430 0 32 1127
-/+ バッファ/キャッシュ: 306 2590
スワップ: 4000 0 4000

syncコマンドを再度実行し、を使用して確認しfreeました。commandの出力からバッファ値が減少していることがわかりますfree。キャッシュの減少はありませんでした。これは、ddcoomand の実行後に RAM 内のダーティ ページが disk にフラッシュされたことを意味します。

@localhost ~]# free -m
             キャッシュされた使用済みの空き共有バッファの合計
メモリ: 2897 1466 1430 0 10 1127
-/+ バッファ/キャッシュ: 306 2590
スワップ: 4000 0 4000

drop_cache次に、キャッシュ値がドロップされるようにカーネルパラメーターを更新しました

[root@localhost ~]# cat /proc/sys/vm/drop_caches
0

[root@localhost ~]# echo "1" > /proc/sys/vm/drop_caches

[root@localhost ~]# cat /proc/sys/vm/drop_caches
1

freeバッファとキャッシュの両方の値がドロップされていることを確認するようになりました。

[root@localhost ~]# free -m
             キャッシュされた使用済みの空き共有バッファの合計
メモリ: 2897 299 2597 0 1 74
-/+ バッファ/キャッシュ: 224 2672
スワップ: 4000 0 4000

したがって、「バッファ」はまだディスクにフラッシュされていない RAM データであるという私の最初の声明は正しいようです。

私が正しい方向にいるかどうかを教えてください。

4

5 に答える 5

3

Linux vm サブシステムは、空きメモリ、未使用メモリ、または割り当てられていないメモリをバッファ/キャッシュとして扱います。

したがって、実行echo 1 > /proc/sys/vm/drop_cachesすると、ページ キャッシュ (page-cache)、dentry (slab-cache)、および inode (slab-cache 内) を削除または消去するようにカーネルに指示され、メモリが再利用されて使用可能になります。

クリーン データ キャッシュ ページは、設計上解放されません。余分なメモリが割り当てられる場合 (malloc/calloc/brk/sbrk など)、カーネルによって簡単に再利用できますが、必要に応じてディスク I/O を節約するディスクからの有用なデータが含まれています。

syncコマンドは、メモリ内のダーティ ページをディスクにコミットするだけで、バッファ/キャッシュを解放しません。バッファ/キャッシュをドロップする唯一の方法はecho "1" > /proc/sys/vm/drop_caches、カーネルを使用するか、アプリケーションによって要求された新しい割り当て用のデータ ページを再利用することです。

pdflushバッキング デバイス情報 (BDI) ごとにフラッシュ スレッドを使用するように置き換えられました。

于 2014-07-10T04:06:20.923 に答える
3

私が常に理解している方法は、メモリのバッファ領域はデバイス (ディスクを含む) から読み書きされるデータの一時的な格納用であり、メモリのキャッシュ領域はデバイスからの将来の読み取りを高速化するためのものです。

于 2012-03-15T19:48:17.123 に答える