Linux内存工具解析之free

Linux系统提供了很多关于系统和特定进程对于内存的使用情况的探测和管理工具,其中最耳熟能详的就是free和top。free命令可以为用户提供系统级的内存使用情况报告,top命令更为强大,其可以提供整个系统中所有进程的当前状态信息,当然包括内存使用情况信息。

虽然,我们平时经常接触这两个命令,但,真正的要说出两个命令所提供的系统信息的真实含义时,总是感觉有些模棱两可。所以,本文旨在彻底理解两者关于内存监测的真正原理,从工具的源码层次进行分析,并解析RSS、VSS、PSS、USS、buffer/cache等概念。

free

基本使用

free,顾名思义,该命令主要用于实时的显示整个系统内存的使用和剩余情况。

该命令的一般输出如下:

             total       used       free     shared    buffers     cached
Mem:       4029076    3433396     595680      21424     522964    1926528
-/+ buffers/cache:     983904    3045172
Swap:      1046524          0    1046524

为了输出更适合人类阅读的内存信息,我们可以使用-h选项,它会显示自动缩放到最短三位数单位的所有输出字段,并显示打印输出的单位,如:

             total       used       free     shared    buffers     cached
Mem:          3.8G       3.3G       577M        20M       510M       1.8G
-/+ buffers/cache:       964M       2.9G
Swap:         1.0G         0B       1.0G

其中,

			B = bytes
            K = kilos
            M = megas
            G = gigas
            T = teras

原理

可以看到free命令的输出,分为四行:

  1. 第一行为每个量的标题
  2. 第二行为系统整个内存的实时使用情况
  3. 第三行为系统内存另一种更为有意义的表示方式
  4. 第四行为系统交换分区的使用情况

下面分行来解释各个量的含义:

  1. Mem:该行的大部量都是来自sysinfo系统调用返回的系统信息,cached通过/proc/meminfo中的Cached:获得。其中,total = used + free。

  2. -/+ buffers/cache:通过将Mem行中cached、buffers计入空闲内存,来提供更为有意义的内存使用情况表示,基于此,

     -/+ buffers/cache.free = Mem.cached + Mem.buffers + Mem.free
     -/+ buffers/cache.used = Mem.total - (-/+ buffers/cache.free)
     其中,Mem、-/+ buffers/cache.free分别用于索引第一行、第二行各个数据。
    
  3. Swap:显示系统当前交换分区的使用的情况。

cached/buffers的区别

想要搞明白cached和buffers区别,可以通过一个简单的例子来实现:

  1. 首先使用fdisk -l列出系统中的所有分区,比如:

      设备 启动      起点          终点     块数   Id  系统
     /dev/sda1   *        2048   417333247   208665600   83  Linux
     /dev/sda2       417335294   419428351     1046529    5  扩展
     /dev/sda5       417335296   419428351     1046528   82  Linux 交换 / Solaris
    

    我们随便挑选一个分区作为如下命令的参数:

     cat /dev/sda1 > /dev/null
    

    使用如下命令观察buffers的变化:

     while true; do sleep 1; free ; done
    

    正常情况下可以观察到buffers一直在增长。

  2. 挑选一个一个比较大都文件作为下面命令的参数:

     cat bigfile > /dev/null
    

    使用如下命令观察cached的变化:

     while true; do sleep 1; free ; done
    

    正常情况下可以观察到cached一直在增长。

  3. 从上面的例子可以看出,cached和buffers的区别:

    • buffers:用于缓存裸设备或磁盘分区的数据,例如,上面的/dev/sda1
    • cached:用于缓存文件系统相关文件的数据,例如,bigfile
    • buffers:应用于直接访问裸分区
    • 文件系统本身的实现,会认为/dev/sda1是个裸设备,因此文件系统的metadata会缓存到buffers
发布了119 篇原创文章 · 获赞 125 · 访问量 45万+

猜你喜欢

转载自blog.csdn.net/linux_embedded/article/details/89384203