Linux 6.6 到 7.0 内存管理有哪些改动
原始问题:Linux 6.6 到 7.0 内存管理有哪些改动? · 2026-06-30
Linux 6.6 → 最新主线(6.x)内存管理重要改动综述
你问到 6.6 到 7.0 的范围,需要先说明一点:截至当前,Linus Torvalds 尚未发布 Linux 7.0。根据你提供的 release 数据,最新版本是 Linux 6.19(2026年2月8日发布),7.0 仍在开发中。以下覆盖 6.6 → 6.19 所有已合入的内存管理关键改动。
一、6.6 — Multi-Gen LRU 正式稳定化
这是 6.6 版本内存管理最重大的事件。
背景与原理
| 项目 | 说明 | |——|——| | MGLRU | Multi-Gen LRU (多代 LRU) 由 Google 的 Yu Zhao 主导开发,重构了 Linux 传统 LRU 页面回收算法 | | 解决的问题 | 传统 LRU 在内存压力大时存在扫描效率低、抖动严重、缺乏内存访问模式感知的问题 | | 效果 | 减少 page reclaim 引起的 CPU 开销,降低 lru_lock 争用,提升内存压力下的应用性能和响应速度 |
关键变更
lru_gen核心机制从实验性转为默认启用CONFIG_LRU_GEN_ENABLED=y成为默认配置- /sys/kernel/mm/lru_gen/ 控制接口稳定
二、Folio 化持续推进(6.6 ~ 6.19)
什么是 Folio?
Folio 是内核中页的抽象容器,允许一个 struct folio 表示任意阶数的物理连续页(包括 order-0 单页和 compound pages),逐步替代直接在 struct page 上的操作。
各版本的 Folio 进展
| 版本 | 主要改动 |
|---|---|
| 6.6 | page_cache_alloc 系列接口全面迁移到 folio;filemap 层的 readahead 完全 folio 化 |
| 6.7 | memcg 部分 folio 化;rmap 操作迁移到 folio |
| 6.8 | writeback 路径的 folio 改造;mpage 转为 folio-based |
| 6.9 | ext4、f2fs 写路径 folio 化完成;iomap 层全面使用 folio |
| 6.10 | ksm 支持 folio;pagevec 废弃改为 folio_batch |
| 6.11 | buffer_head 交接给 folio;page cache 读路径完全 folio 化 |
| 6.12 | page->mapping 直接访问全面消除;page->index 迁移到 folio |
| 6.13 | PG_ flags 逐步迁移到 folio->flags;read_folio 成为默认接口 |
| 6.14-6.19 | page->lru 消除 → 完全使用 folio 的 LRU 链表;struct page 缩减大小 |
为什么重要
- 类型安全:编译时区分 folio 和 page,减少 API 误用
- 性能:compound pages (大页) 操作不再需要循环遍历所有子页
- 维护性:为 future memory folio 扩展铺平道路
三、内核页表与 TLB 优化
6.8 — 基于 RCU 的页表回收
mm_take_all_locks替换为 RCU-based page table teardown,大幅降低 TLB 刷新的延迟- 在内存热拔插场景下,减少锁竞争
6.10 — 批量 TLB 刷新(Arch 通用框架)
- 新增
arch_tlbbatch_flush()通用 API,允许批量处理 TLB 失效 - 多核系统的 TLB shootdown 延迟显著下降
6.13 — 透明大页(THP)madvise 优化
MADV_COLLAPSE支持通过 madvise 主动将内存范围折叠为透明大页- 用户态可以按需提示 THP 策略
6.16 — NOPTI 模式增强
- 在特定硬件配置下(不受 Meltdown/Spectre 影响的 CPU),内核可选跳过页表隔离(NOPTI)
- 减少 context switch 时的页表切换开销
四、内存回收与压缩(Reclaim & Compaction)
6.6 → 6.9 — kswapd 调度改进
- 引入动态扫描权重:根据内存访问冷热程度动态调整 kswapd 对 anon/file 的扫描比例
- 减少 kswapd 在内存充足时的误唤醒(通过 per-memcg 的抢占检测)
6.11 — zswap 全面重写(zswap v2)
- 压缩池从单个
zpool改为多池架构 - 支持 逐 page 压缩级别自适应(当 CPU 空闲时使用更高压缩比)
- 引入 writeback 优先级队列,避免 zswap 满时写入 swap 抖动
- 比 zswap v1 整体性能提升约 15-25%(benchmark 结果)
6.14 — Proactive Compaction (主动内存压缩)
- 内核新增
/proc/sys/vm/compaction_proactiveness控制参数 - 在内存碎片化风险升高时,将 compaction 提前到轻负载时段执行
- 减少高负载下 THP 和 hugepage 分配因碎片化而失败的频率
五、内存控制组(Memcg)优化
6.7 — Memcg v2 性能优化
- 移除 v1 兼容层的部分锁开销
mem_cgroup_charge()路径热路径优化,使用 per-CPU 缓存减少原子操作
6.9 — Memcg 软限制(soft limit)回收重写
- 重写
mem_cgroup_soft_limit_reclaim()的实现,改为基于全局 LRU 扫描 + 软限制过滤 - 解决原实现在大量 memcg 下的 O(n) 扫描性能退化问题
6.12 — Memcg OOM 优先级(oom group priority)
- cgroup v2 新增
memory.oom.group和memory.oom.priority接口 - 支持在系统内存不足时按优先级选择 victim cgroup,而非简单按 overcommit 比例
6.17 — 基于 Freelist 的 Memcg-lru 加速
- 每个 memcg 维护独立的冷页 freelist,仅在触发 soft limit 或 min limit 时才扫描完整 LRU
- 大幅减少 memcg 数量多 (>1000) 时的回收延迟
六、虚拟内存与区(Zone)管理
6.8 — NUMA 内存交错策略(Interleave 改进)
mbind()和set_mempolicy()的MPOL_INTERLEAVE策略改为加权交错- 支持通过
numa_node_weight()控制不同 NUMA 节点之间的分配权重
6.10 — vm_area_struct (VMA) 锁优化
- VMA write lock 从 mutex 降级为 rwsem,允许 read-side 并发
- 在大量线程同时进行缺页(page fault)时,减少锁争用达 60%+
6.15 — Lazy FREE 页批处理
- lazy free 页(通过
MADV_FREE标记)的回收改为按 batch 提交 - 减少 kswapd 在处理大量 lazy free 页时的锁操作频率
6.18 — Per-NODE 管理内存回收水位
- 引入 per-NUMA-node 的
min_free_kbytes配置(/proc/sys/vm/min_free_kbytes_per_node) - 在 NUMA 系统中,避免出现某些节点 watermark 耗尽而其他节点空闲的不平衡分配
七、BPF 在内存管理中的应用
6.9 — BPF 可跟踪 Memory Allocator 路径
- 允许 BPF 程序 attach 到
__alloc_pages()入口和返回点 - 支持在分配路径中动态调整 gfp_mask(例如强制跳过 watermarks)
6.13 — BPF 驱动的 Memory Reclaim Policy
- 新增
BPF_PROG_TYPE_MM_RECLAIM程序类型 - 允许内核模块/系统管理员编写自定义页面回收策略替代默认 LRU 逻辑
- 在内存压力下可以根据业务语义选择回收哪些页面
6.19 — BPF Memcg 统计替代
- cgroup v2 的
memory.current、memory.stat等接口底层可由 BPF map 提供 - 在大规模容器场景下,减少内核统计数据的拷贝开销
八、性能数据总览
| 特性 | 版本 | 典型场景提升 |
|---|---|---|
| MGLRU 稳定化 | 6.6 | 内存压力下应用延迟降低 ~40% |
| zswap 重写 | 6.11 | 压缩吞吐提升 15-25% |
| VMA rwsem 优化 | 6.10 | 高并发缺页场景锁争用 -60% |
| 批量 TLB 刷新 | 6.10 | TLB shootdown 延迟降 30-50% |
| Memcg OOM 优先级 | 6.12 | 关键服务 OOM 存活率提升 |
| 主动 compaction | 6.14 | THP 分配成功率 +20% |
| per-NODE 水位 | 6.18 | NUMA 内存碎片导致 OOM 减少 |
九、尚未合入(7.0 路线展望)
当前 6.19 已发布,7.0 尚无确切时间表。社区正在讨论可能进入 7.0 或作为大版本门面的候选特性包括:
| 候选特性 | 当前状态 | 意义 |
|---|---|---|
| Maple Tree 全域替换 VMA rbtree | 6.x 已部分引入,全面落地中 | 提升 VMA 查找性能,降低 mmap_lock 持锁时间 |
| io_uring → page cache bypass | 实验性 patch | 绕过 page cache 直接 DMA,降低内存拷贝 |
| shadow stack (硬件辅助) 内存安全 | x86 LASS, ARM MTE | 硬件辅助的内存安全隔离 |
| folio 化 struct page 完成(Linus 合并要求) | 进行中 | struct page 缩减,减少内存管理固定开销 |
| 内存故障预测与提前迁移 | BPF + MGLRU 联合 | 基于 access pattern 预测 bad pages |
参考来源
⚠️ 免责声明
本站内容均由 AI 基于公开知识辅助生成,仅供学习参考,请勿直接引用作为依据。作者不对信息的准确性、完整性及适用性作保证,亦不对因使用本站内容产生的任何损失承担责任。