Linux中的free命令
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux中的free命令
解释⼀下Linux上free命令的输出。
下⾯是free的运⾏结果,⼀共有4⾏。
为了⽅便说明,我加上了列号。
这样可以把free的输出看成⼀个⼆维数组FO(Free Output)。
例如: FO[2][1] = 15402628 FO[3][2] = 12033012
free的输出⼀共有四⾏,第四⾏为交换区的信息,分别是交换的总量(total),使⽤量(used)和有多少空闲的交换区(free),这个⽐较清楚,不说太多。
free输出地第⼆⾏和第三⾏是⽐较让⼈迷惑的。
这两⾏都是说明内存使⽤情况的。
第⼀列是总量(total),第⼆列是使⽤量(used),第三列是可⽤量(free)。
第⼀⾏的输出时从操作系统(OS)来看的。
也就是说,从OS的⾓度来看,计算机上⼀共有:
15402628KB(缺省时free的单位为KB)物理内存,即FO[2][1];
在这些物理内存中有15318812KB(即FO[2][2])被使⽤了;
还⽤83816KB(即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]
这⼆者都不难理解。
free命令由procps.*.rpm提供(在Redhat系列的OS上)。
free命令的所有输出值都是从/proc/meminfo中读出的。
在系统上可能有meminfo(2)这个函数,它就是为了解析/proc/meminfo的。
procps这个包⾃⼰实现了meminfo()这个函数。
可以下载⼀个procps的tar包看看具体实现,现在最新版式3.2.8。
前段时间有个项⽬的⽤C写的,性能测试时发现内存泄露问题。
关于怎么观察内存使⽤问题,free是很好⽤的⼀个命令。
bash-3.00$ free
total used free shared buffers cached
Mem: 1572988 1509260 63728 0 62800 277888
-/+ buffers/cache: 1168572 404416
Swap: 2096472 16628 2079844
Mem:表⽰物理内存统计
-/+ buffers/cached:表⽰物理内存的缓存统计
Swap:表⽰硬盘上交换分区的使⽤情况,这⾥我们不去关⼼。
系统的总物理内存:255268Kb(256M),但系统当前真正可⽤的内存b并不是第⼀⾏free 标记的 16936Kb,它仅代表未被分配的内存。
第1⾏ Mem: total:表⽰物理内存总量。
used:表⽰总计分配给缓存(包含buffers 与cache )使⽤的数量,但其中可能部分缓存并未实际使⽤。
free:未被分配的内存。
shared:共享内存,⼀般系统不会⽤到,这⾥也不讨论。
buffers:系统分配但未被使⽤的buffers 数量。
cached:系统分配但未被使⽤的cache 数量。
buffer 与cache 的区别见后⾯。
total = used + free 第2⾏ -/+ buffers/cached: used:也就是第⼀⾏中的used - buffers-cached 也是实际使⽤的内存总量。
free:未被使⽤的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可⽤内存。
free 2= buffers1 + cached1 + free1 //free2为第⼆⾏、buffers1等为第⼀⾏
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 第3⾏:第三⾏所指的是从应⽤程序⾓度来看,对于应⽤程序来说,buffers/cached 是等于可⽤的,因为buffer/cached是为了提⾼⽂件读取的性能,当应⽤程序需在⽤到内存的时候,buffer/cached会很快地被回收。
所以从应⽤程序的⾓度来说,可⽤内存=系统free memory+buffers+cached.
接下来解释什么时候内存会被交换,以及按什么⽅交换。
当可⽤内存少于额定值的时候,就会开会进⾏交换.
如何看额定值(RHEL4.0):
#cat /proc/meminfo
交换将通过三个途径来减少系统中使⽤的物理页⾯的个数:
1.减少缓冲与页⾯cache的⼤⼩,
2.将系统V类型的内存页⾯交换出去,
3.换出或者丢弃页⾯。
(Application 占⽤的内存页,也就是物理内存不⾜)。
事实上,少量地使⽤swap是不是影响到系统性能的。
下⾯是buffers与cached的区别。
buffers是指⽤来给块设备做的缓冲⼤⼩,他只记录⽂件系统的metadata以及 tracking in-flight pages.
cached是⽤来给⽂件做缓冲。
那就是说:buffers是⽤来存储,⽬录⾥⾯有什么内容,权限等等。
⽽cached直接⽤来记忆我们打开的⽂件,如果你想知道他是不是真的⽣效,你可以试⼀下,先后执⾏两次命令#man X ,你就可以明显的感觉到第⼆次的开打的速度快很多。
实验:在⼀台没有什么应⽤的机器上做会看得⽐较明显。
记得实验只能做⼀次,如果想多做请换⼀个⽂件名。
#free
#man X
#free
#man X
#free
你可以先后⽐较⼀下free后显⽰buffers的⼤⼩。
另⼀个实验:
#free
#ls /dev
#free
你⽐较⼀下两个的⼤⼩,当然这个buffers随时都在增加,但你有ls过的话,增加的速度会变得快,这个就是buffers/chached的区别。
因为Linux将你暂时不使⽤的内存作为⽂件和数据缓存,以提⾼系统性能,当你需要这些内存时,系统会⾃动释放(不像windows那样,即使你有很多空闲内存,他也要访问⼀下磁盘中的pagefiles)
使⽤free命令
将used的值减去 buffer和cache的值就是你当前真实内存使⽤ ————– 对操作系统来讲是Mem的参数.buffers/cached 都是属于被使⽤,所以它认为free只有16936.
对应⽤程序来讲是(-/+ buffers/cach).buffers/cached 是等同可⽤的,因为buffer/cached是为了提⾼程序执⾏的性能,当程序使⽤内存
时,buffer/cached会很快地被使⽤。
所以,以应⽤来看看,以(-/+ buffers/cache)的free和used为主.所以我们看这个就好了.另外告诉⼤家⼀些常识.Linux为了提⾼磁盘和内存存取效率, Linux做了很多精⼼的设计, 除了对dentry进⾏缓存(⽤于 VFS,加速⽂件路径名到inode的转换), 还采取了两种主要Cache⽅式:Buffer Cache和Page Cache。
前者针对磁盘块的读写,后者针对⽂件inode的读写。
这些Cache能有效缩短了
I/O系统调⽤(⽐如read,write,getdents)的时间。
记住内存是拿来⽤的,不是拿来看的.不象windows,⽆论你的真实物理内存有多少,他都要拿硬盘交换⽂件来读.这也就是windows为什么常常提⽰虚拟空间不⾜的原因.你们想想,多⽆聊,在内存还有⼤部分的时候,拿出⼀部分硬盘空间来充当内存.硬盘怎么会快过内存.所以我们看linux,只要不⽤swap的交换空间,就不⽤担⼼⾃⼰的内存太少.如果常常swap⽤很多,可能你就要考虑加物理内存了.这也是linux看内存是否够⽤的标准哦.
———————————————
语 法: free [-bkmotV][-s <间隔秒数>]
补充说明:free指令会显⽰内存的使⽤情况,包括实体内存,虚拟的交换⽂件内存,共享内存区段,以及系统核⼼使⽤的缓冲区等。
参 数:
-b 以Byte为单位显⽰内存使⽤情况。
-k 以KB为单位显⽰内存使⽤情况。
-m 以MB为单位显⽰内存使⽤情况。
-o 不显⽰缓冲区调节列。
-s<间隔秒数> 持续观察内存使⽤状况。
-t 显⽰内存总和列。
-V 显⽰版本信息。