近日,Linux内核社区收到腾讯工程师Kairui Song提交的一组RFC补丁,其核心目标是对多交换设备的I/O分配机制进行彻底重构。对于采用交换分层或分层交换的复杂服务器场景,该方案有望显著提升性能与可扩展性。

该补丁系列的核心在于引入一种全新方法,公平分配多个交换设备的I/O负载。最关键改动是彻底移除可变的plist和全局锁,并取消全局集群缓存,从而大幅提升分配与轮换的灵活性。作为配套依赖项,补丁还清理并重构了交换设备管理的锁定模式。
有必要回顾旧有设计:每个交换设备原本拥有独立的percpu集群缓存,后来某次提交将集群缓存移至全局作用域,使所有设备共享同一全局缓存,旨在减少对plist的频繁修改。快速交换分配直接经由每个CPU的集群缓存,设备轮换仍由plist负责。这一设计看似合理,实则埋下了多个长期问题。
其中最关键的问题是:位于设备选择之上的全局CPU集群缓存,与交换分层和分层交换分配等概念存在根本性冲突。plist需要调用plist_requeue()函数来轮换设备以实现轮询,这就要求持有swap_a vail_lock锁——所有CPU都会争抢该锁,竞争极为激烈。此外,轮换被定义为慢速路径,为避免触碰plist而引入的快慢路径设计,反而导致大量变通方案和设计局限,使整体架构愈发复杂。
新补丁的做法更为直接:将所有交换设备和新引入的percpu读取器优先级队列,统一由percpu rwsem保护。这一改动直接大幅提升了可扩展性,也为未来引入交换分层等新特性做好了铺垫。

从技术角度看,这组补丁不仅是性能改进,更是一次架构清理——将多年累积的多处变通与妥协一次性梳理干净。对于关注Linux内核I/O子系统的开发者而言,深入理解其中的设计思路极具价值。
