Linux系统如何查看使用内存情况
[root@R2 ~]# free
total used free shared buffers cached
Mem: 215608 142680 72928 0 19736 86956
-/+
buffers/cache: 35988 179620
Swap: 1052248 0 1052248
我们研究一下上面的free命令输出参数值及含义
Mem: 表示物理内存统计
-/+ buffers/cached : 表示物理内存的缓存统计
Swap: 表示硬盘上交换分区的使用情况,这个我们不去关心。
系统的总物理内存:215608KB,但系统当前真正可用的内存并不是第一行free标记的72928KB,它仅代表未被分配的内存。
我们使用total1、used1、free1、userd2、free2等名称来代表上面统计数据的各值,1、2分别代表第一行和第二行的数据。
total1: 总计物理内存的大小
used1: 已使用多大内存(包含buffers 与cache),但其中可能部分缓存并未实际使用
free1: 可用内存多少
shared1: 多个进程共享的内存总额
buffers1/cached1: 磁盘缓存的大小,这些是系统分配但未被使用的buffers 和 cache
used2: 实际使用的buffers 与cache的总量,也是实际使用的内存总量。
free2: 未被使用的buffers 与cache和未被分配的内存之和,这就是系统当前实际可用内存。
这里主要区别在于:
第二行( Mem )的 used/free 与第三行( -/+ buffers/cache )的
used/free的区别,这两个区别在于从使用的角度来看,第一行是从OS角度来看,因为对于OS,buffers/cached都是属于被使用,所以它的可用内存是72928KB,已使用内存是142680KB,其中包括内核OS使用+Application(X,
oracle, etc)使用的 + buffers + cached。
第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为 buffer/cached
是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快的被回收。
所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached
179620 = 72928 + 19736 + 86956
我们可以整理出如下等式:
total1 = used1 + free1
total1 = used2 + free2
used1 = buffers1 + cached1 +used2
free2 = buffers1 + cached1 + free1
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
bi会非常小。
接下来我们解释什么时候内存会被交换,以及按什么方式交换。当可用内存少于额定值的时候,就会开始进行交换。
如何看额定值:
[root@R2 ~]# cat /proc/meminfo
MemTotal: 215608 kB
MemFree: 72388 kB
Buffers: 20312 kB
Cached: 86984 kB
SwapCached: 0 kB
Active: 65140 kB
Inactive: 54940 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 215608 kB
LowFree: 72388 kB
SwapTotal: 1052248 kB
SwapFree: 1052248 kB
Dirty: 8 kB
Writeback: 0 kB
AnonPages: 12796 kB
Mapped: 10964 kB
Slab: 7728 kB
PageTables: 1224 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 1160052 kB
Committed_AS: 137364 kB
VmallocTotal: 630776 kB
VmallocUsed: 4864 kB
VmallocChunk: 625772 kB
用free -m 查看的结果:
[root@R2 ~]# free -m
total used free shared buffers cached
Mem: 210 139 70 0 19 84
-/+
buffers/cache: 35 175
Swap: 1027 0 1027
查看/proc/kcore文件的大小(内存镜像):
[root@R2 ~]# ll -h /proc/kcore
-r-------- 1 root root 219M Apr 9 22:44
/proc/kcore
备注:
占用内存的测量
测量一个进程占用了多少内存,linux为我们提供了一个很方便的方法, /proc
目录为我们提供了所有的信息,实际上top等工具也通过这里来获取相应的信息。
/proc/meminfo 机器的内存使用情况
/proc/pid/maps pid为进程号,显示当前进程所占用的虚拟地址
/proc/pid/statm 进程所占用的内存
我们通过free命令查看机器空闲内存时,有时候会发现free的值很小。这主要是因为,在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的。
所以 空闲内存=free+buffers+chached=total-used