Linux内核Slab分配器详解
1. 理解内核Slab分配器
Slab分配器或Slab缓存位于页分配器之上。它的存在主要基于两个目的:
- 对象缓存 :作为常见“对象”的缓存,这些对象是Linux内核中频繁分配的数据结构。内核在启动时会预先分配大量对象到多个Slab缓存中,当内核代码或设备驱动需要这些对象的内存时,直接向Slab分配器请求。如果对象已缓存,分配几乎是即时的,释放时也是如此。例如,网络和块I/O子系统的关键代码路径对性能要求高,网络栈的套接字缓冲区 sk_buff
、块层的 biovec
以及核心的 task_struct
数据结构等都会被内核自动缓存。此外,文件系统元数据结构(如 inode
和 dentry
结构)、内存描述符 struct mm_struct
等也会预先分配到Slab缓存中。
- 减少页分配器的高浪费(内部碎片) :通过提供小的、大小合适的缓存,这些缓存通常是页的片段,来减少页分配器的内部碎片。
2. 查看Slab缓存的当前状态
可以通过多种方式查看Slab缓存的当前状态,如通过 proc
和 sysfs
文件系统查看原始视图,或使用各种前端实用工具(如 smem
、 vmstat
、 slabtop
、