3. 高性能腾讯云CSG技术背后细节
时间:2022-03-09 05:27:01 | 来源:行业动态
时间:2022-03-09 05:27:01 来源:行业动态
CSG在实现的参考了这两个方案的优缺点,希望能够在并发性能的和缓存的命中率之间到达平衡, 具体实现如下:
hashtable每个bucket一把锁保护节点和索引,一把全局锁保护LRU链表
链表由midpoint指针分为hot 和cold两个子链表,默认的节点数比例是 2:1
CSG也是通过midpoint把LRU链表划分为hot 和cold两个子链表来解决局部性差场景。锁的优化采用的是段锁 全局锁,对节点的访问是先加段锁访问数据,移动节点时才加全局锁,把全局锁的临界区控制到了最小范围。这样即保证了LRU特性提升了缓存命中率而且锁冲突也不严重, 实际测试4线程加全局锁修改链表可以达到50w /s的并发满足了需求。
如上图所示我们实现的段锁hashtable是对每一个bucket一把锁,对hash到同一个bucekt的key加同一锁,多线程并发锁冲突小并发高。hash冲突时采用的链式冲突处理, 当load_factor 1.0时会自动进行resize,保证key和 bucket锁得比例小于1:1。
下图是多线程情况下跟stl 中unordered_map 加全局锁性能对比数据,测试环境4 cpu 8G mem。
对比发现即使单线程性能也差不多10%的性能损耗,4线程下是unordered_map的两倍以上, key越多锁冲突越少并发性能也越好。