一、 什么是 Swap 子系统Linux 的交换Swap子系统是虚拟内存管理中的核心组成部分。当系统物理内存RAM面临压力时Swap 子系统负责将暂时不活跃的内存页Pages写入外部存储设备并在进程重新访问这些数据时将其读回物理内存。Swap 不仅是防范 OOMOut-Of-Memory崩溃的最后一道防线还扮演着“性能调节器”的角色通过将占用堆栈但长期不用的匿名页Anonymous Pages交换到磁盘内核能够腾出珍贵的物理内存用于 Page Cache文件缓存从而大幅提升系统的整体磁盘 I/O 效率。二、 演进历史从硬编码特例到接口重构Linux Swap 子系统并非一朝一夕设计完成而是伴随着底层存储硬件的变革经历了漫长的演进。正如内核的许多其他组件一样交换层是在漫长的岁月中按需叠加演化而来的其演化的最终结果往往与如今重新设计该子系统时所期望的样子大相径庭交换层与其所使用的设备之间的接口就是一个典型例子。专用磁盘分区Early Days早期 Linux内核最初仅能将数据交换到本地磁盘驱动器上的专用 Swap 分区中。如果该分区后来被发现太小——而事实往往总是如此——通常唯一的解决办法就是对整个磁盘进行重新分区。文件与网络交换Flexibility EraLinux 2.x - 3.x后来增加了使用文件系统中的文件Swap File作为交换空间的功能这为系统管理员带来了极大便利再往后内核又具备了交换到网络文件系统的能力。然而在交换层内部每一种可能的交换后端都被硬编码为一组行为差异化对待的特例Special Cases。这种在层级上缺乏抽象的状况使得交换子系统越来越难以维护和改进。内存压缩与高速设备SSD/NVM EraLinux 3.x - 5.x引入了 zswap / zram 内存压缩技术利用 CPU 压缩数据以避免昂贵的磁盘 I/O同时针对高速 SSD/NVM 设备开发了“Swap bypass交换旁路”机制对于基于内存的高速设备交换操作归结为同步内存拷贝从而避免了不必要的异步处理。Folio 批处理与抽象层架构Modern EraLinux 6.x - 2026全面适配 Folio 架构支持大页mTHP的并发交换。社区在 LSFMMBPF 峰会上提出了为交换子系统创建抽象操作结构体swap_ops的设想旨在隐藏底层设备差异并优化批处理传输性能。三、 核心架构拆解在 Linux 内核中Swap 子系统介于内存管理层MM与底层的存储设备之间。1. 内核四层流水线触发与回收层Reclaim Trigger内核守护进程kswapd或直接内存回收Direct Reclaim机制通过 LRU 链表筛选出不活跃的匿名页Folio。地址映射与分配层Swap MapSwap Slot Allocator在 Swap 设备上分配槽位Slot。当页被换出后页表项PTE中的物理地址会被替换为一个swp_entry_t包含type设备标识与offset偏移。缓存层Swap Cache使用swap_address_space(XArray) 充当换入/换出过程中的临时缓冲区解决多线程并发读写同一 Swap 页以及预读Readahead的同步问题。抽象与传输层Swap Backends负责与底层存储对接包括块设备分区、文件系统交换文件、内存压缩后端ZRAM/ZSWAP及网络存储文件。2. 数据流动图示[ 物理内存 (RAM) ] │ ▼ (1) Swap-out (换出内存不足写入存储更新 PTE 为 swp_entry_t) [ Swap Cache (XArray) ] ──► [ Swap 设备 (分区 / 文件 / ZRAM / 网络存储) ] ▲ │ (2) Swap-in (换入触发 Page Fault 缺页中断从存储读回) [ 进程页表 (PTE) ]四、 架构演进前沿swap_ops抽象层的设计与突破在 2026 年 Linux 存储、文件系统、内存管理和 BPF 峰会LSFMMBPF上提出的核心议题之一正是为交换子系统构建一个统一的操作结构体。交换子系统由于缺乏与底层存储交互的抽象层这一历史遗留问题即将得到解决但实际落地的方式与最初设想的有所不同。1. Baoquan He的方案显式抽象与三分类后端由Baoquan He创建的一套旨在改善交换子系统抽象状况的补丁集已经推进了一段时间。在该方案中交换层与后端之间的接口由如下结构体定义struct swap_ops { void (*read_folio)(struct swap_info_struct *sis, struct folio *folio, struct swap_iocb **plug); void (*write_folio)(struct swap_info_struct *sis, struct folio *folio, struct swap_iocb **plug); void (*unplug)(struct swap_iocb *sio); };read_folio()与write_folio()作用相当直观用于在内存与底层交换设备之间传输一个或多个 folio/page。unplug()用于启动批量积累的 I/O 操作从而向交换子系统的其余部分隐藏不同后端的行为差异。在Baoquan He的补丁集中针对三种不同的后端场景定义了三个swap_ops结构体bdev_async_swap_ops用于交换到块设备的常规情况。由于块设备执行操作需要一定时间因而采取异步执行。值得注意的是交换到本地文件系统中的文件通常也由这些操作处理——当添加交换文件时内核会要求文件系统指定该文件的块被放置在何处此后便绕过文件系统直接进行 I/O。bdev_sync_swap_ops用于本地块设备的同步操作请求完成前函数不会返回。这就是“交换旁路swap bypass”情况对于基于内存的高速设备操作归结为内存拷贝无需异步处理。bdev_fs_swap_ops用于直接调用文件系统执行实际 I/O 的操作。这种情况不适用于本地文件系统但对于在网络文件系统上的文件进行交换则是必需的。2. Christoph Hellwig 的方案注重批处理与合并优化Baoquan He的补丁集经历了七个版本的迭代并已接近合入主线。然而在 LSFMMBPF 峰会之后Christoph Hellwig 提出了另一种思路。他的补丁集专注于通过增加交换 I/O 操作的批处理batching来提升性能。受到Baoquan He工作的启发Hellwig 提出了如下结构体struct swap_ops { unsigned int flags; bool (*can_merge)(struct folio *folio, struct folio *prev_folio, size_t prev_folio_size, int rw); void (*submit_write)(struct swap_io_ctx *ctx); void (*submit_read)(struct swap_io_ctx *ctx); };can_merge()确定两个 folio 的 I/O 操作是否可以合并为一个更大的单次操作。由于它必须判断这两个 folio 在后端存储上逻辑上是否相邻因此对于不同的后端设备计算逻辑也各不相同。submit_write()与submit_read()用于发起 I/O 操作详细细节被汇总整理到了ctx参数中。flags标志位目前仅包含SWAP_OPS_F_REQUIRE_NOFS标志指示任何内存回收reclaim操作绝不能调用文件系统防止对托管交换文件的文件系统产生递归调用。与Baoquan He的三分类不同Hellwig 的方案仅定义了两个操作结构体用于块设备后端的swap_bdev_ops以及用于文件系统后端的swap_fs_ops。至于同步的“交换旁路”情况则与现有内核一样直接在块设备实现中通过条件判断来处理。3. 当前进展与社区审查困境Hellwig 的补丁集目前正处于第五个版本大部分工作已经就绪但可能赶不上 Linux 7.3 的合并窗口merge window。这项工作遇到了内核社区中日益频繁出现的一个典型问题Sashiko 代码审查工具对补丁本身的修改几乎没有任何异议却在补丁所触及的代码中发现了一些先前就存在的遗留问题Pre-existing problems。虽然社区自然希望看到这些问题得到修复但延迟新功能的合入去解决旧 Bug 并不总是受欢迎的决定。该问题是否会导致补丁集延期合入目前仍有待观察。五、 实战指南如何配置与管理 Swap在实际运维与开发工作中我们可以通过以下方式配置与调优 Swap 系统1. 创建与启用 Swap 文件相比于重新划定 Swap 分区使用文件创建 Swap 更加灵活方便1.创建空文件分配所需的容量大小。Bashsudo fallocate -l 4G /swapfile2.严格限制文件权限防止非 root 用户读取敏感内存数据。Bashsudo chmod 600 /swapfile3.格式化为 Swap 格式Bashsudo mkswap /swapfile4.启用 Swap 文件Bashsudo swapon /swapfile开机自动挂载可在/etc/fstab追加/swapfile none swap defaults 0 02. 核心内核参数调优vm.swappiness决定了内核在回收内存时换出匿名页Swap与回收文件缓存Page Cache的倾向比重取值区间策略方向适用场景0极力避免 Swap仅在即将发生 OOM 时触发延迟极度敏感的应用如 Redis、In-Memory DB1 - 10优先保留文件缓存极少触发 Swap高性能数据库、Web 服务器60平衡文件缓存与内存交换Linux 默认值通用桌面与服务器环境100积极 Swap 不活跃内存最大化留出空间给 Cache内存紧俏的开发机、构建服务器实时生效命令sudo sysctl vm.swappiness10六、 总结与展望从最初只能依赖本地磁盘固定的专用分区到支持本地与网络文件系统再到如今针对高并发与现代存储硬件推行的swap_ops操作结构体重构Linux Swap 子系统完成了从“简单后备仓库”到“复杂分层存储调度引擎”的演进。不论是何包钢建立的三分化接口抽象还是 Christoph Hellwig 主导的高性能 I/O 合并与批处理方案都标志着 Swap 子系统正逐步摆脱历史特例代码的包袱走向更加模块化、高性能的现代内核架构。