最近又碰到内存使用的问题了,这次很明显就是slab使用的。

使用slabtop可以很清楚的看到是proc_inode_cache使用的最多。

slabtop

slab里存放的我们知道就是那些经常调用又被经常释放的东西。但是奇怪的是,一旦slab特别大导致系统内存满,这个时候默认是不会清理slab去释放内存的,所以会产生OOM,导致某些进程crash。

在这里我们看到是proc_inode_cache, 本来不明白这个是什么意思。也没有什么文档,slabinfo里也没有说明这个。

后来看了http://blog.csdn.net/npy_lp/article/details/7196296 这位大神的这篇文章弄明白了,原来是proc文件系统的inode的占用的。

于是就开始查进程了。可进程不多啊,于是查线程,可以通过如下命令进行检查。


ps -eLf

得到如下的结果:看到居然PID为7519的这个进程有那么多的线程。

pid_tid

 

检查了一下居然每个线程居然连接了一个的socket的,虽然socket号一样,可inode居然是完全不同的。

inode

tcp

可tcp里指向的端口号是一样的。

 

而查了居然1000多个线程下每个都有5万多个fd, 而且这些fd基本上都是socket。

proc_inode

而我们知道每个inode都是占用空间的,而proc文件系统是全内存的。 所以这个应该后期要值得优化的部分

 

参考下了下 捣乱小子 http://daoluan.net/blog/inode-vnode-dentry/

One thought on “slab内存问题再谈

Share Your Thought