关于/proc/meminfo中SReclaimable含义及回收机制的技术问询
嘿,这两个问题都是Linux内核内存管理里的经典疑问,我来给你掰扯清楚:
1. /proc/meminfo中的SReclaimable代表什么含义?
SReclaimable是Linux内核Slab分配器下可被回收重用的内存块总和。
Slab是内核用来高效管理小尺寸内核对象(比如进程描述符、文件缓存节点、目录项等)的内存机制。其中一部分Slab里的对象是临时性质的——比如某个文件被关闭后,对应的缓存对象暂时没被销毁,但内核可以在需要的时候把这部分内存回收,重新分配给其他任务,这部分可回收的Slab内存就被统计在SReclaimable里。
和它对应的SUnreclaim则是内核必须保留、无法随意回收的Slab内存(比如正在被活跃进程使用的内核数据结构)。
2. SReclaimable内存如何被真正回收,以及回收触发时机是什么?
回收机制
SReclaimable里的内存主要包含干净/脏页缓存和无引用的可回收Slab对象,回收流程分两类处理:
- 对于页缓存:如果是脏页(数据还未同步到磁盘),内核会先调用
pdflush/flusher线程把数据刷到磁盘,变成干净页后再释放;如果是已经和磁盘同步的干净页,直接释放内存即可。 - 对于可回收Slab对象:内核会调用
kmem_cache_shrink()等内核函数,扫描并销毁那些没有被任何进程引用的Slab对象,将内存归还到系统空闲内存池。
触发时机
- 内存阈值触发(自动):当系统空闲内存低于预设的
low watermark(低水位线,可通过/proc/sys/vm/min_free_kbytes配置),内核的kswapd守护进程会被唤醒,主动扫描包括SReclaimable在内的可回收内存区域,启动回收流程。 - 手动强制触发:你可以通过执行命令
echo 3 > /proc/sys/vm/drop_caches来强制回收SReclaimable内存(这个命令会清理页缓存、目录项和inode缓存,适合临时释放内存,但生产环境谨慎使用,可能导致短时间内磁盘IO飙升)。 - 周期性主动回收:部分内核版本中,
vmscan模块会定期执行内存扫描,主动回收长期闲置的SReclaimable内存,避免内存资源被无效占用。
内容的提问来源于stack exchange,提问作者Bill Randerson
相关产品推荐
相关产品推荐

