【性能】【内存】slab解读&内存泄漏

本文介绍了Linux内核的Slab机制,用于优化小对象内存分配,以减少内存消耗和碎片。Slab分为SReclaimable和SUnreclaim两部分,SUnreclaim的增长可能表明内存泄漏。通过分析`/proc/meminfo`和启用`slub_debug`、`kmemleak`等工具,可以定位和解决内存泄漏问题。手动清理Slab缓存(`echo 2 > /proc/sys/vm/drop_caches`)仅是临时解决方案,治本之道在于找到引起Slab缓存增长的进程或调整系统配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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。。。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值