
当一个 AI 推理服务的 QPS 从 1 万攀升到 10 万的时候,最先崩掉的往往不是 GPU——GPU 利用率可能才 60%——而是 CPU 侧那个看起来毫不起眼的请求队列:有锁版本的 P99 延迟从 2ms 飙升到 50ms,线程全部堆在 mutex 的等待队列里做上下文切换,而 GPU 那边在空转等数据。这是一个在 AI 推理服务大规模部署中反复出现的性能瓶颈,而它的根源不在于锁"太慢",而在于锁在高竞争下会引发 convoy effect——一个持有锁的线程如果恰好被调度器抢占,所有等待的线程都必须一起等,P99 延迟因此变得完全不可预测。Lock-free queue 能解决这个问题,但它的价值不在于大多数人以为的"无锁所以更快"。你把一个 lock-free queue 扔到低竞争场景里跑 benchmark,多半会发现它的平均吞吐量反而不如一个精心调优的std::mutex+std::condition_variable方案——因为 CAS retry loop 在无竞争时的单次开销比一次 uncontended mutex lock 还高。Lock-free 的真正价值在于可预测的延迟分布:它不会因为某个线程被抢占而让所有其他线程一起卡住,这在 AI 推理服务这种对尾延迟极度敏感的场景中,是比平均吞吐量更重要的指标。本文将从 CAS 硬件指令的物理行为开始,一路追踪到 Michael-Scott Queue 的经典实现,再横向拆解 folly::MPMCQueue、moodycamel::ConcurrentQueue、DPDK rte_ring 这些工业级方案的架构差异,最后落到 AI 推理服务中 dynamic batc