Linux 内存slab占用过大,造成业务一直报警。
1,问题描述
维护一台web服务器上面就nginx加PHP,8G内存都使用完了。
# free -g
total used free shared buffers cached
Mem: 7 7 0 0 0 0
-/+ buffers/cache: 7 0
Swap: 3 0 3
接着用ps aux 查看Linux实际使用内存,会看使用内存很少。
# ps aux | awk '{mem += $6} END {print mem/1024/1024}'
0.283817
2,查找问题
这就很奇怪,内存在哪里使用完了呢?我们接着查看内存的详细信息,你会看到以下几项。
# cat /proc/meminfo
Slab: 7160560 kB
SReclaimable: 5355908 kB
SUnreclaim: 1804652 kB
能看到Slab
这个使用了大概7G,但是这个slab是啥呀,只能百度了。在百度百科上看到了[slab](slab_百度百科 (baidu.com)), 大概意思就是slab是Linux操作系统的一种内存分配机制,slab分配算法采用cache 存储内核对象。slab 缓存、从缓存中分配和释放对象然后销毁缓存的过程必须要定义一个 kmem_cache 对象,然后对其进行初始化,这个特定的缓存包含 32 字节的对象。
3,解决问题
如果问题仅仅是Slab占用了太多的内存(SReclaimable),那么通常不需要太操心,因为这根本不是个问题(如果是SUnreclaim太多且不断增长,那么很有可能是内核有bug)。
1,可以手动释放slab。
echo 2 > /proc/sys/vm/drop_caches
该命令释放dentries and inodes的可回收slab内存。
注意:手动清除缓存可能会在一段时间内降低系统性能。原则上不推荐这么做,因为如果有需要,系统会自动释放出内存供其他程序使用。