知识卡片

ShardedThreadPool用任务归属线程消解锁竞争

专业/工作 · 511.a.1

内容

普通 [[线程池与工作队列的解耦设计|ThreadPool]] 里任何线程都可能抢到任意任务,如果两个任务之间存在顺序依赖(靠互斥锁保证),抢到后到的任务的线程只能阻塞等待,白白浪费一个可以去做其他工作的线程。ShardedThreadPool 的解法是给每个线程分配专属的任务队列(按 thread_index 区分),把所有互相依赖、必须顺序执行的任务固定路由到同一个线程的队列里,由这一个线程串行处理,其他线程完全不受影响、可以继续处理别的任务。本质是用”任务亲和性”替代”抢占后再互斥等待”,把锁竞争转化成路由决策。

参考来源

《Ceph源码分析》第2章《Ceph通用模块》