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内存。

注意:手动清除缓存可能会在一段时间内降低系统性能。原则上不推荐这么做,因为如果有需要,系统会自动释放出内存供其他程序使用。

发表回复 0

Your email address will not be published. Required fields are marked *