Dynamic Magazine Resizing
现在来讨论一下,magazine中的rounds M是如何确定的。M越大,cache命中率越高,但是内存消耗越大。solaris使用的是自适应的方法:
- 给M设定一个比较小的初始值,depot layer中维护一个变量contention_rate表示cache miss的程度
- 每次试图访问depot的时候,注意depot是所有的CPU共享的,我们先试图加一个non-blocking trylock…
- 如果加锁失败,说明出现竞争,contention_rate++
- 如果contention_rate超过某个阈值的时候,我们就增加magazine的M
- magazine的M是有上限的,以免失控!
umem_depot_alloc
{
umem_magazine_t *mp;
if(mutex_trylock(&cp->cache_depot_lock)!=0){ //如果non-block lock失败
(void)mutex_lock(&cp->cache_depot_lock);
cp->cache_depot_contention++;
}
…
(void)mutex_lock(&cp->cache_depot_lock);
}
注意,这里并没有增加magazine的代码,solaris是专门有一个update线程来定时检查并完成magazine自适应的工作的。