剖析free命令


Linux中有许多的查看系统状态的命令,但是如果没有一些相关的背景知识就很容易
造成误解。free命令就是一个明显的例子。本系列wiki就结合一些好的资料并
结合自身理解来尝试剖析一些常用又常被误解的Linux命令。


本文最要参考这篇好文,英文无压力的建议再读读原文。


从一则free使用实例说开

# free
             total       used       free     shared    buffers     cached
Mem:      16426628   16372464      54164          0      35408   10861984
-/+ buffers/cache:    5475072   10951556
Swap:     32764556    7985476   24779080

第一行和第三行字面意思都好立即,第二行往往很多人不理解。主要是看不懂”-/+ buffers/cache”
到底是什么鬼。
也正是很多人不理解第二行,往往看到类似上面的free结果后,就认为系统已经没有空闲内存给新进程使用了。
下面给出一个计算公式,基本一看就能懂了。

line1[used] - (line1[buffers] + line1[cached]) = line2[used]
line1[total] - line2[used] = line2[free]

根据实例验证一下

16372464 - (35408 + 10861984) = 5475072
16426628 - 5475072 = 10951556

那么当有人问起,看到这样一个free结果时,系统还有多少可用的空闲内存呢(free RAM available) ?
我们的回答应该是line2[free]而不是line1[free]。下面会详细解释。


buffers和cached到底是什么

buffers是被一个特定进程使用的用于临时存放数据的内存空间,这些内容不会被其他进程访问。
这篇文章用了带宽的概念来
类比,非常贴切。
当你试图通过网络发送大量的突发数据时,如果网卡的带宽(capacity)仅支持发送一部分时,
它会将剩下的数据存在buffers中,用于后续发送。

而cached用于存放频繁访问的一些数据,目的是做到更快的数据访问。
比如多个进程需要读同一个文件,此时内存可能就分配一片cached区域,用于作为CPU到磁盘
之间的cache。

buffers和cached的区别:
a. buffers是供单个进程使用的,而cached可供多个进程使用
b. buffers是一次性的,而cached是可以反复使用的
buffers和cached的共同之处就在于它们都是临时性的存储,如果后续有进程需要使用
这些内存空间,Linux会释放(free)这些临时性占用的内存。


swap分区

swap分区的目的是将一些不被频繁访问的内存数据放到磁盘,但是当需要时又能尽快的恢复到内存中去


参考资料

Understanding free command in Linux/Unix
Linux ate my ram! Don’t Panic! Your ram is fine!
Experiments and fun with the Linux disk cache