正确理解Linux内存占用过高的问题及可用内存计算方法

权威问题解答参见

https://www.linuxatemyram.com/

最近生产的监控一直疯狂告警,内存占用过高,有的甚至达到90%++,但是业务并未受到任何影响,于是有了以下的分析:

linux 使用free 和 top 命令查看结果如下:

[root@xxx~]# top
top - 14:11:09 up 202 days,  2:06,  2 users,  load average: 0.00, 0.02, 0.00
Tasks: 210 total,   1 running, 209 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.5%us,  0.5%sy,  0.0%ni, 98.0%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  41145296k total, 40169340k used,   975956k free,   326308k buffers
Swap: 33554428k total,        0k used, 33554428k free,  8929612k cached

由上图可知,当前的内存占用比例达到97%,系统是不是内存不够呢?其实,这只是Linux的为了提高文件读取的性能的内存使用机制罢了。不同于Windows,windows程序执行完后,会马上释放掉内存,把Memory降下来。而对于Linux,如果你的服务器内存还有足够多的空间的话,Linux会把程序运行的数据缓存起来(高速缓存),加入到Cache中,所以内存会不断增加,直到一定的限度为止.当超过这限度后,内核必须将脏页写回磁盘,以便释放内存。也就是说,当空闲内存低于一个特定的阈值时,内核的守护进程就会进行内存块回收。

root@xxx~]# free -m
             total       used       free     shared    buffers     cached
Mem:         40180      39225        955          1        318       8718
-/+ buffers/cache:      30187       9993
Swap:        32767          0      32767

以上各参数的解释:
total:总物理内存的大小。
used:已使用内存。
free:可用内存。
Shared:多个进程共享的内存总额。
Buffers/cached:磁盘缓存的大小。
第二行:memory使用情况。
第三行(-/+ buffers/cache)。
第四行交换分区使用情况。

区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。 

这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是955M,已用内存是39225M,其中包括,内核(OS)使用+Application使用的+buffers+cached.

第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。所以从应用程序的角度来说,

可用内存=(系统free memory)+buffers+cached或者第三行中的buffers/cached  free

可用内存的计算为:

第一种方法:955+318+8718=9991M

第二种方法:直接取uffers/cached  free 9993M

所以,我们通过free命令查看机器空闲内存时,会发现free的值很小。这主要是因为,在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,提高文件读取的性能,以方便下次使用。但实际上这些内存,如果需要的话,也是可以立刻拿来使用的。

另外只有mem被当前进程实际占用完(没有了buffers和cache),才会使用到swap的,所以我们看到swap还有大量未使用,内存还是够用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章