最近观测到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%处于被使用状态。

原来可以不必理会了,到了一定阶段,系统就会自动回收内存了。

发表评论

邮箱地址不会被公开。 必填项已用*标注