Linux内存问题研究
最近观测到server的服务器占用内存非常严重,8个G,已经占用到了6个G。而奇怪的是所有进程的实际占用物理内存才600M。
首先想到的命令 free -m 看看总体内存使用情况。具体里面说明转载一下。
total 内存总数
used 已经使用的内存数(我的程序使用内存数量+系统缓存使用的内数量)
free 空闲的物理内存数(是真正的空闲,未被任何程序占用)
shared 多个进程共享的内存总额
buffers 磁盘缓存(Buffer Cache)的大小(可提高系统I/O调用的性能)
cached 磁盘缓存(Page Cache)的大小(可提高系统I/O调用的性能)
-buffers/cache 表示已被我们的程序使用的内存数,计算方法:used – buffers – cached
+buffers/cache 表示还可已被我使用的内存数,计算方法:free + buffers + cached
看的实际消耗内存,即-buffer/cache值6G
再来是看meminfo 也没发现什么问题
再来就是把所有进程的实际物理内存加了一下
ps axu|awk ‘{print $6}’|grep -v RSS|awk ‘{a=a+$1}END{print a}’
不到1G
除了进程还有其它消耗内存吗?
再看看meminfo
发现了slap ,这个占到了5个多G
再网上找找原因,终于发现下面原因,具体可以看转载
通过观察/proc/meminfo发现,slab内存分为两部分:
SReclaimable <span style="color: #008000;">//</span><span style="color: #008000;"> 可回收的slab</span> SUnreclaim <span style="color: #008000;">//</span><span style="color: #008000;"> 不可回收的slab</span>当时服务器的现状是:slab部分占用的内存,大部分显示的都是SReclaimable,也就是说可以被回收的。
但是通过slabtop观察到slab内存中最主要的部分(dentry_cache)的OBJS几乎都是ACTIVE的,显示100%处于被使用状态。
原来可以不必理会了,到了一定阶段,系统就会自动回收内存了。