Linux上的free命令输出项的意义

转自:http://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html


解释一下Linux上free命令的输出。

  下面是free的运行结果,一共有4行。为了方便说明,我加上了列号。这样可以把free的输出看成一个二维数组FO(Free Output)。例如:

  • FO[2][1] = 24677460
  • FO[3][2] = 10321516  
                   1          2          3          4          5          6
1              total       used       free     shared    buffers     cached
2 Mem:      24677460   23276064    1401396          0     870540   12084008
3 -/+ buffers/cache:   10321516   14355944
4 Swap:     25151484     224188   24927296

  free的输出一共有四行,第四行为交换区的信息,分别是交换的总量(total),使用量(used)和有多少空闲的交换区(free),这个比较清楚,不说太多。

  free输出地第二行和第三行是比较让人迷惑的。这两行都是说明内存使用情况的。第一列是总量(total),第二列是使用量(used),第三列是可用量(free)。

  第一行的输出时从操作系统(OS)来看的。也就是说,从OS的角度来看,计算机上一共有:

  • 24677460KB(缺省时free的单位为KB)物理内存,即FO[2][1];
  • 在这些物理内存中有23276064KB(即FO[2][2])被使用了;
  • 还用1401396KB(即FO[2][3])是可用的;

这里得到第一个等式:

  • FO[2][1] = FO[2][2] + FO[2][3]

FO[2][4]表示被几个进程共享的内存的,现在已经deprecated,其值总是0(当然在一些系统上也可能不是0,主要取决于free命令是怎么实现的)。

FO[2][5]表示被OS buffer住的内存。FO[2][6]表示被OS cache的内存。在有些时候buffer和cache这两个词经常混用。不过在一些比较低层的软件里是要区分这两个词的,看老外的洋文:

  • A buffer is something that has yet to be "written" to disk.
  • A cache is something that has been "read" from the disk and stored for later use.

也就是说buffer是用于存放要输出到disk(块设备)的数据的,而cache是存放从disk上读出的数据。这二者是为了提高IO性能的,并由OS管理。

Linux和其他成熟的操作系统(例如windows),为了提高IO read的性能,总是要多cache一些数据,这也就是为什么FO[2][6](cached memory)比较大,而FO[2][3]比较小的原因。我们可以做一个简单的测试:

  1. 释放掉被系统cache占用的数据;
    echo 3 >/ proc / sys / vm / drop_caches

     

  2. 读一个大文件,并记录时间;
  3. 关闭该文件;
  4. 重读这个大文件,并记录时间;

第二次读应该比第一次快很多。原来我做过一个BerkeleyDB的读操作,大概要读5G的文件,几千万条记录。在我的环境上,第二次读比第一次大概可以快9倍左右。

  free输出的第二行是从一个应用程序的角度看系统内存的使用情况。

  • 对于FO[3][2],即-buffers/cache,表示一个应用程序认为系统被用掉多少内存;
  • 对于FO[3][3],即+buffers/cache,表示一个应用程序认为系统还有多少内存;

因为被系统cache和buffer占用的内存可以被快速回收,所以通常FO[3][3]比FO[2][3]会大很多。

这里还用两个等式:

  • FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]
  • FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]

这二者都不难理解。


下面这部分内容转自另一处:http://hi.baidu.com/hunter6536/item/e18f6a4b3e1fc507c0161309

root@emos ~]# top

Tasks: 131 total,   1 running, 130 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4138480k total,  3368264k used,   770216k free,   156800k buffers
Swap: 10241428k total,        0k used, 10241428k free,  2783368k cached
我是4G的内存,使用了3个多G,很费解,接着free看看。

[root@emos ~]# free -m
                                  total       used       free     shared    buffers     cached
Mem:                       4041       3288      752          0           153         2718
-/+ buffers/cache:                 417       3623
Swap:                       10001        0        10001

total 内存总数: 4041M;
used 已经使用的内存数: 3288M;
free  空闲的内存数: 752M
shared 不同进程间用来进行数据交换,一般都是0(多个进程共享的内存总额)
buffers 是由各种进程分配的,被用在如输入队列等方面

              一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。: 153M
cached 经常被用在磁盘的I/O请求上

              如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。:2718M


(-buffers/cache) used内存数:417M (指的第一部分Mem行中的used – buffers – cached)
( buffers/cache) free内存数: 3623M (指的第一部分Mem行中的free buffers cached)


交换分区,就不说了,自己也会明白。

  我们可能会纳闷儿,蓝色部分(Mem)与绿色部分(-/+ buffers/cache)的结果中,有关used和free为什么这么奇怪?我们可以从二个方面来解释:
  对操作系统来讲是Mem的参数buffers和cached 都是属于被使用(实质上也是这样的,因为已经被占用,是系统提高存取速度的特性决定的,尽管它看起来有强占程序可用内存的嫌疑,但是没有了buffers/cached系统的性能将会有所下降),它认为free只有752M。
  以应用来看看,以(-/+ buffers/cache)的free和used为主

Linux为了提高磁盘和内存存取效率, 开发人员做了很多精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache.前者针对磁盘块的读写,后者针对文件inode的读写.这些Cache能有效缩短了 I/O系统调用(比如read,write,getdents)的时间.

  ***  内存是拿来用的,不是拿来看的。不像windows,无论你的真实物理内存有多少,他都要拿硬盘交换文件来读。(这个说得有道理!!)

   这也就是windows为什么有时会提示虚拟空间不足的原因。在内存还有大部分的时候,拿出一部分硬盘空间来充当内存,硬盘怎么会快过内存?我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了,这也是linux看内存是否够用的标准。

    那么有人说过段时间linux会自动释放掉所用的内存,我们使用free再来试试,看看是否有释放:

[root@emos ~]# free -m
                                    total        used       free      shared    buffers     cached
Mem:                         4041       3288        752          0            153          2718
-/+ buffers/cache:                    417        3623
Swap:                        10001         0        10001

没有任何变化,那么我们就需要手动释放内存。

 *** /proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段,也就是说可以通过修改/proc中的文件来对当前kernel的行为做出调整。我们可以通过调整/proc/sys/vm/drop_caches来释放内存:

[root@emos ~]# cat /proc/sys/vm/drop_caches   //默认为0
0
***[root@emos ~]# sync   //sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)
[root@emos ~]# echo 3 > /proc/sys/vm/drop_caches
[root@emos ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          4041        381       3659          0          0         18    //cached被释放
-/+ buffers/cache:        362       3678
Swap:        10001          0      10001
[root@emos ~]# cat /proc/sys/vm/drop_caches     //再次查看内核参数变为3了。
3
有效的释放了buffer和cache

 有关/proc/sys/vm/drop_caches的用法:

 /proc/sys/vm/drop_caches (since Linux 2.6.16)

 Writing  to  this  file  causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory  to  become free.

To free pagecache,  use  echo 1 > /proc/sys/vm/drop_caches;
To free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
To free pagecache, dentries and inodes, use echo 3  >/proc/sys/vm/drop_caches.Because this is a non-destructive operation  and  dirty  objects

buffer 与cache 的区别
A buffer is something that has yet to be “written” to disk.
A cache is something that has been “read” from the disk and stored for later use.
 更详细的解释参考:Difference Between Buffer and Cache
对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,如果你有兴趣,请参考:What is Shared Memory?
  cache 和 buffer的区别:
Cache: 高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。
Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。
Free中的buffer和cache:(它们都是占用内存):
buffer: 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的IO会非常小。
Buffer和Cache的区别
  缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就无需去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
  缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写如磁盘),也可以通过sync命令手动清空缓冲。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值