KSM 是什么
KSM(内核同页合并)由内核扫描进程内存中内容相同的页面,合并为一份写时复制页面,让同一宿主上多个同构虚机共享重复的内存内容,从而提升单机内存密度。它本质是用 CPU 与扫描开销换取内存:收益取决于虚机上内存内容的同质程度,多个同版本同应用的虚机效果最好。同宿混部敏感业务时,还要评估内存侧信道与合规要求。
基本信息
| 开关 | echo 1 > /sys/kernel/mm/ksm/run |
|---|---|
| 扫描参数 | pages_to_scan、sleep_millisecs |
| 观察指标 | pages_sharing / pages_shared / pages_volatile |
| 守护进程 | ksmtuned(存在时优先用它按负载调节) |
| 风险 | 共享内存带来的侧信道与合规问题需评估 |
典型使用场景
- 虚拟桌面或大量同构虚机场景,提升单机承载密度
- 测试环境里跑多台相同系统的虚机,节省内存
- 内存紧张但暂时无法扩容时做临时缓解
- 评估页合并的实际收益,决定是否长期开启
- 排查同一宿主上虚机内存使用异常时的辅助手段
开启并观察合并效果
开启并观察合并效果
systemctl enable --now ksmtuned # 优先用守护进程按负载自动调节
echo 1 > /sys/kernel/mm/ksm/run # 手动开启
echo 0 > /sys/kernel/mm/ksm/run # 关闭合并
cat /sys/kernel/mm/ksm/pages_sharing # 当前共享页数,衡量收益
cat /sys/kernel/mm/ksm/pages_to_scan # 每轮扫描页数
cat /sys/kernel/mm/ksm/sleep_millisecs # 两轮扫描间隔指标读法
| 文件 | 含义 | 读法 |
|---|---|---|
| run | 是否开启合并 | 1 为开启,0 为关闭 |
| pages_to_scan | 每轮扫描页数 | 越大收益越快,CPU 开销也越高 |
| sleep_millisecs | 扫描间隔毫秒 | 越小越激进,CPU 占用上升 |
| pages_sharing | 被共享出去的页面数 | 持续增长说明同质内容多、收益明显 |
| pages_shared | 当前用于共享的物理页数 | 结合 pages_sharing 估算节省量 |
| pages_volatile | 内容频繁变化的页 | 数值高说明合并收益不稳定 |
同宿混合敏感业务时谨慎开启:内存侧信道共享风险与合规要求需一并评估,安全等级高的场景宁可用充足内存换隔离。
省内存的首选仍是合理规格与内存气球驱动,KSM 只能合并内容相同的页面,对写密集或内容差异大的虚机几乎没有收益。