Linux 交换(Swap)子系统:从诞生演进、架构拆解到 swap_ops 现代化重构
一、 什么是 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 子系统正逐步摆脱历史特例代码的包袱走向更加模块化、高性能的现代内核架构。

相关新闻

OData Best Practices,什么时候该并行调用,什么时候该用 $batch

OData Best Practices,什么时候该并行调用,什么时候该用 $batch

做 SAP Fiori 或外部系统集成时,有一种性能问题非常容易被忽略。页面只展示几块数据,看起来业务逻辑并不复杂,浏览器的 Network 面板里却同时出现五六个甚至十几个 OData 请求。每个请求返回的数据可能只有几 KB,但页面仍然感觉迟钝。 问题往往并不在 ABAP SQL,也不一定在…

2026/8/17 17:26:55 阅读更多 →
一台被苹果放弃的旧 Mac,用 OpenCore Legacy Patcher 装上了新版 macOS

一台被苹果放弃的旧 Mac,用 OpenCore Legacy Patcher 装上了新版 macOS

一台被苹果放弃的旧 Mac,用 OpenCore Legacy Patcher 装上了新版 macOS 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 两个月前,我这…

2026/8/18 20:01:17 阅读更多 →
为什么我不再手动保存抖音视频?这个批量下载工具是怎么做到的

为什么我不再手动保存抖音视频?这个批量下载工具是怎么做到的

为什么我不再手动保存抖音视频?这个批量下载工具是怎么做到的 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallbac…

2026/8/18 20:00:16 阅读更多 →

最新新闻

3DS存档丢失怎么办?JKSM这款存档备份工具,半小时给你的进度做个“影分身“

3DS存档丢失怎么办?JKSM这款存档备份工具,半小时给你的进度做个“影分身“

3DS存档丢失怎么办?JKSM这款存档备份工具,半小时给你的进度做个"影分身" 【免费下载链接】JKSM JKs Save Manager for 3DS 项目地址: https://gitcode.com/gh_mirrors/jk/JKSM 3DS存档管理这件事,很多人都是等到存档真丢了才…

2026/8/18 20:43:17 阅读更多 →
终极 ASI 加载器指南:一条 DLL 让任何 Windows 游戏变身 Mod 自由地

终极 ASI 加载器指南:一条 DLL 让任何 Windows 游戏变身 Mod 自由地

终极 ASI 加载器指南:一条 DLL 让任何 Windows 游戏变身 Mod 自由地 【免费下载链接】Ultimate-ASI-Loader The Ultimate ASI Loader is a proxy DLL that loads custom .asi libraries into any game process. 项目地址: https://gitcode.com/gh_mirrors/ul/Ulti…

2026/8/18 20:43:17 阅读更多 →
面部识别技术如何重塑汽车租赁:从身份核验到智能座舱的无感变革

面部识别技术如何重塑汽车租赁:从身份核验到智能座舱的无感变革

1. 从“刷脸”到“刷车”:一个正在发生的行业变革 最近几年,如果你去租车,流程大概是这样的:线上或电话预订,到店后出示身份证、驾驶证,签一堆纸质合同,刷一笔押金,然后才能拿到钥匙…

2026/8/18 20:43:17 阅读更多 →
江南程序设计竞赛联盟暑期多校训练·第六场(个人补题A,E)

江南程序设计竞赛联盟暑期多校训练·第六场(个人补题A,E)

题目A. Bob 的私房钱知识点&#xff1a;分解质因数思路&#xff1a;又是分解质因数(●—●)&#xff0c;最后公式确实退不出来&#xff0c;还是直接附上题解吧代码&#xff1a;#include <bits/stdc.h> using namespace std; #define int long long #define endl \n int t…

2026/8/18 20:43:17 阅读更多 →
2026年广州智慧燃气安全监测管理系统的建设与服务商观察

2026年广州智慧燃气安全监测管理系统的建设与服务商观察

在南方超大城市里做燃气安全监测&#xff0c;有北方城市不太一样的一套挑战。广州地处珠江三角洲腹地&#xff0c;高温高湿的气候常年考验着燃气管线的防腐层和接口密封性&#xff0c;而每年汛期的强降雨和台风天又可能引发地面塌陷、管线位移等次生风险。广州的餐饮文化全国闻…

2026/8/18 20:43:17 阅读更多 →
阿里二面:RAG的内容超出知识库范围,应该如何检测和拒绝回答,以避免幻觉产生?我说三点,面试官频频点头…

阿里二面:RAG的内容超出知识库范围,应该如何检测和拒绝回答,以避免幻觉产生?我说三点,面试官频频点头…

应该做RAG项目的人肯定都遇到过这种场景嘛。就是用户问了一个知识库里压根就没有的问题&#xff0c;结果模型倒好&#xff0c;一本正经地给你编了一个答案出来。检索那边根本没召回什么相关内容&#xff0c;但生成模型就硬是毫不犹豫地"脑补"了一段看起来还挺专业的回…

2026/8/18 20:42:17 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图&#xff1a;用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手&#xff1a;7个字重免费商用&#xff0c;从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻&#xff1a;设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南&#xff1a;GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者&#xff0c;最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent&#xff0c;从本地部署到云端API&#xff0c;我们正处在一个技术栈快速重构的节点。然而&#xff0c;面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →