HCLH:A Hierarchical CLH Queue Lock
flatmcs:Flat-Combining NUMA Locks
CST:Scalable NUMA-aware Blocking Synchronization Primitives
MUTEXEE:Unlocking Energy
Smartlocks:Smartlocks: Lock Acquisition Scheduling for Self-Aware Synchronization
经过各种测试,发现spinlock其实并不只是看上去的那么简单。
从本质上来说,spinlock并不是完全公平的,更有竞争力的候选者将更有可能获取锁。
更有竞争力的候选者往往可能以为着其离上一位持有者更近,更可能先看见锁的状态的更新。抑或是更有竞争力的候选者运行频率更高,更有可能先成功的运行CAS。
下面是利用thbench在模拟大小核环境下测试的结果:
$ ./thbench spinlock
Big core req 10583869.000000 Little core req 4595808.000000
intr 15179677.000000 time 5.000176
3035828.418
spinlock在高竞争程度时,自然而然地形成了一定的倾向性。其在大小核环境下高竞争程度模式下的性能甚至超越了理论上可扩展性更好的mcs。
而这种倾向性并没有人为设计,这种自适应比较神奇,可以考虑考虑。
将这三个传统本地锁放在一起,一个是他们都是队列锁,性能相近,却又有各自细微的差别。(严格的来说CLH实际上性能会稍微好一点)。细致地分,CLH可以分为一类,MCS与K42可以分为一类(本身K42就是从MCS衍生而来)。
对比公平性,这三种完全相同,使用FIFO队列达到了绝对公平。
之所以将这三个锁放在一起,是因为他们背后的设计逻辑都是相同的。其皆为将全局的竞争进行划分,划分为每节点的竞争,从而减少对单一缓存行的竞争。此处不讨论CST的睡眠队列等相关特性,该特性将在与MUTEXEE进行对比分析时提及。
其实针对本地性上面做文章的最终都可以归为公平性与性能的trade off。而这两种不同的思路在这个trade off中的选择空间是不同的,这也是他们最大的不同。
在NUMA环境下进行测试。性能上,这三者较传统本地锁更强。但整体性能不如迁移锁。
但是与迁移锁相比,其不用变接口与逻辑,与传统应用兼容更好。
这两种锁都详细讨论了等待者睡眠的问题。但是使等待者睡眠的出发点并不同,分别是从功耗层面与系统负载超过硬件线程数层面考虑的。这也反映了睡眠能够带来的两种好处:
然而睡眠往往意味着巨大的唤醒开销。为了避免这种睡眠与唤醒开销,MUTEXEE与CST分别采用了以下方法。
总的来说,就是通过各种手段来优先让给还在忙等的线程,避免关键路径上需要等待唤醒。
Smartlocks与ccstmcs都是针对大小核异构环境进行设计的,通过降低公平性来提升性能。大核优先的出发点是大核忙等的时间更加值钱,可以用于干更多的事情,最终都是在公平性与性能上进行trade off。
ccstmcs涉及正在working on的project,就不放上来了。