linux内核源码分析之slab

Posted 为了维护世界和平_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux内核源码分析之slab相关的知识,希望对你有一定的参考价值。

目录

概述

slab核心思想

kmem_cache结构

slab的结构

普通高速缓存和专用高速缓存


概述

        slab它是由Sun 公司的一个雇员Jeff Bonwick,在 Solaris 2.4 中设计并实现的 slab优点:
  1. 比页更小的内存对象
  2. slab分配器在可能的情况下减少了对伙伴系统的调用。
slab缺点:         缓存队列管理复杂,调试调优困难,管理数据存储开销大 slab分配器代码量和复杂性都太高,在内核2.6开发期间增加了slab两个替代品( 备选分配器
  • slob分配器进行了特别优化,以便减少代码量。(从速度来说,它不是最高效的分配器,也不是为大型系统设计的)。
  • slub:分配器通过将页帧打包为组,并通过struct page中未使用的字段来管理这些组,试图最小化所需的内存开销。

slab核心思想

        slab分配器由一个紧密地交织的数据和内存结构的网络组成。使用对象的概念来管理内存,对象是相同的数据结构和大小的某个内存单元,比如mm_struct是一个对象。两部分组成:保存管理性数据的缓存对象和保存被管理对象的各个slab

        每个缓存只负责一种对象类型 (例如struct task_struct 实例),或提供一般性的缓冲区。各个缓存中slab 的数目各有不同,这与已经使用的页的数目、对象长度和被管理对象的数目有关。 每个高速缓存通过kmem_cache结构来描述

kmem_cache结构

1)快速cpu_cache 指向一个数组的指针,其中保存了各个CPU最后释放的对象 2)慢速 kmem_cache_node 每个内存节点都对应3个表头,用于组织slab的链表。                          CPU高速缓存:内核假定刚释放的对象仍然处于CPU高速缓存中,会尽快再次分配它(响应下一个分配请求)。仅当per-CPU 缓存为空时,才会用 slab 中的空闲对象重新填充它们。                  对象分配的体系就形成了一个三级的层次结构,分配成本和操作对CPU高速缓存和 TLB 的负面影响逐级升高。
  1. 仍然处于CPU高速缓存中的per-CPU对象
  2. 现存slab中未使用的对象
  3. 刚使用伙伴系统分配的新slab中未使用的对象

slab的结构

        对象在slab中并非连续排列

对齐方式的两种方案

1,slab创建时使用标志SLAB_HWCACHE_ALIGN,slab用户可以要求对象按硬件缓存进行对齐

2, 如果不要求硬件缓存对齐,内核会按照BYTES_PER_WORD对齐,该值表示void 指针所需字节的数目。字节填充,加速对slab中对象的访问         

3,通过slab着色(slab coloring)表示slab中的对象需要移动的特定偏移量,以便使对象放置到不同的缓存行

普通高速缓存和专用高速缓存

:~# cat /proc/slabinfo 
slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
file_lock_ctx        146    146     56   73    1 : tunables    0    0    0 : slabdata      2      2      0
fsnotify_mark_connector    640    640     32  128    1 : tunables    0    0    0 : slabdata      5      5      0
vm_area_struct     34618  36651    208   19    1 : tunables    0    0    0 : slabdata   1929   1929      0
...
mm_struct            156    195   1088   15    4 : tunables    0    0    0 : slabdata     13     13      0
files_cache          322    322    704   23    4 : tunables    0    0    0 : slabdata     14     14      0
signal_cache         518    518   1152   14    4 : tunables    0    0    0 : slabdata     37     37      0
sighand_cache        476    525   2112   15    8 : tunables    0    0    0 : slabdata     35     35      0
task_struct          755    855   6336    5    8 : tunables    0    0    0 : slabdata    171    171      0
cred_jar             882    882    192   21    1 : tunables    0    0    0 : slabdata     42     42      0
anon_vma_chain     15445  17920     64   64    1 : tunables    0    0    0 : slabdata    280    280      0
anon_vma            9198  10258     88   46    1 : tunables    0    0    0 : slabdata    223    223      0
pid                 1696   1696    128   32    1 : tunables    0    0    0 : slabdata     53     53      0
vmap_area           3520   3520     64   64    1 : tunables    0    0    0 : slabdata     55     55      0
dma-kmalloc-8k         0      0   8192    4    8 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-4k         0      0   4096    8    8 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-2k         0      0   2048   16    8 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-1k         0      0   1024   16    4 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-512        0      0    512   16    2 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-256        0      0    256   16    1 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-128        0      0    128   32    1 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-64         0      0     64   64    1 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-32         0      0     32  128    1 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-16         0      0     16  256    1 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-8          0      0      8  512    1 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-192        0      0    192   21    1 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-96         0      0     96   42    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-rcl-8k         0      0   8192    4    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-rcl-4k         0      0   4096    8    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-rcl-2k         0      0   2048   16    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-rcl-1k         0      0   1024   16    4 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-rcl-512        0      0    512   16    2 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-rcl-256        0      0    256   16    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-rcl-192        0      0    192   21    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-rcl-128       64     64    128   32    1 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-rcl-96       336    336     96   42    1 : tunables    0    0    0 : slabdata      8      8      0
kmalloc-rcl-64      1152   1152     64   64    1 : tunables    0    0    0 : slabdata     18     18      0
kmalloc-rcl-32         0      0     32  128    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-rcl-16         0      0     16  256    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-rcl-8          0      0      8  512    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-cg-8k          8      8   8192    4    8 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-cg-4k         21     24   4096    8    8 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-cg-2k         80     80   2048   16    8 : tunables    0    0    0 : slabdata      5      5      0
kmalloc-cg-1k        558    624   1024   16    4 : tunables    0    0    0 : slabdata     39     39      0
kmalloc-cg-512       141    224    512   16    2 : tunables    0    0    0 : slabdata     14     14      0
kmalloc-cg-256       112    112    256   16    1 : tunables    0    0    0 : slabdata      7      7      0
kmalloc-cg-192       105    105    192   21    1 : tunables    0    0    0 : slabdata      5      5      0
kmalloc-cg-128        64     64    128   32    1 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-cg-96         84     84     96   42    1 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-cg-64        192    192     64   64    1 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-cg-32        384    384     32  128    1 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-cg-16       2560   2560     16  256    1 : tunables    0    0    0 : slabdata     10     10      0
kmalloc-cg-8        1536   1536      8  512    1 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-8k           140    140   8192    4    8 : tunables    0    0    0 : slabdata     35     35      0
kmalloc-4k          1224   1224   4096    8    8 : tunables    0    0    0 : slabdata    153    153      0
kmalloc-2k          2240   2240   2048   16    8 : tunables    0    0    0 : slabdata    140    140      0
kmalloc-1k          1918   1936   1024   16    4 : tunables    0    0    0 : slabdata    121    121      0
kmalloc-512        25810  26336    512   16    2 : tunables    0    0    0 : slabdata   1646   1646      0
kmalloc-256         4132   4224    256   16    1 : tunables    0    0    0 : slabdata    264    264      0
kmalloc-192         5905   6153    192   21    1 : tunables    0    0    0 : slabdata    293    293      0
kmalloc-128         3232   3232    128   32    1 : tunables    0    0    0 : slabdata    101    101      0
kmalloc-96          3102   3318     96   42    1 : tunables    0    0    0 : slabdata     79     79      0
kmalloc-64         11132  11840     64   64    1 : tunables    0    0    0 : slabdata    185    185      0
kmalloc-32         41600  41600     32  128    1 : tunables    0    0    0 : slabdata    325    325      0
kmalloc-16         13824  13824     16  256    1 : tunables    0    0    0 : slabdata     54     54      0
kmalloc-8          10752  10752      8  512    1 : tunables    0    0    0 : slabdata     21     21      0
kmem_cache_node      192    192     64   64    1 : tunables    0    0    0 : slabdata      3      3      0
kmem_cache           176    176    256   16    1 : tunables    0    0    0 : slabdata     11     11      0

        专用缓存是内核其它地方用到的缓存,如:task_struct ,mm_struct

        普通高速缓存是slab用于自己目的的缓存,如:kmalloc-8 kmalloc-16 等

除了名字还有其他信息

  • 缓存中活动对象的数量。
  • 缓存中对象的总数(已用和未用)。
  • 所管理对象的长度,按字节计算。
  • 一个slab中对象的数量。
  • 每个slab中页的数量。
  • 活动slab的数量。
  • 在内核决定向缓存分配更多内存时,所分配对象的数量。每次会分配一个较大的内存块,以 减少与伙伴系统的交互。在缩小缓存时,也使用该值作为释放内存块的大小。

 参考

《深入Linux内核架构》

https://course.0voice.com/v1/course/intro?courseId=2&agentId=0


创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

以上是关于linux内核源码分析之slab的主要内容,如果未能解决你的问题,请参考以下文章

linux内核源码分析之slab

linux内核源码分析之slab

linux内核分析———SLAB原理及实现

深入浅出分析Linux内核slab性能优化的核心思想

多核心Linux内核路径优化的不二法门之-slab与伙伴系统

Memcached源码分析之slabs.c