web-dev-qa-db-ja.com

無料コマンドから「バッファ」と「キャッシュ」を理解する

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

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

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

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

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

バッファの概念を理解するために、私は次の実験を試みました...

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

 [zama @ localhost〜] $ free -m 
キャッシュの使用済み空き共有バッファの合計
 Mem:2897 465 2431 0 30 230 
-/ + buffers/cache :204 2692 
スワップ:4000 0 4000 
 
 [zama @ localhost〜] $ sync 
 
 [zama @ localhost〜] $ free- m 
キャッシュされた使用済み共有バッファの合計
 Mem:2897 466 2431 0 30 230 
-/ + buffers/cache:205 2691 
スワップ:4000 0 4000 

ここでは、syncコマンドを実行した後にバッファーが減少するのがわかりません。

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

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

予想通り、キャッシュされた値は増加するはずで、freeはこれを確認しています。

 @ localhost〜]#free -m 
キャッシュの合計使用済み空き共有バッファ
 Mem:2897 1466 1430 0 32 1127 
-/ + buffers/cache:306 2590 
スワップ:4000 0 4000 

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

 @ localhost〜]#free -m 
キャッシュで使用された空き共有バッファの合計
 Mem:2897 1466 1430 0 10 1127 
-/ + buffers/cache: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 
キャッシュの合計使用済み空き共有バッファ
 Mem:2897 299 2597 0 1 74 
-/ + buffers/cache :224 2672 
スワップ:4000 0 4000 

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

私が正しい方向に向かっているかどうか私を案内してください。

20
Zama Ques

Freeコマンドの列ヘッダーは、少なくとも(開発者とは対照的に)linuxユーザーの観点からは、多少誤ったラベルが付けられています。以下に、見出しの意味を説明します。

total:はい、これは合計RAMです。

sed:これはおそらく最も混乱している列です。これは、アプリケーションが使用したメモリと、必要に応じて実際に使用可能な他の「一時的に」(バッファ+キャッシュ)使用したメモリの混合です。したがって、技術的にはメモリは実際に使用されていますが、アプリケーションが必要とする場合、このメモリの多くは利用可能です。 「一時的に」使用されているメモリは、システムパフォーマンスの高速化に役立つLinuxシステムで利用可能な場合は借用されます。そうでない場合、システムはディスクからより頻繁に読み取ることになります。このタイプのメモリの多くは、「キャッシュ」列の下に表示されます。アプリケーションがメモリを必要とする場合、このメモリはLinuxシステムによって与えられます。

free:はい、この純粋な無料の手つかずのメモリ。

shared:複数のプロセスで使用するために特別に割り当てられたメモリ

buffers:一部のプロセスを支援するために取っておかれる一時メモリ

cache:多くのLinux OS操作を高速化するのに役立つ、オペレーティングシステムによって使用および「借用」されるメモリ。アプリケーションが必要とする場合、このメモリはシステムによって解放されます。

-/ + buffers/cacheで始まる行は、通常、最初のMem行よりも役立ちます。 free-/ + buffers/cacheの共通部分は、基本的に「利用可能な」メモリに必要なものです。

24
WxWizard

[〜#〜] rhel [〜#〜] からの引用:

Linuxは常にRAMを使用して、バッファ(ファイルシステムメタデータ)およびキャッシュ(ファイルまたはブロックデバイスの実際のコンテンツを含むページ)に使用可能なメモリを使用することにより、ディスク操作を高速化します。

3
zangw

私がいつも理解しているように、メモリのバッファ領域はデバイス(ディスクを含む)から読み取ったり書き込んだりするデータを一時的に保存するためのものであり、メモリのキャッシュ領域はデバイスからの将来の読み取りを高速化するためのものです。

3
samuelg

Linux vmサブシステムは無料または未使用または未割り当てメモリをbuffers/cacheとして扱います

したがって、echo 1 > /proc/sys/vm/drop_cachesカーネルに、ページキャッシュ(ページキャッシュ)、デントリ(スラブキャッシュ)、およびiノード(スラブキャッシュ内)を削除または消去し、メモリを再利用して使用可能にするように指示します。

クリーンなデータキャッシュページは、仕様では解放されません。それらは、追加のメモリが割り当てられる場合(malloc/calloc/brk/sbrkおよびその仲間)、または必要な場合にディスクI/Oの実行を再度保存するディスクからの有用なデータを含む場合、カーネルによって簡単に再利用できます。

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

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

3
askb

これは私の理解です:バッファーはブロックデバイスを維持するために予約されているメモリの量を示しますが、キャッシュはfileの内容に使用されているメモリの量を示します。

1
user2699113