Linux内核 --内存管理之 Slab 分配器介绍
Slab 分配器介绍
在 Linux 内核中,Slab 分配器 是一种用于高效管理小块内存分配的内存管理机制。它主要针对频繁分配和释放的小对象进行优化,减少内存碎片,提高系统性能。Slab 分配器广泛用于内核中的各种子系统,例如网络缓冲区、文件系统缓存、进程控制块(PCB)等。
Slab 分配器的核心概念
- Cache(缓存):Slab 分配器为每种类型的对象创建一个缓存。每个缓存存储的是相同大小的对象集合。
- Slab:一个 Slab 是一块连续的内存区域,用于存储一组特定大小的对象。
- Object(对象):在 Slab 中实际存储的数据单元。
Slab 分配器的优势
- 对象复用:通过缓存对象来避免频繁的分配与释放操作。
- 减少内存碎片:保证内存分配尺寸和对齐一致,减少内存碎片问题。
- 高效的内存管理:适用于不同大小的对象,提升内核整体性能。
/proc/slabinfo 字段解析
cat /proc/slabinfo
文件输出的头部包含多个字段,解释如下:
字段名 | 解释 |
---|---|
name | 缓存名称,表示特定类型的对象,例如 kmalloc-32 。 |
active_objs | 当前活动对象数,表示正在使用的对象数量。 |
num_objs | 缓存中分配的对象总数,包括已分配和空闲的对象。 |
objsize | 每个对象的大小(以字节为单位)。 |
objperslab | 每个 slab 中的对象数量。 |
pagesperslab | 每个 slab 使用的页数。 |
tunables | 可调参数(limit、batchcount、sharedfactor)。 |
slabdata | Slab 统计数据,包括活动 slab 数、总 slab 数等。 |
各字段详细解析
1. name(缓存名称)
该字段表示 slab 缓存的名称,每个 slab 缓存存储相同类型和大小的对象。例如 kmalloc-32
是用于分配 32 字节的内存块。
2. active_objs(活动对象数)
该字段表示当前在使用的(已分配的)对象数量,即系统中实际分配给内核使用的对象数量。
3. num_objs(总对象数)
该字段表示缓存中分配的对象总数,包括已经分配和空闲的对象。这个值通常大于或等于 active_objs
。
4. objsize(对象大小)
该字段表示每个对象的大小(以字节为单位),即 slab 缓存中每个对象占用的内存空间大小。
5. objperslab(每个 slab 包含的对象数)
该字段表示每个 slab 中包含的对象数量。每个 slab 是一个较大的内存块,其中包含多个对象。
6. pagesperslab(每个 slab 使用的页数)
该字段表示每个 slab 使用的页数。Linux 内核使用分页机制来管理内存,页面通常为 4KB 大小。
7. tunables(可调参数)
该字段中的值控制 slab 缓存的行为:
- limit:slab 缓存中每个 CPU 可以缓存的最大对象数量。
- batchcount:每次从全局缓存到 CPU 本地缓存中批量获取的对象数。
- sharedfactor:控制多个 CPU 是否共享 slab 缓存。
8. slabdata(slab 统计信息)
这部分包含有关 slab 使用的统计数据:
- active_slabs:当前正在使用的 slab 数量。
- num_slabs:系统中分配的总 slab 数量。
- sharedavail:CPU 本地缓存中可用对象的数量。
通过这些字段,管理员可以了解系统中 slab 分配器的内存使用情况,帮助调优系统性能。