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命令的输出,分为四行:
- 第一行为每个量的标题
- 第二行为系统整个内存的实时使用情况
- 第三行为系统内存另一种更为有意义的表示方式
- 第四行为系统交换分区的使用情况
下面分行来解释各个量的含义:
-
Mem:该行的大部量都是来自sysinfo系统调用返回的系统信息,cached通过/proc/meminfo中的Cached:获得。其中,total = used + free。
-
-/+ 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分别用于索引第一行、第二行各个数据。
-
Swap:显示系统当前交换分区的使用的情况。
cached/buffers的区别
想要搞明白cached和buffers区别,可以通过一个简单的例子来实现:
-
首先使用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一直在增长。
-
挑选一个一个比较大都文件作为下面命令的参数:
cat bigfile > /dev/null
使用如下命令观察cached的变化:
while true; do sleep 1; free ; done
正常情况下可以观察到cached一直在增长。
-
从上面的例子可以看出,cached和buffers的区别:
- buffers:用于缓存裸设备或磁盘分区的数据,例如,上面的/dev/sda1
- cached:用于缓存文件系统相关文件的数据,例如,bigfile
- buffers:应用于直接访问裸分区
- 文件系统本身的实现,会认为/dev/sda1是个裸设备,因此文件系统的metadata会缓存到buffers