一个核一个线程,一份数据只属于一个核:Thread-per-Core 存储架构为什么敢不用锁 📅 2026/8/5 2:50:11 Thread-per-Core 的本质不是“线程模型”,而是“数据所有权模型”——把每个数据分片的归属在启动期静态钉死在一个核心上,互斥锁就从运行时语义变成了启动期路由,热路径上不再有跨核 cache 一致性流量。本文先量化传统线程池+互斥锁在现代多核 NVMe 机器上的三层开销(锁竞争、上下文切换、cache line 伪共享与 TLB shootdown),再拆 Seastar 的 smp.hh 与 smp.cc:CPU 拓扑探针(hwloc)、smp::configure 初始化、跨核 SPSC 消息通道的源码级实现,并给出 TPC 的代价清单——数据倾斜、内存放大、动态负载均衡缺失——以及什么时候该用、什么时候不该用。第 1 章 锁与切换:传统多线程存储引擎的性能墙在哪1.1 线程池+互斥锁:现代硬件上最贵的共享方式先看一个再熟悉不过的场景:KV 存储引擎里的一个哈希索引,多个工作线程并发读写,外面套一把std::mutex。这是教科书教了二十年的写法,也是今天绝大多数数据库、缓存、网关还在用的写法。它的问题不在于“锁”这个抽象本身,而在于锁在真实硬件上被放大的方式——这一节我们先把它量化,后面源码精读时你会看到 Seastar 用几乎相反的思路把这个问题整个删掉。把这段代码编译到一台双路 32 核的 x86 机器上跑一下:// bench_lock.cc -- g++ -O2 -pthread bench_lock.cc am