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机制不起作用或者作用很小:
- 剩余空间不足一个cache line,此时无法使用colour机制。
- 当kmem cache实例中的slab数量增多时,colour机制会渐渐失效。比如剩余空间有一个cache line,如图:
当slab的数量超过4时,使用一个slab中的任意数据,都会导致其他slab中的数据在cache中的缓存被驱逐。
我不敢说colour机制没有任何作用,但是我分析下来,作用真的微乎其微。或许是笔者理解过于表面,敬请读者不吝赐教。