buff/cache
最初に質問させてください。バッファとキャッシュは 2 種類のメモリであるはずですが、なぜ free コマンドは変更してそれらを組み合わせてみてはどうでしょうか?この質問に答えるには、ある程度の準備が必要です。まずバッファとキャッシュの意味を明確にしましょう。 ###############バッファ###
オペレーティング システムでは、バッファ キャッシュを指します。通常、中国語では「バッファ」と訳されます。バッファを理解するには、「セクタ」と「セクタ」という 2 つの概念を理解する必要があります。
"ピース"。セクタはデバイスの最小のアドレス指定単位であり、「ハード セクタ」または「デバイス ブロック」とも呼ばれます。ブロックは、オペレーティング システムのファイル システムの最小のアドレス指定単位であり、「ファイル ブロック」または「I/O」とも呼ばれます。
「ブロック」。各ブロックには 1 つ以上のセクターが含まれますが、ページより大きくすることはできないため、ページはメモリ内に 1 つ以上のブロックを保持できます。ブロックがメモリにロードされると、バッファ領域に格納されます。各バッファブロックに対応します。これはメモリ内のディスク ブロックの表現に相当します (下の図はインターネットからのものです):
バッファ キャッシュにはブロックの概念のみがあり、ファイルは含まれていないことに注意してください。ブロックに格納されているファイルの形式は考慮せず、ディスク上のブロックをメモリに直接移動するだけです。
キャッシュ は、オペレーティング システムのページ キャッシュを指します。中国語は一般的に「ページ キャッシュ」と訳されます。ページ キャッシュは、カーネルによって実装されるディスク キャッシュです。主に次の目的で使用されます。ディスクへの影響を軽減する I/O 操作。具体的には、ディスク内のデータを物理メモリにキャッシュすることで、ディスクへのアクセスが物理メモリへのアクセスに変わります。ページ キャッシュは、メモリ ページをキャッシュします。キャッシュ内ページは、通常のファイル、ブロック デバイス ファイル (これはバッファ キャッシュを指します)、およびメモリ マップされたファイルの読み取りと書き込みによって生成されます。
.ページ キャッシュによる通常のファイルのキャッシュは、次のように理解できます。カーネルがファイル (たとえば、
/etc/hosts) を実行すると、最初にこのファイルのデータが既にページ キャッシュに存在するかどうかがチェックされます。その場合は、ディスクへのアクセスをあきらめ、メモリから直接読み取ります。この動作はキャッシュ ヒットと呼ばれます。データがキャッシュにない場合、それはキャッシュミスを意味し、カーネルはブロックをスケジュールします。
I/O 操作はディスクからデータを読み取ります。次に、カーネルは読み取ったデータをページ キャッシュに配置します。このキャッシュは、ファイル システム (/etc/hosts など) によって認識されるファイルを対象とします。 ページ キャッシュのブロック デバイス ファイルのキャッシュは、前に紹介したバッファ キャッシュです。個々のディスク ブロックもバッファを通じてページ キャッシュに格納されるためです (バッファは最終的にページ キャッシュによってホストされます)。
この時点で明確にしておきたいのは、バッファであろうとページ キャッシュであろうと、それらは同じ方法で実装されるということです。バッファは概念的には単なる特別なページ キャッシュです。 ######それでなんで
freeコマンドはbuff/cacheではなく直接cacheと呼ばれるものではないでしょうか?これは、バッファーとページ キャッシュの実装が本質的に統合されていないためです。 Linuxで
カーネル2.4
そうして初めてそれらを統一することができるのです。以前のカーネルには、ページ キャッシュとバッファ キャッシュという 2 つの個別のディスク キャッシュがありました。前者はページをキャッシュし、後者はバッファをキャッシュします。ストーリーを理解すると、出力内の列の名前は重要ではなくなるかもしれません。
free 与 available
在 free 命令的输出中,有一个 free 列,同时还有一个 available 列。这二者到底有何区别?
free
是真正尚未被使用的物理内存数量。至于 available 就比较有意思了,它是从应用程序的角度看到的可用内存数量。Linux
内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和
cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache
中回收内存来满足应用程序的请求。所以从应用程序的角度来说,available = free + buffer + cache。请注意,这只是一个很理想的计算方式,实际中的数据往往有较大的误差。
交换空间(swap space)
swap
space 是磁盘上的一块区域,可以是一个分区,也可以是一个文件。所以具体的实现可以是 swap 分区也可以是 swap
文件。当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问
swap 上存储的内容时,再将 swap
上的数据加载到内存中,这就是常说的换出和换入。交换空间可以在一定程度上缓解内存不足的情况,但是它需要读写磁盘数据,所以性能不是很高。
现在的机器一般都不太缺内存,如果系统默认还是使用了
swap 是不是会拖累系统的性能?理论上是的,但实际上可能性并不是很大。并且内核提供了一个叫做 swappiness
的参数,用于配置需要将内存中不常用的数据移到 swap 中去的紧迫程度。这个参数的取值范围是 0~100,0 告诉内核尽可能的不要将内存数据移到
swap 中,也即只有在迫不得已的情况下才这么做,而 100 告诉内核只要有可能,尽量的将内存中不常访问的数据移到 swap 中。在
ubuntu 系统中,swappiness 的默认值是 60。如果我们觉着内存充足,可以在 /etc/sysctl.conf 文件中设置
swappiness:
如果系统的内存不足,则需要根据物理内存的大小来设置交换空间的大小。具体的策略网上有很丰富的资料,这里笔者不再赘述。
/proc/meminfo 文件
其实 free 命令中的信息都来自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起来不太直观:
有兴趣的同学可以直接查看这个文件。
总结
free 命令是一个既简单又复杂的命令。简单是因为这个命令的参数少,输出结果清晰。说它复杂则是因为它背后是比较晦涩的操作系统中的概念,如果不清楚这些概念,即便看了 free 命令的输出也 get 不到多少有价值的信息。
相关推荐:《Linux视频教程》