1. KSM 技术概述
1.1 什么是 KSM
KSM(Kernel Same-page Merging) 是 Linux 内核提供的一种内存去重技术,最早在 2.6.32 版本中合入主线。它允许内核将多个进程或虚拟机中内容完全相同的物理页面合并为一个写时复制(Copy-on-Write, CoW)页面,从而消除冗余副本,降低宿主机的内存占用。
KSM 最初由 Red Hat 为 KVM 虚拟化场景开发,现已广泛应用于虚拟化、容器化及内存密集型计算环境。其核心思想是:扫描匿名内存页,识别内容相同的页面,合并为只读共享页,并在写入时触发 CoW 分离。
关键指标: 在典型虚拟化部署中,KSM 可节省 20%–60% 的物理内存,具体收益取决于虚拟机操作系统与工作负载的相似度。
1.2 KSM 工作原理
KSM 的工作流程分为四个阶段:注册 → 扫描 → 比较 → 合并。内核通过两个红黑树(stable tree 和 unstable tree)管理已合并与待比较的页面。
- 注册(Registration): 进程通过
madvise(MADV_MERGEABLE)系统调用将虚拟内存区域标记为可合并。只有显式注册的页面才会被 KSM 扫描。 - 扫描(Scanning): 内核线程
ksmd周期性地遍历已注册的页面,计算每页的校验和(checksum)作为快速比较依据。 - 比较(Comparison): 校验和相同的页面进入逐字节比较阶段,确认内容是否完全一致。通过 unstable tree 暂存待验证的候选页面。
- 合并(Merging): 内容完全一致的页面被合并为一个物理页,原页面的页表项指向共享页,并标记为 CoW。合并后的页面移入 stable tree 以加速后续匹配。
注意: KSM 只合并匿名页(anonymous pages),不处理文件映射页(file-backed pages)。共享内存(如 tmpfs)中的页面是否可合并取决于其映射方式。
1.3 KSM 在虚拟化场景中的核心价值
在虚拟化环境中,同一宿主机上运行的多台虚拟机往往使用相同的操作系统、库文件和应用堆栈,导致大量内存页面内容重复。KSM 通过合并这些重复页面,带来以下核心收益:
| 价值维度 | 具体表现 | 典型收益 |
|---|---|---|
| 内存超分 | 宿主机可运行更多虚拟机,突破物理内存上限 | 超分比从 1:1 提升至 1:2–1:4 |
| 成本降低 | 减少物理内存采购需求,降低 TCO | 每台宿主机节省 16–64 GB |
| 启动密度 | 相同物理内存下支持更多并发实例 | 密度提升 30%–80% |
| 缓存友好 | 共享页减少 TLB 缺失和 cache miss | 部分场景访存延迟降低 5%–15% |
权衡: KSM 合并会引入 CPU 扫描开销和 CoW 页面故障(page fault)延迟。在延迟敏感型负载中,需谨慎配置扫描频率与合并阈值,避免性能抖动。
1.4 KSM 在内存去重场景中的核心价值
除虚拟化外,KSM 在以下内存去重场景中同样发挥关键作用:
- 容器化环境: 同一宿主机上运行大量同构容器(如 Kubernetes Pod),共享基础镜像层与运行时库,KSM 可合并容器间的匿名页。
- 大数据与内存计算: Spark、Flink 等框架在 shuffle 或缓存阶段产生大量重复数据对象,KSM 可减少堆外内存占用。
- 桌面虚拟化(VDI): 虚拟桌面池中操作系统与应用高度同质化,KSM 合并效果显著,单机密度可提升 2–3 倍。
- 嵌入式与边缘计算: 内存资源受限的设备上,KSM 可释放关键内存用于业务负载。
1.5 KSM 与透明大页、内存压缩的对比
KSM 常与透明大页(THP)和内存压缩(zswap/zram)混淆,三者目标不同但可协同工作:
| 技术 | 目标 | 原理 | 适用场景 |
|---|---|---|---|
| KSM | 消除跨进程重复页面 | 页面合并 + CoW | 同构虚拟机 / 容器 |
| THP | 减少页表开销 | 自动使用 2MB 大页 | 大内存工作负载 |
| zswap/zram | 压缩不活跃页面 | 内存压缩 + 回写交换 | 内存压力下的交换优化 |
协同建议: 在虚拟化宿主机上,可同时启用 KSM 和 zswap:KSM 负责跨 VM 去重,zswap 压缩剩余不活跃页,两者互补可进一步降低内存 footprint。