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