You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

kmalloc与slab关联疑问及kmalloc-rcl slab相关技术咨询

问题解答

一、核心疑问:kmalloc分配后slab统计无变化的原因

你遇到的问题源于内核slab分配器的per-CPU缓存机制与批量管理策略:

  • Per-CPU缓存:slab分配器为每个CPU维护独立的对象缓存池,单个对象的分配/释放会优先从当前CPU的缓存中获取或放回,不会立刻同步到/proc/slabinfo或vmstat -m的全局统计数据。只有当per-CPU缓存的对象数量达到阈值(如缓存满需向全局slab归还,或缓存空需从全局slab补充)时,才会触发全局统计更新。
  • 批量计数逻辑:内核不会为单个对象的分配修改active_objs计数,只有当整个slab页的活跃状态发生本质变化(如从全空闲变为有活跃对象,或反之)时,才会更新统计项。如果你的kmalloc请求只是复用了per-CPU缓存里的空闲对象,全局统计自然不会有变化。

验证方法:循环分配数千个相同大小的对象后再查看slab统计,此时应该能看到active_objs的明显变化。

二、kmalloc-rcl-xx与kmalloc-xx slab的区别及GFP_KERNEL的选择逻辑

两者核心区别

  • kmalloc-xx:对应普通不可回收slab,存储的是内核核心数据结构(如进程描述符、链表节点等),这类数据无法被内核自动回收,必须显式调用kfree释放。
  • kmalloc-rcl-xx:全称kmalloc-reclaimable,对应可回收slab。这类slab中的对象内存内容可在内存紧张时被内核回收(通过kswapd或直接回收机制),前提是对象所属模块实现了回收回调(如能重新生成数据),通常用于存储可重建或丢弃的临时数据。

GFP_KERNEL的选择逻辑

调用kmalloc(size, GFP_KERNEL)时会使用普通kmalloc-xx slab,原因是:

  • GFP_KERNEL的标记组合为__GFP_RECLAIM | __GFP_IO | __GFP_FS,其中__GFP_RECLAIM仅允许内核在分配内存时触发回收操作,但并未标记内存本身为可回收。
  • 只有当分配时显式添加__GFP_RECLAIMABLE标记(如GFP_KERNEL | __GFP_RECLAIMABLE),内核才会选择kmalloc-rcl-xx slab分配可回收内存。

内容的提问来源于stack exchange,提问作者MankPan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:17:13