优雅的slab内存分配器(五)—— 鸡肋一样的colour机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuhangtiant/article/details/81592878

Colour机制的作用

slab中的colour机制是利用slab的剩余空间,减少cache行冲突的一种机制。不过笔者分析来下,总体感觉colour机制的效果不明显,如同鸡肋,食之无味弃之可惜,好在colour机制并没有给slab带来更多的复杂度。

在分析colour机制之前,有必要补充一下硬件cache的基础知识,请参考我的另外一篇博客:《系统加速利器Hardware Cache(一)——三种类型的Cache 》

通过之前的分析我们知道,一个kmem cache实例会维护一个或多个slab,两个slab可能对应的cache行很有可能冲突,最极端(理论上来说也很常见)的情况就是两个slab在cache中完全冲突。如图:
这里写图片描述

slab0和slab1对应相同的cache行。为简单起见,上图的cache为直接映射cache,即哪些物理地址对应到哪个cache行是固定的。
那么当使用slab1时,slab0在cache中的缓存会被驱逐,如果slab0和slab1全部在cache中重叠,使用slab1中的每个object,都会导致slab0在cache中的缓存被驱逐。为了尽量避免slab0和slab1完全重叠,可以利用slab的剩余空间,调整object在slab中的起始地址,以达到slab0和slab1不完全重叠,如下图:
这里写图片描述

slab0的object从slab offset0开始,而slab1的object距离slab的起始地址偏移了一个cache line,这样slab0和slab1在就不会完全重叠,即有一个cache line的数据不重叠。

代码分析

代码片段1

cachep->colour_off = cache_line_size();

colour_off是一个cache line的长度,即object在slab内的偏移必须是cache line对齐的。

代码片段2

n->colour_next++;
if (n->colour_next >= cachep->colour)
    n->colour_next = 0;

offset = n->colour_next;
if (offset >= cachep->colour)
    offset = 0;

offset *= cachep->colour_off;

/* Get slab management. */
freelist = alloc_slabmgmt(cachep, page, offset,
        local_flags & ~GFP_CONSTRAINT_MASK, page_node);

代码片段3

static void *alloc_slabmgmt(struct kmem_cache *cachep,
                   struct page *page, int colour_off,
                   gfp_t local_flags, int nodeid)
    {
    void *freelist;
    void *addr = page_address(page);

    page->s_mem = addr + colour_off;
    page->active = 0;

    if (OBJFREELIST_SLAB(cachep))
        freelist = NULL;
    else if (OFF_SLAB(cachep)) {
        /* Slab management obj is off-slab. */
        freelist = kmem_cache_alloc_node(cachep->freelist_cache,
                          local_flags, nodeid);
        if (!freelist)
            return NULL;
    } else {
        /* We will use last bytes at the slab for freelist */
        freelist = addr + (PAGE_SIZE << cachep->gfporder) -
                cachep->freelist_size;
    }

    return freelist;
}

代码片段2和代码片段3的作用如下:
slab0 : object相对偏移是0
slab1:object相对偏移是1 cache line
slab2:object相对偏移是2 cache line
……

Colour真的有用吗?

针对cache冲突的问题,组相联cache技术提供了非常优秀的解决方案,目前的cache也以组相联cache为主。colour机制对全相联cache中完全不起作用,对组相联cache来说,作用其实微乎其微;就算是对直接映射cache来说,作用也不大,最好的情况也不过就是让本会完全重叠了slabs错开一个cache line。

也存在一些场景colour机制不起作用或者作用很小:

  1. 剩余空间不足一个cache line,此时无法使用colour机制。
  2. 当kmem cache实例中的slab数量增多时,colour机制会渐渐失效。比如剩余空间有一个cache line,如图:
    这里写图片描述

当slab的数量超过4时,使用一个slab中的任意数据,都会导致其他slab中的数据在cache中的缓存被驱逐。

我不敢说colour机制没有任何作用,但是我分析下来,作用真的微乎其微。或许是笔者理解过于表面,敬请读者不吝赐教。

猜你喜欢

转载自blog.csdn.net/liuhangtiant/article/details/81592878