KSM:虚拟机里重复的内存页,能不能只保留一份?

TL;DR

Linux KSM 会合并内容相同的内存页,并在有人写入时通过写时复制分开。本文解释它如何节省内存,以及扫描成本何时会抵消收益。

Linux KSM 会合并内容相同的内存页,并在有人写入时通过写时复制分开。本文解释它如何节省内存,以及扫描成本何时会抵消收益。

KSM:虚拟机里重复的内存页,能不能只保留一份?

如果一台服务器同时运行许多相似的虚拟机,它们可能在内存里保存完全相同的只读内容:相同的系统库、相同的启动模板,甚至尚未改动的零填充页。Linux KSM(Kernel Samepage Merging,内核同页合并)会扫描可合并的内存页,寻找内容相同的页,并让多个进程共享一份物理页。

关键在于“内容相同”而非“用途相同”。内核不能仅凭两个地址看起来相似就合并;它会比较页面内容。合并后,共享页通常被设为写保护。当某个进程尝试修改它时,内核通过写时复制为该进程准备独立页面,这样其他共享者不会被意外改变。可把它想成图书馆里许多人先借阅同一本只读资料,某人要在上面做笔记时,再给他一份个人复印件。

节省的内存不是凭空而来。扫描本身需要 CPU 时间,跟踪可合并页面也要消耗内核资源;大量页面被频繁修改时,合并和随后拆分的开销可能抵消收益。KSM 更适合内容重复度高、共享页面相对稳定的环境,例如某些虚拟化或沙箱工作负载,而不是所有通用服务器都应该无条件开启。

还有一个容易混淆的点:KSM 不会自动扫描系统里任意进程的全部内存。应用或运行环境需要把可合并范围交给内核,并且管理员可以配置扫描速度、页数等参数。Linux 内核文档也强调,KSM 的行为和可用选项应结合具体内核与系统配置理解。安全边界方面,写时复制必须正确工作,内存共享策略也要符合租户隔离要求。

如果要评估,先观察页面重复度、扫描 CPU 成本、实际驻留内存变化,以及写入后的拆分频率。只看“合并页数量”并不能证明整体获益:如果节省少量内存却持续占用核心,或者页面很快被改写,就未必划算。应在同类负载下比较开启前后的内存峰值和响应时间,并保留关闭或调整扫描策略的方案。

KSM 展示了内存优化的一种聪明办法:既不要求应用之间提前协商,也不永久强迫它们共享可写数据,而是先合并相同页、在写入时再分开。它适合有重复数据的场景,却需要用扫描成本和写入模式来证明价值。

来源:Linux 内核文档:Kernel Samepage Merging

KEEP READING