一、Slab解释:
--》通常的说法是:内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗;
这里的说法太笼统了;
详细的说法如下:
在linux内核中会有许多小对象,这些对象构造销毁十分频繁,比如i-node,dentry。这么这些对象如果每次构建的时候就向内存要一个页,而其实际大小可能只有几个字节,这样就非常浪费,
为了解决这个问题就引入了一种新的机制来处理在同一页框中如何分配小存储器区,这个机制可以减少申请和释放内存带来的消耗,这些小存储器区的内存称为Slab;
可以理解为一个内核专用的对象池,可以提高系统性能并减少内存碎片。
Linux中查看meminfo会发现他们将slab分的很清楚,包括SReclaimable和SUnreclaim;
其中SReclaimable指可收回Slab的大小,SUnreclaim不可回收的slab大小;
二、slab可用来分析内核空间内存泄漏问题;
1.查看内存使用情况
cat /proc/meminfo
其中SUnreclaim:695168 kB,随着测试时间加长SUnreclaim一直在增加,证明存在内存泄露可能;
先说明一下,如果问题仅仅是Slab占用了太多的内存(SReclaimable),那么通常不需要太操心,因为这根本不是个问题(如果是SUnreclaim太多且不断增长,那么很有可能是内核有bug)。
但是,如果是因为Slab占用内存太多而引起了其他的问题,建议继续阅读。
手工清除Slab可回收缓存:echo 2 > /proc/sys/vm/drop_caches
上面的命令会主动释放Slab中clean的缓存(包括inode和dentry的缓存),然后再free -g一下,未使用的内存陡增了十几个G。。。