Linux性能监测工具之三:free(内存储器状态)

Linux性能监测工具之三:free(内存状态)

一、作用

用来显示内存的使用情况,使用权限是所有用户


二、语法

free [-b|-k|-m|-g] [-l] [-o] [-t] [-s delay] [-c count] [-V]

常用参数详解
-b, -k,-m,-g:分别以字节( bytes、KB、MB、GB)为单位显示内存使用情况
-s  delay:显示每隔多少秒数来显示一次内存使用情况(与-c一起使用)
-c:按每隔几秒显示内存使用情况时的刷新次数(与-s一起使用)
-t:显示内存总和列。
-o:不显示缓冲区调节列
-V:free的版本



三、工作原理

1、free命令由procps.*.rpm提供(在Redhat系列的OS上)
2、free命令的所有输出值都是从/proc/meminfo中读出的。 在系统上可能有meminfo(2)这个函数,它就是为了解析/proc/meminfo的。procps这个包自己实现了meminfo()这个 函数。可以下载一个procps的tar包看看具体实现,现在最新版式3.2.8


四、实例分析
Linux性能监测工具之三:free(内存储器状态)

total------
总物理内存
used-------
已使用内存,一般情况这个值会比较大
free------
完全未被使用的内存
shared------
应用程序共享内存
buffers------
缓存,主要用于目录方面、inode 值等(ls 大目录可看到这个值增加)
cached------
缓存,用于已打开的文件

1)
第一行:mem,表示 操作系统物理内存使用情况 针对操作系统而言
total 241:表示物理内存总量为241M
used 61:表示总计分配给缓存(包含buffers 与cache,及应用程序 )使用的数量,但其中可能部分缓存并未实际使用,即61M
free 180:表示未被分配的内存数据为180M
share 0:表示应该程序的共享内存为0M
buffers 7:表示系统分配但未被使用的buffers数量
cached 36:表示系统分配但未被使用的cache数量
公式如下:
(1)total=used+free
=61M+180M=241M
(2)used=buffers+cached (maybe add shared also)+application
=7+36+17=60(因采用MB为单位,所以存在误差)

注意: 为了提高磁盘存取效率, Linux 做了一些精心的设计, 除了对dentry 进行缓存(用于VFS, 加速文件路径名到inode 的转换), 还采取了两种主要Cache 方式:Buffer CachePage Cache 。(呵呵!看到了吧,所以针对操作系统的内存使用情况,usered=buffers+cached+application)前者针对磁盘块的读写,后者针对文件inode 的读写。这些Cache 有效缩短了 I/O 系统调用( 比如read,write,getdents) 的时间


2)第二行:-/+ buffers/cached,表示应用程序的内存使用情况   (针对应用程序而言
-buffers/cache 应用程序使用的内存大小(等于used- 缓存值 =61-7-36=18M,因采用MB为单位,所以存在误差)
+buffers/cache:
所有可供应用程序使用的内存大小(等于free +缓存值=180+7+36=223M)
所以 -buffer/cache 反映的是: 程序实实在在吃掉的内存;而+buffer/cache反映的是: 可以挪用的内存总数
公式如下:
(1) -buffers/cache=used-buffers-cached
(2)+buffers/cache=free+buffers+cached

注意:由于第二行描述的是应用程序的内存使用情况,所以这里的used表示当前应用程序所占用的内存,而free则表示应用程序还可以使用内存(总的物理内存 - 应用程序已经使用的)

3)第三行:Swap,表示硬盘上交换分区的使用情况
total 1019:表示总的交换分区的空间大小
used 0:表示当前还没有使用交换分区那部分空间
free 1019:表示还可用的交换分区的空间大小
注意:
linux系统中,如果 swap分区的空量也开始使用的话,则表示你的内存可能不够用,需要加一些内存了,因为linux是先使用内存的容量,当内存不够用时,才会使用swap 分区的空间,这一点也正是与windows的区别;windows是使用swap分区,后使用内存的(看了很生气,有内存不用,反而使用磁盘中所划分出来 的虚拟内存,你说直接使用内存好,还是读取磁盘好,当然是直接读内存)


五、共享内存、cache、buffer

1、共享内存(shared memory)

对于共享内存(Shared memory ),主要用于在UNIX  环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,笔者也没有去验证共享内存对上面等式的影响。如果你有兴趣,请参考:What is Shared Memory?

2、
cache   buffer 的区别

(1)Cache


它是高速缓存,是位于CPU 与主内存间的一种容量较小但速度很高的存储器。由于CPU 的速度远高于主内存,CPU 直接从内存中存取数据要等待一定时间周期,Cache 中保存着CPU 刚用过或循环使用的一部分数据,当CPU 再次使用该部分数据时可从Cache 中直接调用,这样就减少了CPU 的等待时间 提高了系统的效率。

Cache 又分为一级Cache(L1 Cache) 和二级Cache(L2 Cache)
L1 Cache 集成在 CPU 内部
L2 Cache 早期一般是焊在主板上, 现在也都集成在CPU 内部,常见的容量有256KB512KB L2 Cache

(2)Buffer

名为缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。
linux中使用free指令,那么Free
中的buffercache :(它们都是占用内存):
buffer : 
作为buffer cache 的内存,是块设备的读写缓冲区
cache: 
作为page cache 的内存 文件系统的cache