权威问题解答参见
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还有大量未使用,内存还是够用的。